標籤:tail log pac 按鈕 enter 替代 螢幕 details hit
原文地址:http://www.51testing.com/html/16/n-170116.html
以前寫過一篇跟UI自動化 測 試 有關的技術,談到了一個自動化測試 工具必備的幾個功能,而且也提到了Windows 平台自動化測試載入器所基於的一些技術。下邊就說 一下這些技術的比較和展望,同時也包含了一些糾結……
Windows API
識 別視窗:需要通過FindWindow和EnumWindows來尋找到視窗控制代碼,然後再調用其它 API(GetWindowText,GetWindowRect, GetWindowLong…)來擷取視窗屬性,以此來找到想要的控制項(視窗)
操作視窗和擷取屬性:通過SetWindowText和GetWindowText來操作控制項上顯示的文字,通過 SetForegroundWindow設定頂層視窗,GetForegroundWindow擷取當前的頂層視窗,類似的還有 GetActiveWindow和SetActiveWindow。其 它 操作就不一一列舉了……從理論上來說,通過Windows API和Windows Message可以完成對大部分視窗(控制項也是視窗,一起都是視窗)的操作,也可以擷取部分控制項的部分屬性。但是缺點和優點也比較明顯:
優點:就是看起來很高深很強大很底層,對標準Windows的控制項支援還不錯。
缺點:底層意味著複雜,意味著需要多層的封裝,意味著 開發效率低下,也意味著對Windows API的完全依賴。如果碰到一個非標準(自訂控制項),用這種方式實現的自動化工具基本上完全束手無策,即使有Team Dev的支援也很難完成自動化。當然了, 算座標,甚至用全域座標來做也可以做,但這是野蠻做法,自動化測試的代碼非常不穩定,維護和分析結果的成本也很高。
總而言之,言而總 之,沒有哪個自動化測試載入器完全用Windows API來實現……當然了,也不是說Windows API就沒有用了,基本上所有的自動化工具都會或多或少,或直接或間接的調到Windows API,也沒人敢說他不調一個Windows API就能做自動化測試載入器的,最起碼滑鼠鍵盤訊息的類比他就沒法弄……
MSAA - Microsoft Active Accessibility
MSAA在1997年在Windows 95中就已經包含的技術,也許你沒有聽說過,但是在所有的標準控制項中,都實現了MSAA的介面,在微 軟 所有的作業系統 中都整合了MSAA的組件,在這裡,我就不討論 MSAA的曆史和相關技術了,就囉嗦一點點感慨:MSAA天生就不是設計給自動化測試的,它存在的意義在於提供一套介面,讓開發人員可以方便的給殘疾人開 發可以使用的軟體,比如讀屏程式(滑鼠移動到按鈕的時候,可以發出聲音,輔助視力障礙的人操作電腦),從而實現微軟將電腦普及到每一個家庭的夢想。
下面進入正題,雖然MSAA不是設計給自動化測試的,但是現有的所有自動化測試載入器都是基於或者部分基於MSAA來實現的。MSAA很多時候直接把它叫 做IAccessible,它本身是一個COM組件,最主要是實現了IAccessible的介面,它提供了一些方法,通過這些方法,可以擷取控制項更詳細 的資訊,也可以通過一些方法對控制項進行簡單的操作(DoDefaultAction)。有興趣的,可以參考Microsoft Active Accessibility
優點:比起Windows API來說,使用者只需要跟IAccessible打交道,通過這個介面能獲得的控制項資訊相對豐富很多,基本操作也不需要通過Windows Message的方式來實現。另外一個比較大的優點就是,自訂控制項的支援,當然了,並不是說開發寫一個自訂控制項,這個控制項就可以通過MSAA來識別, 而是說當開發人員在實現自訂控制項的時候,可以實現IAccessible的介面,並且通過這個介面,把一些的屬性和操作暴露出來,測試人員就可以將這個 控制項當作標準控制項,並通過MSAA來自動化。看起來麻煩了點,但是最起碼對自動化自訂控制項提供了可能。
缺點:天生不足,MSAA從來 就不是給自動化測試設計的,所以也不會考慮自動化測試的需求,擷取到的控制項資訊比Windows API多,但是相對自動化測試的需求來說還是遠遠不夠,而且僅僅支援一個基本操作,其它的操作還必須通過Windows Message。另外就是微軟推出WPF以後,MSAA的局限性越加明顯(這也是因為WPF的控制項屬性更加豐富,更具定製性,更自由,用MSAA難以描 述),這也是微軟推出UIAutomation的一個的誘因。
UIAutomation
伴隨著自動化測試的應用越來越廣泛,以及WPF的發布,微軟在MSAA的基礎上,對MSAA進行封裝,重新設計並實現了 UIAutomation的類庫(.Net),微軟根據自動化測試的需求,重新實現了一套自動化體系,大家可以看下邊的圖,這個比較準確。從此自動化測試 人員迎來了更廣闊的一片藍天(雖然還飄著點小小的烏雲……),隨之也有了一些小小的糾結:
a. UIAutomation (後邊就簡稱為UIA) Vs MSAA
在UIA發布的時候,基於MSAA的自動化工具已經發展的非常成熟,比如Silktest和WinRunner… 那麼大家在開發一個自己的自動化工具的時候,應該用MSAA呢,還是UIA? 這篇文章可以給一個兩者的大概關係:UI Automation and Microsoft Active Accessibility。 按照微軟的想法和設計,UIA是要取代MSAA成為自動化測試的標準類庫,並且對WPF來說,UIA才是一等公民。從架構上來講,UIA在針對標準控制項的 時候,通過UI Automation Proxy調用了MSAA Server,基本上覆蓋了MSAA的功能:
從上邊的圖來看,從理論上來說,UIA應該是可以完全替代MSAA的,但是理想和現實往往是有很大差距的,從現實來看,UIA不能完全替代 MSAA,因為一個經典的UIA的Exception:
Exception
Time Stamp : 10/9/2009 4:37 PM
Element : Element details not available.
Name : TreeValidationException
Message : UI Automation tree navigation is broken. The parent of one of the descendants exist but the descendant is not the child of the parent
Stack Trace : at UISpy.Base.Tree.BuildTree(AutomationElement element)
at UISpy.Base.Tree.BuildTreeAndRelatedTrees(AutomationElement element)
只要用過UI Spy(UIA的一個小工具,可以看到整個UIA的控制項樹,類似AccExplorer)的基本上都會碰到,當移動滑鼠並識別某個控制項時,就有可能看到上 邊的Exception,意思是說,UIA在構造UI樹的時候失敗,滑鼠所指向的控制項不合法。但是如果你用AccExplorer來看,就完全沒有這個問 題,控制項樹的結構也比較完整。就意味著,你無法通過遍曆控制項樹來找到想要的控制項,因為控制項根本就沒有構造在UIA的控制項樹上,當然也無法對它進行任何操作 (當然,如果你用螢幕座標,然後通過AutomationElement.FromPoint來做,還是可以做的,但是請注意,你使用了螢幕座標)。在一 些小的程式上,可能不是很明顯,如果是大的項目,並且有很多自訂控制項的情況下,這個問題就會被放大,這個Exception就像一個黑洞一樣會吞掉很多 控制項,也意味著你需要在很多地方去寫代碼來繞過這個問題,同時也帶來了維護成本的大幅提高。
b. Managed vs Unmanaged
UIA的類庫是作為.Net3.0的一部分發布,這就意味著UIA只能用.Net的語言來寫,並且運行在.Net託管堆中,效能就成為其中一個 問題,雖然我不認為是很大的一個問題,一般來說自動化測試程式在等待UI反應的時間要遠遠多於這一點點的效能差異。
c. In-Process Vs Out-Process
儘管大部分的自動化測試載入器和測試代碼都是運行在進程外,但是還是有一些特殊的應用需要在進程內進行,比如在API測試中,需要進行UI互動, 為了保證API測試的自動化,就必須在進行內寫自動化指令碼。MASS是支援進程內操作的,但是UIA沒有宣布支援,在進程內使用時會有很大的效能問題,也 可能導致一些未知的問題。
d. 自訂控制項的支援
這個UIA就有先天優勢了,但也需要開發人員的支援,或者有能力的測試人員也可以自己實現,這就是UIA中的兩種Provider,一種內建, 一種外置,只要實現了Provider,自訂控制項就可以完美的支援UIA。當然了,對標準控制項來說,UIAutomation發布在Win32控制項和 WinForm的控制項之後,所以微軟就幫我們實現好了對應這些控制項的Client Provider,所以UIA對於以前的Win32和Winform控制項也是完美支援的,對WPF的標準控制項就更不用說了,天生就是帶有Provider 支援的。具體的我就不展開了,大家有興趣可以看這個:UI Automation Providers Overview
Windows Automation API 3.0
這個並不是新的自動化測試的技術,而是對UIAutomation(UIA)以及MSAA的升級,更準確的說,是UIA SP1,但名字直接跳到3.0,不知道1.0和2.0是不是指的MSAA的版本,所以大家看到這個名字以後不要暈…… 順便嘮叨一下微軟的東西,貌似某個人說過,微軟的東西都是在沒有做完的時候就發布出去,然後過一段兒時間馬上發布Service Pack,所以微軟的產品一定要等到SP1以後才能用,這個相當準確:)更詳細的介紹大家可以看這個Blog:Microsoft Windows UI Automation Blog
我在這裡就大概說一下,Windows Automation API 3.0是伴隨著Windows 7發布的,也就是說Windows 7本身就整合了Windows Automation API 3.0所以的組件和功能,再換一句話說就是Windows 7就自動化測試的支援將會更好。最主要的更新如下(與上邊UIA的幾個糾結對應):
a. 更新以後,以前Tree斷掉的問題基本上修複了,我在Windows 7上測試的結果來看,沒發現問題
b. 新增了Unmanned API和COM API,這樣直接用Native的C++也可以來開發基於UIA的自動化工具
c. 有了COM API以後,看起來In-Process也不是問題了
d. …
Windows Automation API 3.0看起來很美,基本上都解決了我上邊說的UIA的問題,讓人感覺到這個版本的UIA才是真正可以替代MSAA的東西。但是這個Windows Automation API也讓我糾結了好一陣子,差一點就想放棄UIA,重新把Code轉移到MSAA上,最主要的原因是,Windows Automation API 3.0隻支援Windows 7,不能安裝在XP/Vista上,後來經過和他們的鬥爭,有了下邊的Update: http://social.msdn.microsoft.com/Forums/en-AU/windowsaccessibilityandautomation/thread/46e83c55-47b8-4874-9222-7ce2fa58751d
所以,對Windows Automation API 3.0的當前情況就是:
如果你僅僅在Windows 7 上做自動化測試,那麼恭喜你,你可以使用Windows Automation API 3.0的所有功能,既可以用Managed code來做,也可以用Unmanaged code來做。
如果你想在Vista上用,裝了那個更新以後,應該就可以了,我沒試過……
如果你想在XP/Server2003上使用,你需要等到今年年底的某個時候(快到了:))
總之,在Windows 7上,怎麼做都行(Managed/Unmanned),在XP/Vista/Server2003上,只能用.Net,而且還會碰到有些控制項不在控制項樹 上。所以,大家跟我一起期待年底的更新吧……
windows平台UI自動化測試