Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Ожидание появления Next скриптом. Как? (http://forum.oszone.net/showthread.php?t=198752)

Pozia 06-02-2011 16:54 1606066

Ожидание появления Next скриптом. Как?
 
Есть такой кусок скрипта который тискает по кнопкам для установки программы:

Код:

WinWait                                ('Установка ...','','')
ControlClick                        ('Установка ...','',101)

Проблема в том, что когда появляется окно 'Установка ...' то кнопка под номером 101 не активна, но скрипт все равно ее нажимает и работает дальше. А кнопка 101 становится активна через несколько секунд. Как записать этот скрипт чтобы он ждал когда кнопка 101 станет активной и лишь тогда ее нажал???
Какой либо таймер ожидания не подходит, так как время появления кнопки рандомное...

madmasles 06-02-2011 17:04 1606074

Pozia,
Попробуйте так:
Код:

;...
$hWin = WinWait('Установка ...', '', 5)
If $hWin Then
    While Not ControlCommand($hWin, '', 101, 'IsEnabled', '')
        Sleep(100)
    WEnd
    ControlClick($hWin, '', 101)
EndIf
;...


kaster 06-02-2011 17:25 1606086

madmasles, по-моему секундной паузы слишком много. мне кажется хватит и 50-100 мс

madmasles 06-02-2011 18:14 1606123

kaster,
Цитата:

Цитата Pozia
А кнопка 101 становится активна через несколько секунд. »

И зачем торопиться? :)

kaster 06-02-2011 18:30 1606138

madmasles, да, но даже если она становится активной сразу после последней проверки, то в любом случае ждать еще секунду пока настанет следующая проверка. но этом имхо. 50-100 мс проц не нагрузят.

madmasles 06-02-2011 18:55 1606159

kaster,
Конечно, Вы правы, поменял.

Bodya.N 06-02-2011 19:29 1606195

Еще вот так можно:
Код:

;Ждем активации кнопки "далее" и ...нажимаем ее
$e = ControlCommand($hWin, '', 101, 'IsEnabled')
While $e=0
$e= ControlCommand($hWin, '', 101, 'IsEnabled')
WEnd
Send("{ENTER}")


Pozia 06-02-2011 19:55 1606212

madmasles, почему то не срабатывает, думаю потому, что до того как кнопка активна ана имеет другую цифру, а после 101. Моей кнопки 101 соответствует надпись на ней &Next >. А как подправить код чтобы на эту надпись скрипт нажимал?

Bodya.N, по вашему скрипту ошибка выскакивает line -1

madmasles 06-02-2011 20:20 1606231

Цитата:

Цитата Pozia
почему то не срабатывает »

А как не срабатывает?
Может, так:
Код:

;...
$hWin = WinWait('Установка ...', '', 5)
If $hWin Then
    While 1
        If ControlCommand($hWin, '', 101, 'IsVisible', '') And _
                ControlCommand($hWin, '', 101, 'IsEnabled', '') Then ExitLoop
        Sleep(100)
    WEnd
    ControlClick($hWin, '', 101)
EndIf
;...

Или так:
Код:

;...
$hWin = WinWait('Установка ...', '', 5)
If $hWin Then
    While 1
        If StringInStr(WinGetText($hWin), 'Next') And _
                ControlCommand($hWin, '', 101, 'IsEnabled', '') Then ExitLoop
        Sleep(100)
    WEnd
    ControlClick($hWin, '', 101)
EndIf
;...


Pozia 06-02-2011 20:39 1606246

madmasles,и так не работает. скрипт просто висит в памяти. В связи с тем, что исходные данные я дал на обум, привожу сейчас точные, что дает автоит виндовз инфо:

Код:

>>>> Window <<<<
Title:        SolidWorks 2011 SP02 Setup
Class:        MsiDialogCloseClass
Position:        370, 273
Size:        539, 431
Style:        0x14CA0000
ExStyle:        0x00040100
Handle:        0x0057043A

>>>> Control <<<<
Class:        Button
Instance:        1
ClassnameNN:        Button1
Advanced (Class):        [CLASS:Button; INSTANCE:1]
ID:        41613
Text:        &Next >
Position:        336, 361
Size:        80, 26
ControlClick Coords:        30, 16
Style:        0x50032001
ExStyle:        0x00000000
Handle:        0x00030574

>>>> Mouse <<<<
Position:        739, 678
Cursor ID:        2
Color:        0xB4E1F9

>>>> StatusBar <<<<

>>>> Visible Text <<<<
&Next >
&Cancel
< &Back
&Help
The SolidWorks® Setup Wizard will install SolidWorks 2011 SP02 on your computer. To continue, click Next.
NewBinary1
Welcome to the SolidWorks 2011 SP02 Setup Wizard


>>>> Hidden Text <<<<
NOTE that the SolidWorks 2011 SP02 web download is installed on this system and will be upgraded by this installation.

может по им вы поможете лучше? нужно просто нажать кнопку Нэкст

madmasles 06-02-2011 21:28 1606268

Pozia,
А так:
Код:

$sTitle = 'SolidWorks 2011'

$iButton = 10 ;кол-во кнопок у Вас их явно меньше.
$sButtonText = 'Next'
$sID = ''
$fYes = False

$hWin = WinWait($sTitle, '', 5)
If Not $hWin Then
    MsgBox(16, 'Error', 'Нет окна ' & $sTitle)
    Exit
