Как обрабатывать печать и "Сохранить вывод печати как" окна браузера? - PullRequest
0 голосов
/ 03 октября 2018
  1. Мне нужно зайти на URL, войти в систему с использованием учетных данных, затем выбрать название региона и нажать кнопку «Показать», чтобы отобразить недавний счет на странице HTML (все это я сделал с помощью сценария Selenium).

  2. На этой странице есть кнопка Параметры печати .При нажатии появляется всплывающее окно печати, и мне нужно нажать OK .Но я не могу сделать это с помощью сценария AutoIt либо.enter image description here

  3. После нажатия OK открывается окно " Сохранить вывод на печать как ", гдеЯ должен ввести имя файла и нажать Сохранить .enter image description here

Эти два всплывающих окна отличаются для Firefox и Chrome.Как справиться с этим?Я попытался использовать скрипт AutoIt и вызвать его с помощью Runtime .exec (имя файла) в сценарии Selenium, но ни один из них не работает для меня.

WinWait("Print", "", 5000)

If WinExists("Print", "") Then
    Send("OK{ENTER}")
EndIf

Sleep(5000)
WinWait("Save Print Output As", "", 5000)

If WinExists("Save Print Output As", "") Then
    ControlFocus("Save Print Output As", "", "Edit1")
    Sleep(5000)
    ControlSetText("Save Print Output As", "", "Edit1", "H282")
    Sleep(5000)
    ControlClick("Save Print Output As", "", "Button2")
EndIf

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

Сводная информация об инструменте «Окно» для всплывающих окон «Печать» и «Сохранить как вывод на печать» -

Информация об окне AutoIt для печативсплывающее окно

Информация окна AutoIt «Сохранить как вывод на печать» для поля для ввода имени файла

Информация окна AutoIt «Сохранитькак «Вывод на печать» для поля сохранения

Проблема - код селена выполняется хорошо, и когда выбрана опция печати, то для обработки окна печати вызывается файл .exe, и он начинает работать в фоновом режиме.,но не работает.Выполнение останавливается после открытия окна печати. ​​

Теперь появляется новое всплывающее окно, когда имя файла вводится в «Edit1» для каждого отдельного имени файла

New Offset window is shown

Ответы [ 2 ]

0 голосов
/ 05 октября 2018
$check = True
$printClicked = False
$saveClicked = False

While($check)
    If WinExists("Print", "") Then
        Send("{ENTER}")
        $printClicked = True
    EndIf

    If WinExists("Save Print Output As", "") Then
        ControlFocus("Save Print Output As", "", "Edit1")
        Sleep(50)
        ControlSetText("Save Print Output As", "", "Edit1", "H282")
        Sleep(50)
        ControlClick("Save Print Output As", "", "Button2")
        $saveClicked = True
    EndIf
    If($printClicked = True And $saveClicked = True) Then
;~      set the $check here
        ExitLoop
    EndIf
WEnd

Если это не работает, это означает, что вы не получаете правильные элементы управления.Отправьте вывод Autoit tool

0 голосов
/ 05 октября 2018
Opt("TrayIconDebug", True)

; String in filename to replace with an incremented integer.
$sTag = "++1"

; Show custom progress window (True|False).
$bEnableProgress = True

Switch $CMDLINE[0]
    Case 0
        Exit

    Case 1
        If $CMDLINE[1] = '/?' Then
            ; Help message.
            _HelpMsg()
            Exit
        Else
            ; Assign default command line array.
            $aFilenames = $CMDLINE
        EndIf

    Case 2
        ; If not $sTag in the 1st argument, then goto the next case.
        If Not StringInStr($CMDLINE[1], $sTag) Then ContinueCase

        ; If the 2nd argument is not an integer, then goto the next case.
        If Not StringIsInt($CMDLINE[2]) Then ContinueCase

        ; Create array with filenames starting from index 1.
        Global $aFilenames[$CMDLINE[2] + 1]

        $aFilenames[0] = Int($CMDLINE[2])

        ; Find first filepath that does not exist and set an offset.
        $iOffset = 0

        For $i1 = 1 To 1000
            If Not FileExists(StringReplace($CMDLINE[1], $sTag, $i1, -1)) Then
                $iOffset = $i1 - 1
                ExitLoop
            EndIf
        Next

        ; Assign the array with filenames, replacing tag with an integer.
        For $i1 = 1 To $aFilenames[0]
            $aFilenames[$i1] = StringReplace($CMDLINE[1], $sTag, $i1 + $iOffset, -1)
        Next

    Case Else
        ; Assign default command line array.
        $aFilenames = $CMDLINE
EndSwitch

