首先,你們能夠看下這個連接 Windows GUI自動化測試技術的比較和展望 。
python
這篇文章介紹了Windows中GUI自動化的三種技術:Windows API, MSAA - Microsoft Active Accessibility, UIAutomationgit
用腳本語言AutoIT實現自動化就是第一種技術Windows API, 查找窗口句柄實現的。github
用工具Spy++查看程序,若是Spy++能識別程序窗口中的控件就能用這種技術。windows
python中也有一個UI自動化測試模塊pywinauto,也是用這種技術實現的(補充:pywinauto後來也支持UIAutomation了,本人剛寫這個庫時還不支持)。 框架
但Windows API實現的自動化不支持WPF程序、Windows 8中的Metro程序,由於它們的控件都是自繪出來的,沒有句柄的概念。ide
用UIAutomation實現的自動化支持微軟提供的各類界面開發框架,如Win32, MFC, Windows Forms, WPF, Metro App, IE。函數
另外Qt, Firefox, Chrome實現了UI Automation Provider,也支持UIAutomation.工具
UIAutomation的C++ API使用介紹能夠參考CodeMagazine上的一篇文章測試
還有官方文檔 msdn: UI Automation Client Programmer's Guideui
我就是根據這個用Python和C++對UIAutomation作了一層封裝,方便我本身的使用,能夠快速開發自動化腳本。
UIAutomation支持平臺包括Windows XP(SP3),Windows Vista, Windows 7, Windows 八、8.一、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,因此不支持自動化,要想支持自動化,必須程序做者修改源碼支持。
。