EndIf
$iStart = TimerInit()
While 1
    If TimerDiff($iStart) > 30000 Then ExitLoop
    For $i = 1 To $iButton
        $sID = 'Button' & $i
        If StringInStr(ControlGetText($hWin, '', $sID), $sButtonText) And _
                ControlCommand($hWin, '', $sID, 'IsEnabled', '') Then
            $fYes = True
            ExitLoop 2
        EndIf
        Sleep(100)
    Next
WEnd
If $fYes Then
    ControlClick($hWin, '', $sID)
Else
    MsgBox(16, 'Error', 'Время вышло, кнопку не нашли.')
    Exit
EndIf


Pozia 06-02-2011 21:42 1606278

madmasles, говорит время вышло, кнопку не нашли (

madmasles 06-02-2011 22:21 1606306

Pozia,
Дайте, пожалуйста, ссылку на SolidWorks 2011 SP02.

Pozia 06-02-2011 22:33 1606310

madmasles, в личку отправил

Pozia 07-02-2011 07:42 1606484

madmasles, вот сумел так кнопку нажать:
Код:

WinWait                                ('SolidWorks 2011 SP02 Setup','','')
ControlSend                        ('SolidWorks 2011 SP02 Setup','','[CLASS:Button; INSTANCE:1]','{Enter}')

Но так не интересно, ведь если окно по какой то причине будет неактивно (задел что то мышкой), то Enter будет нажат в пустоту. Если не ошибаюсь. Но если других вариантов не найдете, может хоть это приделайте к вашему последнему варианту?

kaster 07-02-2011 08:31 1606506

Pozia, ControlSend не требует активного окна. а вообще, если код
Код:

ControlSend                        ('SolidWorks 2011 SP02 Setup','','[CLASS:Button; INSTANCE:1]','{Enter}')
срабатывает, то можно долбится по нему в цикле через
Код:

$ret = ControlClick($hWin, '', '[CLASS:Button; INSTANCE:1]')
пока $ret не вернет 1. хотя, возможно, что отправка нажатия в неактивную кнопку считается успехом. надо проверять

Pozia 07-02-2011 08:59 1606515

kaster, а точный код можете написать? А то я не силен как. А методом тыка много времени уходит... И вечером попробую.

kaster 07-02-2011 10:21 1606561

в силу ОС, сам проверить не могу. пишу по памяти
Код:

Do
    $ret = ControlClick($hWin, '', '[CLASS:Button; INSTANCE:1]')
    Sleep(100)
Until $ret

надо проверить что возвращает ControlClick по неактивной кнопке. Если 1, то не сработает. Но, могу посоветовать в коде от madmasles вместо поиска кнопки сразу использовать нужный.
Код:

$sTitle = 'SolidWorks 2011'
$sID = '[CLASS:Button; INSTANCE:1]'
$hWin = WinWait($sTitle, '', 5)
$fYes = 0
If Not $hWin Then
    MsgBox(16, 'Error', 'Нет окна ' & $sTitle)
    Exit
EndIf
$iStart = TimerInit()
While TimerDiff($iStart) < 30000
    If ControlCommand($hWin, '',  $sID, 'IsEnabled', '') Then
        $fYes = 1
        ExitLoop
    EndIf
    Sleep(100)
WEnd
If $fYes Then
    ControlClick($hWin, '', $sID)
Else
    MsgBox(16, 'Error', 'Время вышло, кнопку не нашли.')
    Exit
EndIf


Pozia 07-02-2011 19:10 1607035

kaster, вот такие ошибки выскакивают

kaster 07-02-2011 20:57 1607132

Pozia, по поводу первой ошибки, это была конструкция, не готовый код. но пока оставим его.
а вот по второму, в спешке удалил лишнюю строку. поправил код. попробуй проверить теперь.

Pozia 07-02-2011 22:02 1607179

kaster, говорит, что кнопка не нашлась (

kaster, хм... тут какой то msi инсталятор кривой... Ща запустил его, подождал пока появится кнопка, и запустил скрипт:
Код:

WinWait                                ('SolidWorks 2011 SP02 Setup','','')
ControlClick                        ('SolidWorks 2011 SP02 Setup', '', 1)

и не сработал... хотя, как я понимаю должен!
Почему автоит не цепляется за окно инсталятора? может быть такое что у меня инсталятор автоит старый? у меня v3. Есть новее?

Если дело не в автоите тогда почему окно не цепляется? Может быть это какой либо защитой разработчика софта?

kaster 08-02-2011 06:36 1607358

Код:

ControlClick                        ('SolidWorks 2011 SP02 Setup', '', 1)
это наврядли сработает. не указан идентификатор кнопки. но вообще, вот такое
Цитата:

Цитата Pozia
Может быть это какой либо защитой разработчика софта? »

вполне может быть. например это реализовано в инсталляторе *KAV.
Цитата:

Цитата Pozia
у меня v3. Есть новее? »

у всех v.3. но надо смотреть на последующие цифры. последний релиз - 3.3.6.1

mariolast 09-02-2011 11:42 1608331

Простите за вопрос, а оно все это надо? Если открыть файлик StartSWInstall.hta то там есть такая строчка для запуска
cmd=""".\sldim\sldIM.exe"" /adminclient /new /source "".\AdminDirector.xml"" /norunsw "
Этого разве не достаточно?

Запустить батником например так
start /wait sldim\sldIM.exe /adminclient /new /source ".\AdminDirector.xml" /norunsw

Pozia 18-02-2011 10:38 1615967

Цитата:

Цитата mariolast
start /wait sldim\sldIM.exe /adminclient /new /source ".\AdminDirector.xml" /norunsw »

именно на таком способе после долгих тестов и остановился


Время: 05:05.

Время: 05:05.
© OSzone.net 2001-