Как продолжить сценарий, если не загружается всплывающее окно аутентификации или введены неверные учетные данные? - PullRequest
0 голосов
/ 02 апреля 2020

Я автоматизирую веб-страницу, используя Selenium, для которой я получаю всплывающее окно аутентификации Windows. Поскольку Selenium не может справиться с этим, я использую AutoIt. Он работает нормально, но:

  1. Если я сверну всплывающее окно, AutoIt не найдет его. Как выйти из AutoIt, когда его нет?

  2. Когда я использую WinExists(), он не вводит идентификатор пользователя и пароль и застревает во всплывающем окне. Код вводит учетные данные, когда я удаляю функцию Winexists().

WinWaitActive("[CLASS:Intermediate D3D Window; INSTANCE:1]", "", "10")

If WinExists("[CLASS:Intermediate D3D Window; INSTANCE:1]") Then

    Send("userid")
    Send("{TAB}")
    Send("password")
    Send("{ENTER}")

EndIf

1 Ответ

0 голосов
/ 02 апреля 2020
$sTitle = "[CLASS:Intermediate D3D Window]"

If WinWait($sTitle, "", 10) Then

    If SendKeepActive($sTitle) Then
        Send("userid")
        Send("{TAB}")
        Send("password")
        Send("{ENTER}")
    EndIf
EndIf

Существуют различные варианты восстановления окна. SendKeepActive, вероятно, является хорошим выбором, если вы работаете с Send, поскольку он пытается сохранить окно активным для каждого вызова Send. Чтобы продолжить код, просто добавьте больше кода после последнего EndIf. Я удалил INSTANCE:1 для заголовка окна, так как заголовки не имеют свойства экземпляра, которое я знаю, и оно, кажется, игнорируется в моем тестировании. При необходимости измените заголовок.

Ниже приведен пример кода с использованием различных параметров. Я проверял это на Firefox с этой страницей, загруженной и отображенной Измените заголовок, если это необходимо. Send('{ALT}') должен быть безопасен как Send тест, поскольку он просто отображает строку меню. Сообщения о событиях записываются на консоль, чтобы не прерывать автоматизацию.

ConsoleWrite('Start' & @CRLF)

$sTitle = 'automation - How to continue script'

If WinWait($sTitle, '', 10) Then

    _WinMin($sTitle)

    ; Option 1. SendKeepActive restores the window and tries to keep it active for each Send.
    If SendKeepActive($sTitle) Then
        ConsoleWrite('SendKeepActive' & @CRLF)
        Send('{ALT}')
    EndIf

    _WinMin($sTitle)

    ; Option 2. WinActivate restores once.
    If WinActivate($sTitle) Then
        ConsoleWrite('WinActivate' & @CRLF)
    EndIf

    _WinMin($sTitle)

    ; Option 3. WinSetState can restore and WinActivate makes the window active.
    If WinSetState($sTitle, '', @SW_RESTORE) Then
        ConsoleWrite('@SW_RESTORE')

        Sleep(1000)

        If WinActivate($sTitle) Then
            ConsoleWrite('...WinActivate')
        EndIf

        ConsoleWrite(@CRLF)
    EndIf

    _WinMin($sTitle)
EndIf

ConsoleWrite('Done' & @CRLF)


Func _WinMin($sTitle, $iSleep = 3000)
    ; Minimize window for testing.
    Sleep($iSleep)
    WinSetState($sTitle, '', @SW_MINIMIZE)
    Sleep($iSleep)
EndFunc

Таким образом, у вас есть другие варианты, если исходный код не работает должным образом.

Ссылки:

...