从UI Automation看Windows平台自动化测试原理

前言

楼主在2013年初研究Android自动化测试的时候,就分享了几篇文章html

把Android UI端的自动化测试工具原理,简单的概括为两个核心:windows

  • 如何得到页面控件或元素
  • 如何在得到的元素上执行操做

而如今看下来这两点也适合于Windows平台和Web浏览器的自动化。本系列但愿从原理上讲清楚这两个平台的自动化测试工具究竟是如何实现的。设计模式

让咱们先从Windows平台开始。浏览器

认识Windows UI自动化测试技术

提到Windows客户端的自动化测试工具,咱们熟知的有QTP,Ranorex,甚或者AutoIT,而这些工具可能是商用工具,不开源,看不到源码,因此很难知道它的底层实现细节。 可是考虑到这些工具都是基于基于Windows平台的,它绕不开Microsoft的技术,因此咱们先来看看微软的自动化技术究竟是咋样的?app

园子里有两篇文章不错,貌似是微软一个Team的官博有提到:工具

从中咱们知道,在早期作自动化测试多用Win32的API和MSAA方法,而随后伴随着.NET Framework3.5, 微软推出了UI Automation,也就是UIA。一直沿用到至今。测试

而这里咱们就是要借助UIA来看看Windows的自动化是如何实现的。ui

UI Automation Tree

跟分析Android时相似,咱们先看看windows 程序的全部控件的组成形式。
下图,是经过UISpy抓的我电脑上全部的控件:
设计

显然这是一个树形结构阿,最上层是一个叫Desktop Windows的对象,在它下面是几个打开的应用程序,Calcuator,浏览器(显示Google搜索),Notepad,Microsoft Visual Studio等,注意下右边标红色的下划线的AutomationElement,这个表示当前选中的元素的属性,若是咱们点开每个程序,及其下面的控件,会发现每一个控件都写着AutomationElement,难道是说每一个控件都是AutomationElement嘛?3d

MSDN官方文档给出了确定答案:

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还有不少,好比ExpandCollapsePatternScrollPatternTogglePattern 等。

感受就跟设计模式中的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/

相关文章
相关标签/搜索