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

 

posted @ 2013-08-23 15:29  chenpassion  阅读(10433)  评论(1编辑  收藏  举报