在AutoIt脚本中,对要操作的控件需要知道其control id ,但是对于IE浏览器中的安全控件,其id是在打开浏览器时动态生成的,每次打开浏览器,id都不一样,是动态变化的,所以要操作这种类型的控件,需要另想办法
参考:
https://www.autoitscript.com/forum/topic/157706-how-can-i-retrieve-a-dynamic-control-id/#comment-1143379
建立AutoIT script文件,任意命名,写入以下内容:
;通过WinGetClassList函数获取窗体中的所有控件名,然后,在IE浏览器中控件动态标识符是以ATL开头的,找这类控件即可
#include
#include
$oIE = _IECreate ("https://pbsz.ebank.cmbchina.com/CmbBank_GenShell/UI/GenShellPC/Login/Login.aspx","0,1,1,0")
Local $hWnd =WinWait("[ClASS:IEFrame]","",10)
Local $sClassList = WinGetClassList($hWnd)
Local $controClasss
$aClassList = StringSplit($sClassList,@CRLF,2)
For $i=0 To UBound($aClassList) -1
IfStringInStr(String($aClassList[$i]),"ATL")Then
$controlClass = String($aClassList[$i])
ExitLoop
EndIf
Next
Local $ClassNameNN_Account =$controlClass&2 ;控件识别码,用于向控件传递参数
Local $ClassNameNN_Password =$controlClass&1
MsgBox($MB_SYSTEMMODAL, "",$ClassNameNN_Account)
ControlSend($hWnd,"",$ClassNameNN_Account, "123456")
ControlSend($hWnd,"",$ClassNameNN_Password, "111111")
Sleep(5000)
WinClose($hWnd)
以上代码存在的问题:
填入的信息不完整,比如账号只能填2345,而没有把1填进去,随机发生的,解决办法:在脚本中加入sleep语句,让其睡个3秒钟
总结:
1、分清楚Windows下的两个概念:窗口和控件,在Autoit中窗口需要使用Win**函数进行操作,控件使用control**函数进行操作,例如:
Local $hWnd = WinWait("[ClASS:IEFrame]","",10)
Local $sClassList = WinGetClassList($hWnd)
;之前写的Local $hWnd =WinWait("[ClASS:Internet Explorer_Server]","",10)是无法获取到信息的,因为根本就不存在ClASS:为Internet Explorer_Server的窗口,所以读不到信息。
2、使用IE和MsgBox前需要引入相关的包,否则运行时会报错
3、WinGetClassList函数式关键,它能找到当前窗口里所存在的所有class信息,而控件的class信息也在其中,于是就可以去寻找到所需要的控件id(id有一部分是固定的开头)。
4、Autoit中,变量可以转换为字符串,它可以比较两个字符变量是否=,但是无法用包含,只能调用StringInSub()函数,该函数可以传变量,也可以传字符串