2016-03-09 5 views
-2

У меня есть дескриптор ($browser_handle) окна веб-браузера («firefox»), доступный в моем сценарии AutoIt.AutoIt Подождите, пока окно браузера не будет видно, как ожидается.

Я хотел бы выполнить некоторые нажатия клавиш, когда я знаю, что окно браузера Firefox открыто и видно на моем экране, так что я могу принести его фокусировку с помощью -

WinActivate($browser_handle) 

или

WinWaitActive($browser_handle) 

Чтобы убедиться, что окно виден до того, как я попытаюсь сфокусировать его, у меня есть цикл while, который ждет, пока не будет видно состояние дескриптора окна (2).

While (Not BitAND(WinGetState($browser_handle), 2)) WEnd //until window visible 

Если я использую Sleep(5000) функцию перед циклом в то время как я не возникло никаких проблем.

Если я не использую произвольную функцию Sleep в своем сценарии, условие цикла While никогда не становится true и превращается в бесконечный цикл.

Когда я попытался проверить, что возвращаемое значение WinGetState($browser_handle), когда нет Sleep функции,

Остался , даже если браузер виден и становится после закрытия окна браузера.

Я не могу понять, почему WinGetState возвращаемое значение никогда не становится (видимый), даже если браузер виден, когда нет Sleep функции.

Это тестовый код, который может воспроизвести проблему -

#include <Constants.au3> 
Local $browser_name = 'C:\Program Files (x86)\Internet Explorer\iexplore.exe' 
Run($browser_name) 

ProcessWait('iexplore.exe') 

Local $browsers = ProcessList('iexplore.exe') 

Local $pid = $browsers[1][1]; 

_WinActiveByPID($pid) 

Local $sText = WinGetTitle("[ACTIVE]") 

; Display the window title. 
MsgBox($MB_SYSTEMMODAL, "", $sText) 

Func _WinActiveByPID($pid) ;False to WinActivate, True to just see if it's active 
Local $aWL = WinList() 
For $iCC = 1 To $aWL[0][0] 
     If ($aWL[$iCC][0] <> '') And _ 
      (WinGetProcess($aWL[$iCC][1]) = $pid) Then 
       While (Not BitAND(WinGetState($aWL[$iCC][1]), 2)) 
        MsgBox($MB_SYSTEMMODAL, "", WinGetState($aWL[$iCC][1])) 
       WEnd 
       WinWait($aWL[$iCC][1]) 
       WinActivate($aWL[$iCC][1]) 
       WinWaitActive($aWL[$iCC][1]) 
       Return 1 
     EndIf 
Next 
Return SetError(2, 0, 0) 
EndFunc 

Примечание:

  1. WinWait не работает в этой ситуации, если вы видите пример в ссылке есть Sleep после WinWait, эта функция возвращается, даже если окно скрыто.

  2. Окно браузера в моем исходном скрипте не запускается с использованием Run, это программа Java, которая открывает браузер. Я знаю, что метод Run возвращает PID браузера, который я могу использовать для решения этой проблемы, но поскольку он начинается с Java, я должен использовать ProcessList для получения PID браузера.

Пожалуйста, дайте мне знать, как я могу заставить это работать.

Thanks

+1

Показать полный сценарий. – user2530266

+0

Пожалуйста, найдите код, который может воспроизвести проблему. –

ответ

0

У вас есть слишком сложная задача без причины. Позволь мне показать тебе.

Local $browser_name = 'C:\Program Files (x86)\Internet Explorer\iexplore.exe' 
Run($browser_name) 

ProcessWait('iexplore.exe') 
Sleep(500)  ; because ProcessWait will exit when the process is created not when the window is visible. If your computer is slow you will have an problem 

Local $BrowsersHWND = WinList() 
Local $hBrowserHandle[2] 

For $i = 0 To $BrowsersHWND[0][0] -1 
    If StringInStr($BrowsersHWND[$i][0], "Internet Explorer") Then 
     $hBrowserHandle[0] = $BrowsersHWND[$i][0] ;title 
     $hBrowserHandle[1] = $BrowsersHWND[$i][1] ;handle 
     ExitLoop 
    EndIf 
Next 

If $hBrowserHandle[0] = "" Or $hBrowserHandle[1] = "" Then Exit MsgBox(0, 0, "Internet Explorer not found") 

Local $hState = WinGetState($hBrowserHandle[0]) 
Local $sVisibleStates[24] = [2, 3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 34, 35, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47] ;visible states 
Local $hCheck = False 
For $j = 0 To UBound($sVisibleStates) -1 
    If $hState = $sVisibleStates[$j] Then 
     ConsoleWrite("Window state(visisble): " & $hState & @LF) 
     $hCheck = True 
     ExitLoop 
    EndIf 
Next 

If $hCheck = False Then 
    ConsoleWrite("Activating: " & $hBrowserHandle[0] & @LF) 
    WinActivate($hBrowserHandle[0]) 
EndIf 

Я добавил все случаи состояний, в которых будет видно ваше окно. WinWait не активирует ни одного окна, и я рекомендую никогда не использовать его. Это может заморозить скрипт навсегда без причины. Я не буду объяснять, почему, потому что это будут страницы, но избегать этого. Также избегайте использования WinWaitActive. По аналогичным причинам. У вас слишком много проблем в коде, поэтому я полностью его изменил. Не стоит объяснять это.

0

Я думаю, что проблема не обязательно связана с кодом, но, возможно, с логикой. Я мог бы быть способ покинуть базу здесь, но, возможно, мы не должны искать в состояние 2, но что-то ближе к 15.

Образец блокнотом:

$WIN_STATE_EXISTS (1) = Window exists 
$WIN_STATE_VISIBLE (2) = Window is visible 
$WIN_STATE_ENABLED (4) = Window is enabled 
$WIN_STATE_ACTIVE (8) = Window is active 

окно, которое является активным (8), включен (4), видимый (2) и существует (1), будет иметь состояние в окнах 15.

; Look for notepad and display WindowState number 
if WinExists("[Class:Notepad]") Then 
    MsgBox($MB_SYSTEMMODAL, "", "Found") 

    WinActivate("[Class:Notepad]") 
    $WinState = WinGetState("[Class:Notepad]") 
    MsgBox($MB_SYSTEMMODAL, "", $WinState) 
EndIf