PDA

Показать полную графическую версию : [решено] Ожидание появления Next скриптом. Как?


Страниц : [1] 2

Pozia
06-02-2011, 16:54
Есть такой кусок скрипта который тискает по кнопкам для установки программы:

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

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

madmasles
06-02-2011, 17:04
Pozia,
Попробуйте так:;...
$hWin = WinWait (http://www.autoitscript.com/autoit3/docs/functions/WinWait.htm)('Установка ...', '', 5)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $hWin Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) ControlCommand (http://www.autoitscript.com/autoit3/docs/functions/ControlCommand.htm)($hWin, '', 101, 'IsEnabled', '')
Sleep (http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm)(100)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
ControlClick (http://www.autoitscript.com/autoit3/docs/functions/ControlClick.htm)($hWin, '', 101)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
;...

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

madmasles
06-02-2011, 18:14
kaster,
А кнопка 101 становится активна через несколько секунд. »И зачем торопиться? :)

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

madmasles
06-02-2011, 18:55
kaster,
Конечно, Вы правы, поменял.

Bodya.N
06-02-2011, 19:29
Еще вот так можно:
;Ждем активации кнопки "далее" и ...нажимаем ее
$e = ControlCommand($hWin, '', 101, 'IsEnabled')
While $e=0
$e= ControlCommand($hWin, '', 101, 'IsEnabled')
WEnd
Send("{ENTER}")

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

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

madmasles
06-02-2011, 20:20
почему то не срабатывает »А как не срабатывает?
Может, так:;...
$hWin = WinWait (http://www.autoitscript.com/autoit3/docs/functions/WinWait.htm)('Установка ...', '', 5)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $hWin Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) ControlCommand (http://www.autoitscript.com/autoit3/docs/functions/ControlCommand.htm)($hWin, '', 101, 'IsVisible', '') And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) _
ControlCommand (http://www.autoitscript.com/autoit3/docs/functions/ControlCommand.htm)($hWin, '', 101, 'IsEnabled', '') Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
Sleep (http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm)(100)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
ControlClick (http://www.autoitscript.com/autoit3/docs/functions/ControlClick.htm)($hWin, '', 101)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
;...
Или так:;...
$hWin = WinWait (http://www.autoitscript.com/autoit3/docs/functions/WinWait.htm)('Установка ...', '', 5)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $hWin Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) StringInStr (http://www.autoitscript.com/autoit3/docs/functions/StringInStr.htm)(WinGetText (http://www.autoitscript.com/autoit3/docs/functions/WinGetText.htm)($hWin), 'Next') And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) _
ControlCommand (http://www.autoitscript.com/autoit3/docs/functions/ControlCommand.htm)($hWin, '', 101, 'IsEnabled', '') Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then) ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
Sleep (http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm)(100)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)
ControlClick (http://www.autoitscript.com/autoit3/docs/functions/ControlClick.htm)($hWin, '', 101)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
;...

Pozia
06-02-2011, 20:39
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
Pozia,
А так:$sTitle = 'SolidWorks 2011'

$iButton = 10 ;кол-во кнопок у Вас их явно меньше.
$sButtonText = 'Next'
$sID = ''
$fYes = False (http://www.autoitscript.com/autoit3/docs/keywords.htm#False)

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

Pozia
06-02-2011, 21:42
madmasles, говорит время вышло, кнопку не нашли (

madmasles
06-02-2011, 22:21
Pozia,
Дайте, пожалуйста, ссылку на SolidWorks 2011 SP02.

Pozia
06-02-2011, 22:33
madmasles, в личку отправил

Pozia
07-02-2011, 07:42
madmasles, вот сумел так кнопку нажать:
WinWait ('SolidWorks 2011 SP02 Setup','','')
ControlSend ('SolidWorks 2011 SP02 Setup','','[CLASS:Button; INSTANCE:1]','{Enter}')

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

kaster
07-02-2011, 08:31
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
kaster, а точный код можете написать? А то я не силен как. А методом тыка много времени уходит... И вечером попробую.

kaster
07-02-2011, 10:21
в силу ОС, сам проверить не могу. пишу по памяти

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
kaster, вот такие ошибки выскакивают

kaster
07-02-2011, 20:57
Pozia, по поводу первой ошибки, это была конструкция, не готовый код. но пока оставим его.
а вот по второму, в спешке удалил лишнюю строку. поправил код. попробуй проверить теперь.




© OSzone.net 2001-2012