AutoIt: send 命令 VS ControlClick的使用
2008年的时候第一次接触AutoIt,当时觉得局限性太多了,就不想学,觉得把Watir,Ruby搞好就行了。
最近一段时间比较闲,发现自己对GUI的自动化操完全是短板,就把AutoIt重新拾起来了。不再考虑什么局限性了,想着,反正现在,GUI自动化操作我啥也不会,学习了解一下总是好的。
也许是先入为主的想法太严重了,我对Send,controlSend命令是有偏见的,觉得定位能力差,一旦一个界面不是在前端就定位不了。习惯性的使用controlClick, ControlCommand, ControlSetText命令。
但是当使用AutoIt脚本越来越多,我发现,AutoIt自动化操作的短板就出来了,很多GUI 元素定位不了,根本无法操作。
ControlClick虽然也能够在页面上某特定位置点击,但是也需要页面在前端,比较ControlClick与Send命令的效率,ControlClick失败的几率较高。
在有限的资源条件下,controlFocus之后,使用Send发送键盘命令,能够很好的操作很多无法操作的控件。
假设我们现在要做一件事:
获取如下图(AutoIt帮助文档)左侧展示框中所有的关键字:
该控件不是标准控件,不能使用AutoIt的标准命令获取左侧关键字列表。
以下,我们就尝试分别用controlClick 和 Send命令获取所有的关键字,代码如下:
Func mouse_click() ;获取帮助文档的窗口句柄 $handle = WinGetHandle("AutoIt Help") WinActivate($handle) ;获取帮助文档左侧关键字展示框句柄 $control_handle = ControlGetHandle($handle,"","hh_kwd_vlist1") ;用尺子量了之后,发现每个关键字的高度是12pix $i = 12 while 1 ;因为页面中有滚动条,当前页最后一个关键字所在的坐标位置(相对位置)为(50, 515),所以我把515作为比较, ;当小于515的时候是直接点击关键字,然后从关键字展示框获取关键字信息 ;当大于515的时候,需要用鼠标双击/单击(50,515)的位置,会有一个关键字冒出来,我们就把这个关键字获取了 if $i < 515 Then ControlClick($handle,"",$control_handle,"left",2,50, $i) $text = ControlGetText($handle,"", "Edit3") ConsoleWrite($text & @CRLF) $i += 12 Else $text = ControlGetText($handle,"", "Edit3") ConsoleWrite($text & @CRLF) ControlClick($handle,"",$control_handle,"left",2,50,515) $text2 = ControlGetText($handle,"", "Edit3") if $text2 = $text Then ExitLoop Else ControlClick($handle,"",$control_handle,"left",2,50,515) EndIf EndIf WEnd EndFunc ;发送键盘快捷键 Func send_key_click() $handle = WinGetHandle("AutoIt Help") WinActivate($handle) $control_handle = ControlGetHandle($handle,"","hh_kwd_vlist1") ;先把鼠标的焦点落在关键字输入框中,然后使用键盘的Tab键,把焦点移动到左侧关键字列表中 ControlFocus($handle,"", "Edit3") Send("{TAB}") ;发送一个tab键,就抓取一个关键字,直到两次 Tab 之间,再也无法获取不同的关键字为止 While 1 $text = ControlGetText($handle,"", "Edit3") ConsoleWrite($text & @CRLF) send("{DOWN}") $text2 = ControlGetText($handle,"", "Edit3") if $text2 = $text Then ExitLoop Else send("{DOWN}") ConsoleWrite($text2 & @CRLF) EndIf WEnd EndFunc mouse_click()
最后都能操作成功,把获取的关键字拷贝到Excel中,取Uniq值,然后比较一下,发现:
使用Send命令获取的关键字比ControlClick的位置点击名多的多。
再也不小看Send命令了,不过也是不得已才用。