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.mzph.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;即有限的期望值和独立…