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命令了,不過也是不得已才用。
