MSAA的全稱是Microsoft Active Accessibility。這是相似DCOM技術。技術模型是這樣的,UI程序能夠暴露出一個Interface,方便另外一個程序對其進行控制。 MSAA技術的初衷是爲了方便殘疾人使用Windows 程序。好比盲人看不到窗口,可是盲人能夠經過一個USB讀屏器鏈接到電腦上, 讀屏器經過UI程序暴露出來的這個Interface,就能夠獲取程序信息,經過盲文或者其它形式傳遞給盲人。MSAA提供瞭如此方便的功能, UI
自動化測試天然能夠借用這項技術。MSAA暴露出來的Interface叫作 IAccessible。
測試程序和目標UI程序互操做流程以下:
1.
測試程序調用Windows API: AccessibleObjectFromWindow,傳入目標UI程序HWND。
2. AccessibleObjectFromWindow函數向UI程序發送WM_GETOBJECT消息。
4.
測試程序拿到IAccessible接口,開始調用IAccessible
接口函數操做測試目標。
IAccessible接口裏面的幾個關鍵函數是:
IAccessible::get_accChild/ IAccessible::get_accParent經過這兩個函數,調用者能夠瀏覽
目標程序的窗口關係樹,定位到
UI元素。
IAccessible::accLocation/I Accessible::accHitTest讀取和分辨目標元素的屏幕位置。
IAccessible::accName/ I Accessible:: accSelect讀取元素的名字,對
UI元素進行指定的操做,好比選取Listbox裏面的某一項等等。
IAccessible::accValue 開發人員能夠自定義value屬性的實現。好比針對折線圖控件,開發人員能夠在accValue中返回折線的座標數列。
MSAA的理念 相似於test hook。 經過主動讓UI程序暴露一個接口來讓調用者控制。 在具體使用中,測試人員每每是結合MSAA和Win32 API操做,取長補短。一方面對於
UI元素豐富的屬性,好比style,鉤選狀態,是否最大化和模擬用戶輸入等,繼續採用Win32 API。 另外一方面用MSAA的優點來彌補Win32 API的一些不足,好比:
因爲MSAA有本身的get_accChild方法,使其控件樹關係並不必定要和Win32 HWNDd關係對應一致。對於自繪窗口,雖說只有一個HWND, 可是開發人員能夠經過實現IAccessible接口來實現邏輯上的層次關係。好比Excel中就能夠經過IAccessible把多個cell的子 IAccessible接口暴露給調用者。
IAccessible的實現是由開發者提供, 開發者能夠靈活地根據實際狀況決定方法的實現。好比前面提到了折線圖控件能夠返回座標數列。對於.NET WinForm,
微軟在Framework中就提供了IAccessible的默認實現,這樣在具體實現中,就能夠處理.NET動態維護HWND的細節。