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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM