首先,大家可以看下這個鏈接 Windows GUI自動化測試技術的比較和展望 。
這篇文章介紹了Windows中GUI自動化的三種技術:Windows API, MSAA - Microsoft Active Accessibility, UIAutomation
用腳本語言AutoIT實現自動化就是第一種技術Windows API, 查找窗口句柄實現的。
用工具Spy++查看程序,如果Spy++能識別程序窗口中的控件就能用這種技術。
python中也有一個UI自動化測試模塊pywinauto,也是用這種技術實現的(補充:pywinauto后來也支持UIAutomation了,本人剛寫這個庫時還不支持)。
但Windows API實現的自動化不支持WPF程序、Windows 8中的Metro程序,因為它們的控件都是自繪出來的,沒有句柄的概念。
用UIAutomation實現的自動化支持微軟提供的各種界面開發框架,如Win32, MFC, Windows Forms, WPF, Metro App, IE。
另外Qt, Firefox, Chrome實現了UI Automation Provider,也支持UIAutomation.
UIAutomation的C++ API使用介紹可以參考CodeMagazine上的一篇文章
Creating UI Automation Client Applications
還有官方文檔 msdn: UI Automation Client Programmer's Guide
我就是根據這個用Python和C++對UIAutomation做了一層封裝,方便我自己的使用,可以快速開發自動化腳本。
UIAutomation支持平台包括Windows XP(SP3),Windows Vista, Windows 7, Windows 8、8.1、10。
安裝使用python uiautomation,支持Python2,Python3,x86,x64(最新版uiautomation2.0+只支持Python3)。
運行pip install uiautomation,安裝后在c:\pythonxx\scripts目錄里會有一個腳本automation.py,使用此腳本遍歷UI控件。
打開項目主頁https://github.com/yinkaisheng/Python-UIAutomation-for-Windows,並閱讀readme查看使用介紹。
運行源碼demos目錄里的操作計算器的腳本 demos\automation_calculator.py,查看一個自動化腳本運行效果。
下面通過QQ2013做下實驗(spy++獲取不到QQ窗口內的控件,可以對比一下):
然后運行最新版QQ2013, 先保持在qq登錄界面
運行cmd,cd到工具的目錄,輸入automation.py -t3回車,然后3秒內切換到qq的登錄界面
cmd窗口中就顯示了qq窗口中的控件信息
運行automation.py遍歷控件時,支持下列參數
-t int value, 延遲時間time秒,延遲指定秒數再遍歷控件,
-r, 從樹的根部(root: Desktop)遍歷,如果不指定,從當前窗口遍歷
-d, int Value, 遍歷控件樹的的深度depth,如果不指定,遍歷整個樹,和-c一起使用時,可以為負值
-f, 遍歷焦點focus控件,如果不指定,從當前窗口遍歷
-c, 遍歷光標下的控件,如果不指定,從當前窗口遍歷,如果同時指定-d, -d可以為負值,比如-d-2表示從光標下控件向上找到兩層父控件,遍歷這個父控件
-a, 獲取光標下控件及其所有祖先(ancestor)控件
-n, 顯示控件的完整name, 如果不指定,只顯示前30個字符
例子:
automation.py –t3, 3秒后遍歷當前窗口所有控件
automation.py –d2 –t3, 3秒后遍歷當前窗口前三層控件
automation.py –r –d1 –t0 -n, 0秒后遍歷root的第一層子控件,並顯示控件完整名稱
automation.py –c –t3, 3秒后遍歷鼠標光標下面的控件信息
automation.py –c –t3 -d-2, 3秒后遍歷鼠標光標下面的控件向上兩層的父控件
下面是在Windows 8中運行automation.py –r –d1 –t0的例子, 如下圖
在UIAutomation中控件樹的根節點是 桌面Desktop, 上面的命令輸入了了 -r(root)參數,就從根節點枚舉窗口,參數-d1,只枚舉桌面的第一層子控件。
在Windows 8中,如果要查看Metro App的控件信息,必須當前窗口要在Metro界面才能枚舉,如果Metro App被切換到后台,則獲取不到它的控件。
先運行automation.py -t5, 在5秒內切換到Metro App, 等待幾秒鍾,查看cmd,就能看到Metro App的控件信息。
automation.py同時會把顯示的信息寫入到文件@AutomaitonLog.txt,方便查看。
登錄QQ2013,再一次枚舉它的窗口,如下圖,uiautomation遍歷出了聯系人信息
更多使用介紹,請參考GitHub
https://github.com/yinkaisheng/Python-Automation-for-Windows
另外很多人問我遇到一些軟件不能用UIAutomation自動化,在此說明下不能支持的原因:
UIAutomation的工作原理是:
當你用UIAutomation操作程序時,UIAutomation會給程序發送WM_GETOBJECT消息,
如果程序處理WM_GETOBJECT消息,實現UI Automation Provider,並調用函數
UiaReturnRawElementProvider(HWND hwnd,WPARAM wparam,LPARAM lparam,IRawElementProviderSimple *el),
此程序就支持UIAutomation。
IRawElementProviderSimple就是UI Automation Provider,包含了控件的各種信息,如Name,ClassName,ContorlType,坐標...
UIAutomation根據程序返回的IRawElementProviderSimple,就能遍歷程序的控件,得到控件各種屬性,進行自動化操作。
所以如果你發現UIAutomation不能識別一些程序內的控件或部分不支持,這並不是UIAutomation的問題,
是程序作者沒有處理WM_GETOBJECT或沒有實現UIAutomation Provider,或者故意不想支持UIAutomation。
很多DirectUI程序都沒有實現UIAutomation Provider,所以不支持自動化,要想支持自動化,必須程序作者修改源碼支持。
。