找回密码
 加入
搜索
查看: 4301|回复: 3

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

[复制链接]
发表于 2015-5-14 15:41:30 | 显示全部楼层 |阅读模式
本帖最后由 金玄 于 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 = "[TITLE:来自网页的消息; CLASS:#32770]" ; 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 = "[TITLE:来自网页的消息; CLASS:#32770]"
        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[0] Then
                $sTitle = $CmdLine[1]
        EndIf
        If 2 == $CmdLine[0] Then
                $sText = $CmdLine[2]
        EndIf
        If 3 == $CmdLine[0] Then
                $nID = Int($CmdLine[3])
        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[0] Then
                $sTitle = $CmdLine[1]
        EndIf
        If 1 < $CmdLine[0] Then
                $sText = $CmdLine[2]
        EndIf
        If 2 < $CmdLine[0] Then
                $nID = Int($CmdLine[3])
        EndIf
        Close($sTitle, $sText, $nID)
EndFunc
附件重新上传。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2015-11-8 23:12:07 | 显示全部楼层
很不错的实例!我的原方案中用了多线程,先执行长按回车键Enter.exe程序,再访问有alert的网页,基本上可以,但是偶尔会停留在alert上,而且会跟当前任务强焦点,体验不是很好。改用此方案,效果很好,可以静默运行,对用户没有干扰。非常好!!!
 楼主| 发表于 2017-4-12 13:48:05 | 显示全部楼层
谢谢你能反馈使用效果:)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-24 20:15 , Processed in 0.076484 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表