If $bEnableProgress Then
    ProgressOn(@ScriptName, 'SaveAs')
EndIf

For $i1 = 1 To $aFilenames[0]
    ; Filename to save as.
    $sSaveAsFilename = $aFilenames[$i1]

    ; Print window.
    $hPrint = WinWait("Print")
    ControlClick($hPrint, "", "OK")

    ; Progress window.
    $hProgress = WinWait("Printing")

    ; Save As window.
    $hSaveAs = WinWait("Save Print Output As")

    Do
        Sleep(500)
        ControlSetText($hSaveAs, "", "Edit1", $sSaveAsFilename)
    Until ControlGetText($hSaveAs, "", "Edit1") = $sSaveAsFilename

    Sleep(500)

    If $bEnableProgress Then
        ProgressSet(100 / $aFilenames[0] * $i1, $sSaveAsFilename)
    EndIf

    ControlClick($hSaveAs, "", "Button2")
    AdlibRegister("_ConfirmSaveAs")
    WinWaitClose($hSaveAs)
    AdlibUnRegister("_ConfirmSaveAs")

    ; Wait for the progress window to close.
    WinWaitClose($hProgress)
Next

If $bEnableProgress Then ProgressOff()

Exit

Func _ConfirmSaveAs()
    ; Handle possible msgbox to confirm overwrite.
    If WinExists("Confirm Save As") Then
        ControlClick("Confirm Save As", "", "&Yes")
    EndIf
EndFunc

Func _HelpMsg()
    ; Help message.
    MsgBox(0, @ScriptName, _
     "Automates the standard print dialog from a web browser." & @CRLF & _
     @CRLF & _
     "Syntax:" & @CRLF & _
     "  " & @ScriptName & " filepath [filepath] ..." & @CRLF & _
     "  " & @ScriptName & " filepath integer" & @CRLF & _
     @CRLF & _
     "1st syntax can pass 1 or more filepath arguments." & @CRLF & _
     @CRLF & _
     "2nd syntax replaces the tag " & $sTag & " from right side of the " & _
     "1st argument with an incremented integer (starting from 1). " & _
     "Example: test" & $sTag & ".pdf will start with test1.pdf and end " & _
     "with testN.pdf (which N is the integer set by the 2nd argument)." & @CRLF & _
     @CRLF & _
     "Tested with Firefox 63 on Windows 10.")
EndFunc

Имя файла | filepath может быть передано в качестве аргументов.Если вы хотите сохранить как 1 имя файла, тогда используйте:

scriptname.exe "C:\SaveFolder\a.pdf"

Вы также можете сделать много в том же исполнении, например:

scriptname.exe "C:\SaveFolder\a.pdf" "C:\SaveFolder\b.pdf" ...

Если вы хотите увеличить имена файлов с целым числом,то есть:

scriptname.exe "C:\SaveFolder\a++1.pdf" 3

, который ++1 будет заменен целым числом и будет обработан, как если бы это было:

scriptname.exe "C:\SaveFolder\a1.pdf" "C:\SaveFolder\a2.pdf" "C:\SaveFolder\a3.pdf"

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

Справка Msgbox может быть показана с использованием /? в качестве единственного аргумента.

Много аргументов в одном и том жевыполнение может не подходить для управления в вашем скрипте Selenium, хотя это опция.

Эти окна являются стандартными диалоговыми окнами печати, поэтому разница между Chrome и Firefox может и не быть.Окно «Печать» не то же самое, если вы печатаете из, например, из «Блокнота», поэтому окно не может считаться стандартным.

Установите $sSaveAsFilename в значение, которое будет установлено в элемент управления для редактирования «Имя файла:», в окне «Сохранить вывод на печать как».

Opt Параметр TrayIconDebug отобразит текущую строку в системном трее, в то время как курсор мыши находится над значком.Так что, если он остановится, вы можете отследить, попал ли он в ловушку.Это необязательный вызов функции.

Это было проверено на виртуальной машине Windows 10 с использованием Firefox 63. Окна отображаются медленно, поэтому на экране Edit1 проверяется правильность строки перед продолжением.В качестве альтернативы можно использовать Opt() и параметр WinWaitDelay со значением приблизительно 1000, чтобы сделать паузу после отображения окна, хотя в среднем выполнение сценария может занять больше времени.

Я добавил функцию AdlibRegister дляповторяющееся тестирование, и оно может все еще быть полезным, поскольку имя файла может бессознательно существовать, и его необходимо обработать.

Окно «Печать» в первую очередь ждут, просто чтобы остановить закрытие сценария до завершения процесса печати.Если это нежелательно, удалите соответствующий код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...