UIAutomation識別UI元素

MS UI Automation(Microsoft User Interface Automation:UIA)是隨.net framework3.0一起發布的,雖然在如今這個幾乎每天都有各種新名詞、新技術出來的所謂的21世紀,它顯得已經有些過時了。前些日子,正好一個項目,可以用到它,又重新整理了一下:


什么是MS UI Automation

MS UI Automation是MSAA技術的一個替代品:即讓控件和應用程序具有更好的可達性(accessible),關于軟件的可達性,具體大家可參考一本<<Engineering Software for Accessibility>>的書,該書結合MS UIA,講述了如何在軟件開發的整個生命周期中,讓軟件具備可達性。回到MS UIA,簡單來講,它就是幾個dll,提供了一套API和Interface,及其相應的模式,讓軟件的開發者遵循該模式去實現相應的interface,從而軟件的使用者(不僅僅是客戶,還包括例如測試人員想編寫一些自動化測試代碼來完成程序相關的業務邏輯)能更好的使用該軟件。

UI Automation是Microsoft .NET 3.0框架下提供的一種用于自動化測試的技術,是在MSAA基礎上建立的,MSAA就是Microsoft Active Accessibility。UI Automation在某些方面超過了MSAA,UI自動化提供了Windows Vista中,微軟Windows XP的全部功能,和Windows Server 2003。

在UI Automation中,所有的窗體、控件都表現為一個AutomationElement,?AutomationElement?中包含此控件或窗體的屬性,在實現自動化的過程中,我們通過其相關屬性進行對控件自動化操作。對于UI用戶界面來說,所有顯示在桌面上的UI,其實際是一個UI Tree,根節點是desktop。我們可以使用UI Spy或者是SPY++來獲得Window和Control的相關信息。在UI Automation里,根節點表示為AutomationElemnet.RootElement.?通過根節點,我們可以通過窗體或控件的Process Id、Process Name或者Window Name找到相應的子AutomationElement,例如Dialog、Button、?TextBox、Checkbox等標準控件,通過控件所對應的Pattern進行相關的操作。

UI Automation structure

?

如下圖所示:



1.?在服務端由UIAutomationProvider.dll和UIAutomationTypes.dll提供。

???? 2.?在客戶端由UIAutomationClient.dll和UIAutomationTypes.dll提供。

???? 3.?UIAutomationCore.dll為UI自動化的核心部分,負責Server端和Client端的交互。

???? 4.?UIAUtomationClientSideProvides.dll為客戶端程序提供自動化支持。

Summary

??? 本文主要簡單介紹了UI Automation相關結構以及核心庫。

?

?

Open Source code

?

??? Github:?https://github.com/cumtkangyi/ATP

?

使用UI Automation實現自動化測試 --工具使用

當前項目進行三個多月了,好久也沒有寫日志了;空下點時間,補寫下N久沒寫的日志

介紹下兩個工具

我本人正常使用的UISpy.exe工具和inspect.exe工具

這是UISPY工具使用的圖,正常使用到的幾個屬性

這里重點說一下微軟件的UI Automation中的重要類型是AutomationElement

?

圖上的文本元素可通過AutomationElement,上級類型來獲取子節點中的窗體或控件 ,也可以根據類型獲取

如圖所示:我們通過UIspy工具找到相應的控件名稱,就可以用以下語法和屬性獲取到窗體或控件

            AutomationElement ControlTypeComboBox = grdClassBook.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ComboBox));AutomationElement cellElement = ControlTypeComboBox.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.AutomationIdProperty, "ListBox"));

在UI Automation中有如下幾個重要屬性:

  1. AutomationIdProperty: 通過AutomationId來查找AutomationElement。
  2. NameProperty:通過控件的Name屬性來查找AutomationElement。
  3. ControlType:通過控件的類型來查找AutomationElement
  4. AutomationId: 唯一地標識自動化元素,將其與同級相區分。
  5. Name:? WPF 按鈕的Content 屬性、Win32 按鈕的Caption 屬性以及 HTML 圖像的ALT 屬性都映射到 UI 自動化視圖中的同一個屬性Name

說明 :

AutomationElement 是微軟指定的類型 
PropertyCondition類是用來對相關屬性進行條件匹配,在控件樹中查找控件時,可以通過最佳匹配來找到相應的控件。

