前言##
樓主在2013年初研究Android自動化測試的時候,就分享了幾篇文章
把Android UI端的自動化測試工具原理,簡單的歸納為兩個核心:
- 如何獲得頁面控件或元素
- 如何在獲得的元素上執行操作
而現在看下來這兩點也適合於Windows平台和Web瀏覽器的自動化。本系列希望從原理上講清楚這兩個平台的自動化測試工具到底是如何實現的。
讓我們先從Windows平台開始。
認識Windows UI自動化測試技術##
提到Windows客戶端的自動化測試工具,我們熟知的有QTP,Ranorex,甚或者AutoIT,而這些工具多是商用工具,不開源,看不到源碼,所以很難知道它的底層實現細節。 但是考慮到這些工具都是基於基於Windows平台的,它繞不開Microsoft的技術,所以我們先來看看微軟的自動化技術到底是咋樣的?
園子里有兩篇文章不錯,貌似是微軟一個Team的官博有提到:
從中我們知道,在早期做自動化測試多用Win32的API和MSAA方法,而隨后伴隨着.NET Framework3.5, 微軟推出了UI Automation,也就是UIA。一直沿用到至今。
而這里我們就是要借助UIA來看看Windows的自動化是如何實現的。
UI Automation Tree##
跟分析Android時類似,我們先看看windows 程序的所有控件的組成形式。
下圖,是通過UISpy抓的我電腦上所有的控件:
顯然這是一個樹形結構阿,最上層是一個叫Desktop Windows的對象,在它下面是幾個打開的應用程序,Calcuator,瀏覽器(顯示Google搜索),Notepad,Microsoft Visual Studio等,注意下右邊標紅色的下划線的AutomationElement
,這個表示當前選中的元素的屬性,如果我們點開每一個程序,及其下面的控件,會發現每個控件都寫着AutomationElement
,難道是說每個控件都是AutomationElement
嘛?
UI Automation exposes every piece of the UI to client applications as an AutomationElement. Elements are contained in a tree structure, with the desktop as the root element.
既然每個對象都是AutomationElement,借鑒與Android的經驗,只要我們得到最上層元素的對象,就可以遍歷求得所有子元素了.
事實確實如此,AutomationElement
類提供了屬性RootElement
能夠獲得當前的Desktop元素,並且進一步的,它還提供了FindAll/FindFirst方法來獲得符合條件的所有元素,或者是第一個元素。
很容易的,我們就能得到被測對象,比如我想獲得我機器上的Calculator的AutomationElement對象:
AutomationElement _calculatorAutomationElement = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "Calculator"));
當然還有很多其他的Utility的方式來獲得對象,可以參考MSDN官方文檔:
Obtaining UI Automation Elements
那有了對象,如何在對象上觸發動作呢?
UI Automation Control Patterns##
Control Patterns就是UIA設計的全新的使用空間功能的一種方式。 比如說一個Button,只要我們用InvokePattern來調用它,,就可以直接的觸發Click的動作:
InvokePattern btnInvoke = (InvokePattern)btn.GetCurrentPattern(InvokePattern.Pattern);
btnInvoke.Invoke();
類似的Pattern還有很多,比如ExpandCollapsePattern
, ScrollPattern
, TogglePattern
等。
感覺就跟設計模式中的Command模式差不多,把所有的Actions都定義成Command,這樣只要調用者Invoke正確的Command就可以了。是不是很方便?!
詳細參見:UI Automation Control Patterns Overview
UI Automation 總結##
我們上面針對自動化測試的核心原理,着重總結了UIA是如何實現獲取元素,以及如何在元素上執行操作的,這是自動化工具的核心部分。當然圍繞核心,UIA還提供了其他一些增強功能,這里借鑒微軟博客的總結如下:
UIA定義了全新的、針對UI自動化的接口和模式。 分別是支持對UI元素進行遍歷和條件化查詢的TreeWalker/FindAll。定義了讀寫UI元素屬性的UIA Property, 包括Name、 ID、Type、ClassName、Location、 Visibility等等。定義了UI元素行為的UIA Pattern, 比如Select、Expand、Resize、 Check、Value等等。 還引入了UIA Event接口,可以讓測試程序在某些事件發生后得到通知,比如新窗口打開事件等。
但個人覺得,唯一的遺憾是,好像看不到UIA的源碼,不能再從更深的Level來看它的實現。。。
敬請期待##
后續計划
- 下一篇讓我們從源碼級看看Selenium是如何實現Web自動化的。
*** 童鞋,如果覺得本文還算用心,還算有用,何不點個贊呢(⊙o⊙)? ***
Contact me ?
Email: jinsdu@outlook.com