如何处理打印和“将打印输出另存为”浏览器窗口?

时间:2018-10-03 11:10:00

标签: windows google-chrome firefox printing autoit

  1. 我必须访问一个URL,使用凭据登录,然后选择一个区域名称并单击“显示”按钮,以便显示HTML页面中的最近帐单(我使用Selenium脚本所做的所有操作)。 / p>

  2. 该页面上有一个按钮打印选项。单击后,将出现打印弹出窗口,我需要单击 OK 。但是我也无法使用AutoIt脚本来做到这一点。

    enter image description here

  3. 单击确定后,将打开“ 将打印输出另存为”窗口,在该窗口中,我必须输入文件名并单击保存。

    enter image description here

对于Firefox和Chrome,这两个弹出窗口有所不同。如何处理这些?我尝试使用AutoIt脚本,并在Selenium脚本中使用Runtime .exec(文件名)对其进行调用,但对我都不起作用。

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 Window Info of Print pop-up

AutoIt Window Info of 'Save as Print Output' for the Field to Enter File Name

AutoIt Window Info of 'Save as Print Output' for the Save Field

问题Iselenium代码执行得很好,当单击打印选项然后处理打印窗口时,将调用使用.exe文件并开始在后台运行。但不起作用。打开打印窗口后,执行将停止。

Now the New pop-up is seen , when file name is entered in 'Edit1" for each different file name

New Offset window is shown

2 个答案:

答案 0 :(得分:0)

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

filename | 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和 第二个参数必须是整数才能被识别 作为要增加的基本文件名。

可以使用/?作为唯一参数来显示帮助消息框。

同一执行中的许多参数可能不适合控制 可以选择在Selenium脚本中。

这些窗口是标准的打印对话框,因此有所不同 Chrome和Firefox之间可能没有。 如果从以下位置打印,则“打印”窗口不相同 即记事本,因此该窗口不能视为标准窗口。

$sSaveAsFilename设置为将要设置的值 进入标题为“文件名:”的编辑控件 “将打印输出另存为”。

Opt

TrayIconDebug参数将显示当前 当鼠标光标悬停在系统托盘中的行时 图标。 因此,如果它停滞了,那么您可以跟踪它是否被困住了。 这是一个可选的函数调用。

这已在Windows 10虚拟机中进行了测试 使用Firefox 63。 窗户看起来很慢 在显示中,这就是检查Edit1的原因 在继续之前正确的字符串。替代 是在使用Opt()和参数WinWaitDelay 大约1000会在窗口显示后暂停, 尽管该脚本平均可能需要更长的时间才能完成。

我添加了一个AdlibRegister函数以进行重复 测试,可能仍然有用,因为文件名可能 在不知不觉中存在需要处理的东西。

首先等待“打印”窗口, 只是为了阻止脚本在关闭之前关闭 打印进度完成。 如果不需要,请删除相关代码。

答案 1 :(得分:0)

$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工具的输出