UIA介紹
[翻譯自MSDN:https://msdn.microsoft.com/en-us/library/ms747327(v=vs.110).aspx]
Microsoft UI Automation是Microsoft Windows的新的輔助功能框架,在支持Windows Presentation Foundation(WPF)的所有操作系統(tǒng)上都可用。
UI Automation對桌面上大多數(shù)用戶界面(UI)元素提供可編程訪問,使得像屏幕閱讀器這樣的輔助產(chǎn)品能夠向用戶提供UI信息,并通過非標準輸入的方式操作UI。 UI自動化還允許自動測試腳本與UI交互。
因為,UI Automation core 掩蓋(沒找到更好的詞--統(tǒng)一)了不同UI框架的差異,保證了使用UI Automation的客戶端應用能夠在不同的框架上都能正常工作。例如,WPF按鈕的Content屬性,Win32按鈕的Caption屬性和HTML圖像的ALT屬性都在UI自動視圖中映射到單個屬性Name。
【翻譯一下上面的話-摘自博客:http://blog.csdn.net/ffeiffei/article/details/6637418】
MS UI Automation是MSAA技術的一個替代品:即讓控件和應用程序具有更好的可達性(accessible),關于軟件的可達性,具體大家可參考一本<>的書,該書結合MS UIA,講述了如何在軟件開發(fā)的整個生命周期中,讓軟件具備可達性?;氐組S UIA,簡單來講,它就是幾個dll,提供了一套API和Interface,及其相應的模式,讓軟件的開發(fā)者遵循該模式去實現(xiàn)相應的interface,從而軟件的使用者(不僅僅是客戶,還包括例如測試人員想編寫一些自動化測試代碼來完成程序相關的業(yè)務邏輯)能更好的使用該軟件。
和原來的MSAA相比較:UIA重新設計了一套架構,無論是對傳統(tǒng)的winform,還是新的wpf,定義了一套統(tǒng)一的模型;其API的使用也相對更簡單;同時,和.net framework 3.0一起,也有個UISpy的工具,能輔助大家來使用UIA。
UIA架構
如下表所示,UIA主要包括一下四個組件:
【為了更好的理解這些組件,下面的內(nèi)容摘自博客:http://blog.csdn.net/ffeiffei/article/details/6637418】
MS UIA明確定義了兩個role:UIA Provider即軟件本身,主要是軟件的開發(fā)人員依據(jù)相應的模式去實現(xiàn)相關的interface, UIA Client即自動化腳本和相關的輔助技術應用,從測試人員的角度出發(fā),主要是調(diào)用相應的API去實現(xiàn)自動化測試腳本。
UIA Provider: 開發(fā)人員確定控件行為并實現(xiàn)對應的UIA control pattern,對于標準控件而言,默認是支持UIA的,而對于自定義的控件,需要實現(xiàn)該控件的行為對應于UIA所定義的interface。
UIA Client:相對而言,UIA Client則簡單了很多,只需調(diào)用相關的UIA API去完成自動化測試腳本。

UIA主要有4個DLL:UIAutomationProvider.dll,定義了各種行為的interface,例如,假設有個自定義的控件,開發(fā)人員覺得它需要支持Dock行為,就需要實現(xiàn)IDockProvider接口。UIAutomaitonClient.dll,定義了各種控件模式,以及一些用來支持更好的定位控件的輔助條件搜索類。UIAutomationCore.dll則是用來支持UIA provider和client之間的通信的。UIAutomationClientssideProviders.dll則主要是用來支持傳統(tǒng)的winform的標準控件的。其關系可參考下圖:

從軟件開發(fā)者的角度來講,有兩種方式去使用UIA:第一,對于自定義的控件,按照provider api 的標準來實現(xiàn),能夠是使得自定義控件能夠支持UIA(開發(fā)角度);第二,使用UIA core或者UIA client來編寫自動化程序,對UI元素進行操作(測試或者輔助技術開發(fā)角度)。
UIA之Tree Model
在UIA中,程序UI的每一個部分都被認為是一個AutomationElement類,他們是一個樹狀的結構,Desktop被認為是每個windows based app的UIA樹狀圖的根,從類的定義中,我們也可以看到一個AutomationElement類中有一個static的RootElement屬性。
該樹的結構中,一共有3中View Model,分別為Raw View, Control View和Content View。Raw View提供的信息最多,也是其他view的基礎,最貼近于程序本身的編程結構;Control View是Raw View的子集,它最貼近于最終用戶所能感知的UI結構,但是它不包含不能和用戶相互交互的一些UI,例如listview的header,toolbar等等。而Content View則是Control View的一個子集,它只包含能和用戶直接交互真實信息的控件,比如接受鍵盤輸入的Textbox,選擇不同值的Combobox;而諸如lable等控件則不會包含在其中。大家可以打開UISpy,針對某個application,看看3個view有什么不同,這樣會有一個比較直觀的認識。
UIA之Control Pattern
UIA大概一共定義了38種pattern,代表了常用的控件行為,他們也會提供一些具體的功能性的屬性。對于UIA Provider來說,所做的事情就是定義控件相關的行為,找到該行為對應的模式,并實現(xiàn)該模式;對于client而言,即訪問相關的方法和屬性,來實現(xiàn)自動化。如某個控件需要有ValuePattern,則provider和client相對應的則為:
UIA之Properties
每個property都由一個數(shù)字和名字來標識,provider用數(shù)字ID來確定屬性請求;而client則用AutomationProperty類獲取具體的某一屬性的內(nèi)容。
UIA之Events
UIA是采用訂閱模型,而不是以前的廣播事件模型。定義了四種事件類型:Property change,Element action,Structure change和Global desktop change。