金玄 发表于 2015-5-14 15:41:30

[已解决]补充网页中alert/confirm确定等的另类解决办法

本帖最后由 金玄 于 2015-5-14 15:42 编辑

原文链接:网页中alert/confirm确定等的另类解决办法

最近想解决单位办公网上一个很繁琐的工作,所以想到AUTOIT,但是碰到网页alert弹出框,总不能很好的实现自动确定。后找到上面文章(2011年的)提供了一个清晰的解决思路。现在想补充一下,由于原文无法回复,所以另开一贴。先看原文代码:WinWaitActive("来自网页的消息","建议在WAN口参数修改后重新启动路由器。")
If WinActive("来自网页的消息","建议在WAN口参数修改后重新启动路由器。") Then
    Send("{ENTER}")
endif 原文代码看来是操作路由器的,修改后发现实际使用中,有时alert窗口并非激活状态,所以弹出窗口一直显示,而关闭程序则一直等待,直到我手动激活alert窗口才会运行关闭(我开着SCITE编辑器,通过F5运行的)。

我认为是主程序执行到alert处暂停了,然后激活了SCITE编辑器,并未激活alert窗口,所以事先启动的关闭程序则一直等待。达不到想要的效果。下面把完善一下,放到一个函数中:; 关闭指定标题、窗口文本、控件ID的窗口
; $sTitile string [可选参数]窗口标题,默认为空
; $sText string [可选参数]窗口文本,默认为空
; $nID int [可选参数]控件ID,默认为空
Func Close($sTitle = "", $sText = "", $nID = 0)
        Opt("WinTitleMatchMode", 4)
        If "" = $sTitle Then $sTitle = "" ; alert弹出的窗口,标题均为“来自网页的消息”,我用窗口信息工具查看,发现类名为 #32770。
        Local $hWnd = WinWait($sTitle, $sText, 10)
        If 0 <> $hWnd Then
                WinActivate($sTitle, $sText)
                ControlSend($sTitle, $sText, $nID, "{SPACE}")
        EndIf
EndFunc主要步骤:
1、等待alert窗口的出现,10秒不出现则超时,不做任何操作。
2、alert出现后,激活它。
3、在alert窗口上发送 空格 键单击 确定 按钮。

再加一点代码,让它实现命令行接受 窗口标题,窗口文本,控件ID信息。使之能够适应更多的场景。其中命令行的1-3参数分别为,接受高级窗口描述:
参数1:窗口标题
参数2:窗口文本
参数3:控件ID

Close.au3代码如下:; 启动后关闭10秒内网页alert窗口一次
; Version 0.0.1

; 关闭指定标题、窗口文本、控件ID的窗口
; $sTitile string [可选参数]窗口标题,默认为空
; $sText string [可选参数]窗口文本,默认为空
; $nID int [可选参数]控件ID,默认为空
Func Close($sTitle = "", $sText = "", $nID = 0)
        Opt("WinTitleMatchMode", 4)
        If "" = $sTitle Then $sTitle = ""
        Local $hWnd = WinWait($sTitle, $sText, 10)
        If 0 <> $hWnd Then
                WinActivate($sTitle, $sText)
                ControlSend($sTitle, $sText, $nID, "{SPACE}")
        EndIf
EndFunc


Func main()
        Local $sTitle = "", $sText = "", $nID = 0
        If 0 < $CmdLine Then
                $sTitle = $CmdLine
        EndIf
        If 2 == $CmdLine Then
                $sText = $CmdLine
        EndIf
        If 3 == $CmdLine Then
                $nID = Int($CmdLine)
        EndIf
        Close($sTitle, $sText, $nID)
EndFunc


main()在主程序的 alert弹出前,执行下面代码(假设与主程序同一目录):ShellExecute("Close.au3")附件同以上代码一样,只是有人愿意捐钱的(因为有时想下载的代码,发现我的金钱不够),可以下载附件。

金玄 发表于 2015-5-15 11:10:13

发现mian函数中读取参数有问题。
main函数部分:Func main()
        Local $sTitle = "", $sText = "", $nID = 0
        If 0 < $CmdLine Then
                $sTitle = $CmdLine
        EndIf
        If 1 < $CmdLine Then
                $sText = $CmdLine
        EndIf
        If 2 < $CmdLine Then
                $nID = Int($CmdLine)
        EndIf
        Close($sTitle, $sText, $nID)
EndFunc附件重新上传。

nwnuchem 发表于 2015-11-8 23:12:07

很不错的实例!我的原方案中用了多线程,先执行长按回车键Enter.exe程序,再访问有alert的网页,基本上可以,但是偶尔会停留在alert上,而且会跟当前任务强焦点,体验不是很好。改用此方案,效果很好,可以静默运行,对用户没有干扰。非常好!!!

金玄 发表于 2017-4-12 13:48:05

谢谢你能反馈使用效果:)
页: [1]
查看完整版本: [已解决]补充网页中alert/confirm确定等的另类解决办法