2011-04-12 44 views
1

我想使用Win32 :: GuiTest来测试基于InstallShield的卸载过程。我可以打开控制面板,找到应用程序,然后调用InstallShield,但是我没有做任何事情似乎让我选择安装程序中的“删除”按钮。到目前为止,我得到了:为什么我可以使用Win32 :: GuiTest在XP上驱动InstallShield而不是在Windows 7上?

sub uninstall($;$) { 
    my ($name, $force) = @_; 
    if (! defined($force)) { 
     $force=0; 
    } 

    my @windows; 
    # Control Panel window 
    my $cpwin; 
    my $w; 
    my $text; 
    # Install Shield window 
    my $iswin; 

    # Run the Control Panel (In windir, do `control appwiz.cpl`) 
    system("cd %windir% && control appwiz.cpl"); 
    sleep 1; 
    print("Opened control panel\n"); 

    # Get the Window ID of the control panel 
    # FIXME - this label is system specifie (W7) 
    @windows = FindWindowLike(undef, "Programs and Features", ""); 
    $cpwin = $windows[0]; 
    printf("Found CP window ID %x\n", $cpwin); 

    # Get the Folder View window of the control panel 
    # Find the list of applications 
    @windows = FindWindowLike($cpwin, "FolderView"); 
    $w = $windows[0]; 

    # Find program in the list 
    if (Win32::GuiTest::SelListViewItemText($w, $name) == 0) { 
     printf("Could not find '$name'.\n"); 
     return -1; 
    } 

    # Invoke the installer for by pressing [Return] 
    Win32::GuiTest::SendKeys("~"); 
    # Wait for the "initializing the wizard" window 
    @windows = Win32::GuiTest::WaitWindow("InstallShield Wizard", 5); 
    # Wait for the real installer window 
    sleep 10; 
    @windows = Win32::GuiTest::WaitWindow("InstallShield Wizard", 3); 
    $iswin = $windows[0]; 
# Win32::GuiTest::WaitWindow("Remove"); 
    printf("Found IS window ID %x\n", $iswin); 
# Win32::GuiTest::SetFocus($iswin); 

    @windows = FindWindowLike($iswin, "&Remove", "Button"); 
    my $remove = $windows[0]; 
    printf("Found remove button %x\n", $remove); 
    Win32::GuiTest::PushButton($remove); 
# Win32::GuiTest::SetFocus($remove); 
# Win32::GuiTest::SendKeys("%r"); 
# Win32::GuiTest::MouseClick("Remove",$iswin); 
# Win32::GuiTest::CheckButton($remove); 
# Win32::GuiTest::SendKeys("{DOWN}{DOWN}"); 

# Win32::GuiTest::MouseClick("Next",$iswin); 
# Win32::GuiTest::PushChildButton($iswin, "Cancel"); 

我试过的东西(注释掉,最后)都没有任何效果。

我在Windows 7上使用ActivePerl和Win32 :: GuiTest,如果有任何问题。

(成为的那种。我的Perl可能很烂。我有> 25年的经验编程,但比在Perl一个月的时间。)

+0

我转移到试图驾驶的NSIS安装。我也无法让它工作。我的同事把它用在了他真正的XP系统上,但我的W7虚拟机中有一个非启动器。 OTOH,记事本示例(http://search.cpan.org/dist/Win32-GuiTest/lib/Win32/GuiTest/Examples.pm#eg/notepad.pl)对我来说工作得很好。 – 2011-04-12 18:02:14

回答

0

,我试图以驱动安装的事实,似乎是一个红色的鲱鱼。在XP(即使在虚拟机),这工作正常。我怀疑问题在于安装程序显示对话框,而记事本提供了一个窗口,这些窗口在W7中的处理方式与XP不同。我会回到为什么W7无法正常工作,但是XP现在是我必须要做的,所以这已经足够了。

0

Win32::GuiTest::PushButton方法将按钮Text或ID作为参数,而不是窗口/控件对象。所以你根本不需要调用FindwindowLike方法。

但是Win32::GuiTest::PushButton只从前景窗口查找按钮,这可能不适合所有情况。应该使用Win32::GuiTest::PushChildButton

请试试这个方法:

#@windows = FindWindowLike($iswin, "&Remove", "Button"); 
#my $remove = $windows[0]; 
#printf("Found remove button %x\n", $remove); 
sleep 10; 
Win32::GuiTest::PushChildButton($iswin, "&Remove", 50); 
+0

感谢您的建议,但这也不起作用。 – 2011-04-14 11:50:09

+0

按下按钮之前的“睡眠10”怎么样? – 2011-04-18 02:58:04

相关问题