?

?

有時UISPY工具有的地方獲取不到窗體或控件元素

所以我有時會用inspect.exe工具;自己設置下屬性,跟隨鼠標,也能把控件元素指定出來

如圖:

也能找到相應的元素屬性,我比較推薦這個工具,因為這個工具是深度獲取元素,本人在win7下面感覺這個工具比UISPY工具要快得多。

比較簡單的抓圖解釋。。。自己日志記錄,如有不同意見的歡迎拍磚。

?

?

public void InvokeAutomationElement(AutomationElement automationElement) { var invokePattern = automationElement.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern; invokePattern.Invoke(); }

鼠標事件

#define WM_MOUSEFIRST 0x0200
#define WM_MOUSEMOVE 0x0200
#define WM_LBUTTONDOWN 0x0201
#define WM_LBUTTONUP 0x0202
#define WM_LBUTTONDBLCLK 0x0203
#define WM_RBUTTONDOWN 0x0204
#define WM_RBUTTONUP 0x0205
#define WM_RBUTTONDBLCLK 0x0206
#define WM_MBUTTONDOWN 0x0207
#define WM_MBUTTONUP 0x0208
#define WM_MBUTTONDBLCLK 0x0209

Winuser.h文件里面

?

?

?

?

截取整個桌面

[c-sharp] view plain copy
public?static?Image?Cut()??
{??
????Rectangle?rc?=?Screen.PrimaryScreen.Bounds;??
????int?iWidth?=?rc.Width;??
????int?iHeight?=?rc.Height;??
????Image?myImage?=?new?Bitmap(iWidth,?iHeight);??
????Graphics.FromImage(myImage).CopyFromScreen(new?System.Drawing.Point(0,?0),?new?System.Drawing.Point(0,?0),?new?System.Drawing.Size(iWidth,?iHeight));??
????return?myImage;??
}??
?

截取一個Rectangle.

[c-sharp] view plain copy
public?static?Image?Cut(Rectangle?rect)??
????????{??
????????????Rectangle?rc?=?rect;??
????????????int?iWidth?=?rc.Width;??
????????????int?iHeight?=?rc.Height;??
????????????Image?myImage?=?new?Bitmap(iWidth,?iHeight);??
????????????Graphics.FromImage(myImage).CopyFromScreen(rc.Location,?new?System.Drawing.Point(0,?0),?new?System.Drawing.Size(iWidth,?iHeight));??
????????????return?myImage;??
????????}??
截取 x,y 點 weight,height

[c-sharp] view plain copy
public?static?Image?Cut(int?X,?int?Y,?int?Width,?int?Height)??
{??
????Rectangle?rc?=?new?Rectangle(X,?Y,?Width,?Height);??
????int?iWidth?=?rc.Width;??
????int?iHeight?=?rc.Height;??
????Image?myImage?=?new?Bitmap(iWidth,?iHeight);??
????Graphics.FromImage(myImage).CopyFromScreen(rc.Location,?new?System.Drawing.Point(0,?0),?new?System.Drawing.Size(iWidth,?iHeight));??
????return?myImage;??
}

?

?

http://www.cnblogs.com/kangyi/archive/2009/09/08/1549411.html

http://blog.csdn.net/ffeiffei/article/details/6637418

http://blog.csdn.net/vbic0673/article/details/6089375

https://msdn.microsoft.com/zh-cn/library/ms606775(v=vs.100).aspx

http://www.cnblogs.com/Luouy/p/4204319.html

http://stackoverflow.com/questions/4908906/c-sharp-raise-an-event-when-a-new-process-starts

http://stackoverflow.com/questions/31813622/invoke-on-click-on-a-button-using-ui-automation-with-no-invokepattern-or-clickab

http://stackoverflow.com/questions/10105396/given-an-automation-element-how-do-i-simulate-a-single-left-click-on-it

https://msdn.microsoft.com/en-us/library/ms747211%28v=vs.110%29.aspx

?

轉載于:https://www.cnblogs.com/micro-chen/p/6169373.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371848.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371848.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371848.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++第一個Demo】---控制臺RPG游戲3【登陸菜單樹】

