開源自己用python封裝的一個Windows GUI(UI Automation)自動化工具,支持MFC,Windows Forms,WPF,Metro,Qt


首先,大家可以看下這個鏈接 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,所以不支持自動化,要想支持自動化,必須程序作者修改源碼支持。
 
        
 

 

 

 

 

 

 。


免責聲明!

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



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