从UI Automation看Windows平台自动化测试原理
前言##
楼主在2013年初研究Android自动化测试的时候,就分享了几篇文章
把Android UI端的自动化测试工具原理,简单的归纳为两个核心:
- 如何获得页面控件或元素
- 如何在获得的元素上执行操作
而现在看下来这两点也适合于Windows平台和Web浏览器的自动化。本系列希望从原理上讲清楚这两个平台的自动化测试工具到底是如何实现的。
让我们先从Windows平台开始。
认识Windows UI自动化测试技术##
提到Windows客户端的自动化测试工具,我们熟知的有QTP,Ranorex,甚或者AutoIT,而这些工具多是商用工具,不开源,看不到源码,所以很难知道它的底层实现细节。 但是考虑到这些工具都是基于基于Windows平台的,它绕不开Microsoft的技术,所以我们先来看看微软的自动化技术到底是咋样的?
园子里有两篇文章不错,貌似是微软一个Team的官博有提到:
从中我们知道,在早期做自动化测试多用Win32的API和MSAA方法,而随后伴随着.NET Framework3.5, 微软推出了UI Automation,也就是UIA。一直沿用到至今。
而这里我们就是要借助UIA来看看Windows的自动化是如何实现的。
UI Automation Tree##
跟分析Android时类似,我们先看看windows 程序的所有控件的组成形式。
下图,是通过UISpy抓的我电脑上所有的控件:
显然这是一个树形结构阿,最上层是一个叫Desktop Windows的对象,在它下面是几个打开的应用程序,Calcuator,浏览器(显示Google搜索),Notepad,Microsoft Visual Studio等,注意下右边标红色的下划线的AutomationElement
,这个表示当前选中的元素的属性,如果我们点开每一个程序,及其下面的控件,会发现每个控件都写着AutomationElement
,难道是说每个控件都是AutomationElement
嘛?
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
那有了对象,如何在对象上触发动作呢?
UI Automation Control Patterns##
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
UI Automation 总结##
我们上面针对自动化测试的核心原理,着重总结了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来看它的实现。。。
敬请期待##
后续计划
- 下一篇让我们从源码级看看Selenium是如何实现Web自动化的。
*** 童鞋,如果觉得本文还算用心,还算有用,何不点个赞呢(⊙o⊙)? ***
Contact me ?
Email: jinsdu@outlook.com
Blog: http://www.cnblogs.com/jinsdu/
从UI Automation看Windows平台自动化测试原理的更多相关文章
- 使用UI Automation实现自动化测试--1-4
Introduction UI Automation是Microsoft .NET 3.0框架下提供的一种用于自动化测试的技术,是在MSAA基础上建立的,MSAA就是Microsoft Active ...
- Windows GUI自动化测试技术的比较和展望
https://www.cnblogs.com/yufun/archive/2009/10/10/1580132.html [这里的自动化测试专指GUI自动化(不包含Web)] 以前写过一篇跟UI自动 ...
- 开源自己用python封装的一个Windows GUI(UI Automation)自动化工具,支持MFC,Windows Forms,WPF,Metro,Qt
首先,大家可以看下这个链接 Windows GUI自动化测试技术的比较和展望 . 这篇文章介绍了Windows中GUI自动化的三种技术:Windows API, MSAA - Microsoft Ac ...
- 使用UI Automation实现自动化测试--1
Introduction UI Automation是Microsoft .NET 3.0框架下提供的一种用于自动化测试的技术,是在MSAA基础上建立的,MSAA就是Microsoft Active ...
- 使用UI Automation实现自动化测试--5-7
使用UI Automation实现自动化测试--5 (Winfrom和WPF中弹出和关闭对话框的不同处理方式) 在使用UI Automation对Winform和WPF的程序测试中发现有一些不同的地方 ...
- windows平台发消息到非UI线程.
下面的代码是介绍如何在windows平台发消息到非UI线程. 主要是'PeekMessage || GetMessage' 这两个API的应用. 当他们被调用的时候,如果当前线程还没有消息循环,就会创 ...
- coTurn 运行在Windows平台的方法及服务与客户端运行交互流程和原理
coTurn是一个开源的STUN和TURN及ICE服务项目,只是不支持Windows.为了在window平台上使用coTurn源码,需要在windows平台下安装Cygwin环境,并编译coTurn源 ...
- 使用UI Automation实现自动化测试 --工具使用
当前项目进行三个多月了,好久也没有写日志了:空下点时间,补写下N久没写的日志 介绍下两个工具 我本人正常使用的UISpy.exe工具和inspect.exe工具 这是UISPY工具使用的图,正常使用到 ...
- 软件测试自动化之- 基于反射的UI自动化测试框架 - UI Automation Test Framework
测试自动化程序的任务 基于反射的ui测试自动化程序,要完成的6项任务: 通过某种方式从测试套件程序中运行待测程序(AUT: Applicaton Under Test),以便于两个程序之间进行通信 操 ...
随机推荐
- 违反并发性: UpdateCommand影响了预期 1 条记录中的 0 条 解决办法
本文转载:http://www.cnblogs.com/litianfei/archive/2007/08/16/858866.html UpdateCommand和DeleteCommand出现DB ...
- 也许是关于C#的一些常见误区
写这点东西主要是看到知乎上有人在讨论相关的问题,但是有不少人都在说一些不严谨,甚至是完全错误 但是流传甚广的东西,甚至是一些大神都在说,以下根据我的回答总结. 一个很常见又很低级的误区是:认为引 ...
- 获取IMEI码
核心代码: Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getDeviceId(); 1.加入权限 在manifes ...
- web服务构架
以我的理解大流量电商网站,一般构架如下: CDN 负载均衡集群 < === > 缓存服务器集群 反向代理服务器集群 web服务器集群(日志采集) < === > 缓存系统集群 ...
- android获取Mac地址和IP地址
获取Mac地址实际项目中测试了如下几种方法:(1)设备开通Wifi连接,获取到网卡的MAC地址(但是不开通wifi,这种方法获取不到Mac地址,这种方法也是网络上使用的最多的方法) //根据Wifi信 ...
- microchip PIC芯片使用方法
pickit3调试器使用: http://www.eeboard.com/evaluation/pickit3debug/1/ MPLAB环境使用: 1.代码折叠功能 2.代码补全功能 3.函数跳转功 ...
- C# 静态类和非静态类的区别
静态类和非静态类的区别 静态类: static 关键字 调用 类名.方法 在静态方法中只能访问静态成员 在静态类中只能有静态成员 在非静态类中 即可有非静态成员,也可以有静态成员 在静态 ...
- .NET 设计模式之简单工厂模式(二)
1:建立接口 namespace Factory { public interface IPerson { } } 2:建立Worker.Student来继承IPerson接口 namespace F ...
- C# CRC校验的一点感悟
今天在鼓捣一个手持操作器的时候,遇到一点问题,记录一下今天的经验包 由于之前公司产品在校验时基本上都是和校验,今天在准备用C#模拟一个古董操作器的时候,却遇到一个问题,模拟器发出的数据,主板一律不回复 ...
- 尝试封装自己的js库
学了js,用过jquery,然后想着让自己在js这一块有更深的提高,就想尝试着封装自己的js库,偶尔就添加自己想到的功能.有参考过其他大牛封装库的方法,不懂的地方也有借鉴过,但代码还是自己想,自己理解 ...