【登陸系統--樹結構】 1 首先我這里設計&#xff0c;由一個基類MainMenu構建樹結構&#xff0c;并實現控制臺上菜單之間的切換和返回操作 1 #ifndef _UI_BASE_H_2 #define _UI_BASE_H_3 4 #include <string>5 #include <vector>6 #include"..//Marco.h"7…

不存在_施文忠 | ”存在“與“不存在”——巴蜀文明概論

海德格爾有句名言&#xff1a;“存在者存在&#xff0c;不存在者不存在&#xff01;”四川&#xff0c;一個偉大的存在&#xff0c;偏偏存在于四川的口頭禪卻是“不存在”。在不存在中追求存在&#xff0c;在存在中擺脫存在。六月白鹿鎮&#xff0c;書院學習了《李白與海德格爾…

Spring和JSF集成:異常處理

大多數JSF開發人員都會熟悉“發生錯誤”頁面&#xff0c;當在他們的代碼某處引發意外異常時&#xff0c;該頁面就會顯示。 該頁面在開發時確實很有用&#xff0c;但對于生產應用程序通常不是您想要的。 通常&#xff0c;在用庫存JSF替換此頁面時&#xff0c;您有兩種選擇。 您可…

Altium 原理圖出現元件“Extra Pin…in Normal of part ”警告的解決方法

轉載于&#xff1a; http://blog.csdn.net/idoming/article/details/45575627 使用Altium Designer的時候編譯完后&#xff0c;只關注過錯誤沒有關注過警告&#xff0c;現在認真排查一下有哪些警告。 正在進行的項目原理圖編譯完成后提示標題中的警告信息。經過在網上搜索&…

XidianOJ 1087 浪漫的V8

題目描述 V8為了討女朋友開心&#xff0c;給lx承包大活后面那個水塘。為了籌集資金&#xff0c;V8偷偷地溜進了一座古墓&#xff0c;發現在他面前有金光閃閃的若干小箱子&#xff0c;里面全都是金粉&#xff0c;作為橫行于各種#&#xffe5;&場所的V8來說&#xff0c;辨別不…

curl php 模擬來源_php 使用curl模擬ip和來源進行訪問的實現方法

對于限制了ip和來源的網站&#xff0c;使用正常的訪問方式是無法訪問的。本文將介紹一種方法&#xff0c;使用php的curl類實現模擬ip和來源&#xff0c;訪問那些限制了ip和來源的網站。1.設置頁面限制ip和來源訪問server.php$client_ip getip();$referer getreferer();$allow…

堆棧C語言實現

堆棧的抽象數據類型描述&#xff1a; 類型名稱&#xff1a; 堆棧&#xff08;Stack&#xff09;。數據對象集&#xff1a; 一個有 0 個或多個元素的又窮表。操作集&#xff1a; 長度為 max_size 的堆棧 S ∈ Stack&#xff0c; 堆棧元素 item ∈ ElementType。stack creatc_sta…

woocommerce 分類到菜單_Woocommerce商店顯示分類

我是wordpress的新手, 所以如果我輸入的語言錯誤, 請仍然為我提供幫助。我想使用woocommerce顯示具有可變產品的商店, 我希望商店鏈接登錄頁面顯示具有該類別特征圖像的商店類別。我當前的商店頁面顯示所有產品, 并分頁到其他產品頁面, 我找不到所有產品的模板。當我進入wp-adm…

JBoss BRMS 5.3 –添加了業務活動監視(BAM)報告

自從JBoss BRMS 5.3產品發布以來&#xff0c;添加了jBPM 5 BPM組件的最常見問題之一是業務活動監視&#xff08;BAM&#xff09;和報告功能。 本文將引導您完成添加過程&#xff0c;但是請注意&#xff0c;在撰寫本文時&#xff0c;這不是產品的受支持功能。 在JBoss BRMS 5.3上…

Zookeeper開源客戶端框架Curator簡介

Curator是Netflix開源的一套ZooKeeper客戶端框架. Netflix在使用ZooKeeper的過程中發現ZooKeeper自帶的客戶端太底層, 應用方在使用的時候需要自己處理很多事情, 于是在它的基礎上包裝了一下, 提供了一套更好用的客戶端框架. Netflix在用ZooKeeper的過程中遇到的問題, 我們也遇…

