Почему я могу управлять InstallShield с Win32 :: GuiTest на XP, но не на Windows 7? - PullRequest
1 голос
/ 12 апреля 2011

Я пытаюсь использовать Win32 :: GuiTest для тестирования процесса удаления на основе InstallShield. Я могу открыть панель управления, найти приложение и вызвать InstallShield, но ничего, что я делаю, кажется, не позволяет мне выбрать кнопку «Удалить» в установщике. Пока что у меня есть:

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");

Ничто из того, что я пробовал (закомментировано, в конце), похоже, не имеет никакого эффекта.

Я использую ActivePerl и Win32 :: GuiTest в Windows 7, если что-то из этого имеет значение.

(Будьте добры. Мой Perl, вероятно, отстой. У меня есть> 25-летний опыт программирования, но на Perl меньше месяца.)

Ответы [ 2 ]

0 голосов
/ 14 апреля 2011

Метод Win32::GuiTest::PushButton принимает кнопку Текст или 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 голосов
/ 14 апреля 2011

То, что я пытаюсь управлять установщиком, похоже на красную сельдь. На XP (даже в ВМ) это работает нормально. Я подозреваю, что проблема заключается в том, что установщики представляют диалоговые окна, тогда как Блокнот представляет окно, и они как-то обрабатываются в W7 иначе, чем в XP. Я вернусь к тому, почему W7 не работает, но XP - это то, что я должен сделать прямо сейчас, так что этого достаточно.

...