樓主在2013年初研究Android自動化測試的時候,就分享了幾篇文章html
把Android UI端的自動化測試工具原理,簡單的概括爲兩個核心:windows
而如今看下來這兩點也適合於Windows平臺和Web瀏覽器的自動化。本系列但願從原理上講清楚這兩個平臺的自動化測試工具究竟是如何實現的。設計模式
讓咱們先從Windows平臺開始。瀏覽器
提到Windows客戶端的自動化測試工具,咱們熟知的有QTP,Ranorex,甚或者AutoIT,而這些工具可能是商用工具,不開源,看不到源碼,因此很難知道它的底層實現細節。 可是考慮到這些工具都是基於基於Windows平臺的,它繞不開Microsoft的技術,因此咱們先來看看微軟的自動化技術究竟是咋樣的?app
園子裏有兩篇文章不錯,貌似是微軟一個Team的官博有提到:工具
從中咱們知道,在早期作自動化測試多用Win32的API和MSAA方法,而隨後伴隨着.NET Framework3.5, 微軟推出了UI Automation,也就是UIA。一直沿用到至今。測試
而這裏咱們就是要藉助UIA來看看Windows的自動化是如何實現的。ui
跟分析Android時相似,咱們先看看windows 程序的全部控件的組成形式。
下圖,是經過UISpy抓的我電腦上全部的控件:
設計
顯然這是一個樹形結構阿,最上層是一個叫Desktop Windows的對象,在它下面是幾個打開的應用程序,Calcuator,瀏覽器(顯示Google搜索),Notepad,Microsoft Visual Studio等,注意下右邊標紅色的下劃線的AutomationElement
,這個表示當前選中的元素的屬性,若是咱們點開每個程序,及其下面的控件,會發現每一個控件都寫着AutomationElement
,難道是說每一個控件都是AutomationElement
嘛?3d
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
那有了對象,如何在對象上觸發動做呢?
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
咱們上面針對自動化測試的核心原理,着重總結了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來看它的實現。。。
後續計劃
*** 童鞋,若是以爲本文還算用心,還算有用,何不點個贊呢(⊙o⊙)? ***
Email: jinsdu@outlook.com