【樹形DP】 HDU 2196 Computer

題意&#xff1a;求節點間的最大距離 先DFS一次 記錄下 每一節點的子樹下的最大距離&#xff08;DP[ u ] [ 0 ]&#xff09;和第二大距離&#xff08;DP[ u ] [ 1 ]&#xff09; 用DP[ v ] [ 2 ] 表示由v的父節點來的最大距離 再取DP[ u ] [ 0 ] 與 DP[ u ][ 2 ] 的最值 #inclu…

適當的Java堆大小的5個技巧

確定生產系統合適的Java堆大小不是一件容易的事。 在我的Java EE企業經驗中&#xff0c;我發現由于Java堆容量和調整不足而導致的多個性能問題。 本文將為您提供5個技巧&#xff0c;這些技巧可以幫助您確定當前或新生產環境的最佳Java堆大小。 這些技巧中的一些對于預防和解決j…

pythondocumentation是什么_怎樣閱讀Python官方文檔

如何閱讀官方Python文檔的初學者,因為他們沒有相關的經驗,學習語言通常是費時且勞動密集型和效果不是很好。下面簡要介紹如何閱讀官方文件。一旦你學會快速查詢官方文件,學習效率會提高很多文檔門戶。如何閱讀API文檔中內容標準庫,如何快速找到你想要的。第一種方法是先查找索引…

數據庫過大無法導入

導SQL數據庫結構數據時&#xff0c;如果數據是批量插入的話會報錯&#xff1a;2006 - MySQL server has gone away。 解決辦法&#xff1a;找到你的mysql目錄下的my.ini配置文件&#xff0c;加入以下代碼 max_allowed_packet500M wait_timeout288000 interactive_timeout 2880…

UVa 11475 - Extend to Palindrome

題目&#xff1a;給你一個字符串&#xff0c;在後面拼接一部分使得它變成回文串&#xff0c;使得串最短。輸出這個回文串。分析&#xff1a;KMP&#xff0c;dp。這裡利用KMP算法將串和它的轉置匹配&#xff0c;看結束時匹配的長度就可以。 因為串比較長。使用KMP比較合適&#…

構建Java Web應用程序時遵循MVC的三個步驟

步驟1 做 始終通過servlet / action bean處理URL&#xff08;POST表單&#xff0c;單擊鏈接等&#xff09;&#xff0c;而不是通過JSP處理 為什么 ActionBeans&#xff08;無論某些框架調用那些類&#xff09;&#xff0c;而servlet很少是控制器 用于處理用戶輸入。 JSP是專用于…

曝光原理_泰國精戈咖啡效果反饋 作用原理曝光

我的男人才三十五六&#xff0c;兩個人就開始分開睡了&#xff0c;自從咱們在一起以來&#xff0c;咱們的感情一向很好&#xff0c;這是十分調和的。但隨著年紀的添加&#xff0c;我逐漸發現他身體闌珊的越來越兇猛&#xff0c;夫妻生活方面硬度逐漸下降&#xff0c;時間也越來…

使用junit4測試Spring

Spring 提供便捷的測試&#xff0c;非常方便整合Junit 導入 spring-test-3.2.0.RELEASE.jar ---- 提供與Junit的整合 RunWith(SpringJUnit4ClassRunner.class) // 整合 ContextConfiguration(locations"classpath:applicationContext.xml") // 加載配置public class…

EasyCriteria –使用JPA Criteria的簡便方法

今天&#xff0c;我們將看到有關此工具的信息&#xff0c;該工具使使用JPA Criteria更加容易。 使用該庫的應用程序將在JPA實現中更加簡潔&#xff0c;易于使用和可移植。 在本文的結尾&#xff0c;您將找到要下載的源代碼。 什么是標準&#xff1f; 當前是創建動態查詢的最佳…

語言模擬蒲豐問題_R語言小數定律的保險業應用:泊松分布模擬索賠次數

原文鏈接&#xff1a;拓端數據科技 / Welcome to tecdat?tecdat.cn在保險業中&#xff0c;由于分散投資&#xff0c;通常會在合法的大型投資組合中提及大數定律。在一定時期內&#xff0c;損失“可預測”。當然&#xff0c;在標準的統計假設下&#xff0c;即有限的期望值和獨立…