[已解决]补充网页中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")附件同以上代码一样,只是有人愿意捐钱的(因为有时想下载的代码,发现我的金钱不够),可以下载附件。
发现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附件重新上传。
很不错的实例!我的原方案中用了多线程,先执行长按回车键Enter.exe程序,再访问有alert的网页,基本上可以,但是偶尔会停留在alert上,而且会跟当前任务强焦点,体验不是很好。改用此方案,效果很好,可以静默运行,对用户没有干扰。非常好!!! 谢谢你能反馈使用效果:)
页:
[1]