UIA介绍
[翻译自MSDN:https://msdn.microsoft.com/en-us/library/ms747327(v=vs.110).aspx]
Microsoft UI Automation是Microsoft Windows的新的辅助功能框架,在支持Windows Presentation Foundation(WPF)的所有操作系统上都可用。
UI Automation对桌面上大多数用户界面(UI)元素提供可编程访问,使得像屏幕阅读器这样的辅助产品能够向用户提供UI信息,并通过非标准输入的方式操作UI。 UI自动化还允许自动测试脚本与UI交互。
因为,UI Automation core 掩盖(没找到更好的词--统一)了不同UI框架的差异,保证了使用UI Automation的客户端应用能够在不同的框架上都能正常工作。例如,WPF按钮的Content属性,Win32按钮的Caption属性和HTML图像的ALT属性都在UI自动视图中映射到单个属性Name。
【翻译一下上面的话-摘自博客:http://blog.csdn.net/ffeiffei/article/details/6637418】
MS UI Automation是MSAA技术的一个替代品:即让控件和应用程序具有更好的可达性(accessible),关于软件的可达性,具体大家可参考一本<>的书,该书结合MS UIA,讲述了如何在软件开发的整个生命周期中,让软件具备可达性。回到MS UIA,简单来讲,它就是几个dll,提供了一套API和Interface,及其相应的模式,让软件的开发者遵循该模式去实现相应的interface,从而软件的使用者(不仅仅是客户,还包括例如测试人员想编写一些自动化测试代码来完成程序相关的业务逻辑)能更好的使用该软件。
和原来的MSAA相比较:UIA重新设计了一套架构,无论是对传统的winform,还是新的wpf,定义了一套统一的模型;其API的使用也相对更简单;同时,和.net framework 3.0一起,也有个UISpy的工具,能辅助大家来使用UIA。
UIA架构
如下表所示,UIA主要包括一下四个组件:
【为了更好的理解这些组件,下面的内容摘自博客:http://blog.csdn.net/ffeiffei/article/details/6637418】
MS UIA明确定义了两个role:UIA Provider即软件本身,主要是软件的开发人员依据相应的模式去实现相关的interface, UIA Client即自动化脚本和相关的辅助技术应用,从测试人员的角度出发,主要是调用相应的API去实现自动化测试脚本。
UIA Provider: 开发人员确定控件行为并实现对应的UIA control pattern,对于标准控件而言,默认是支持UIA的,而对于自定义的控件,需要实现该控件的行为对应于UIA所定义的interface。
UIA Client:相对而言,UIA Client则简单了很多,只需调用相关的UIA API去完成自动化测试脚本。
UIA主要有4个DLL:UIAutomationProvider.dll,定义了各种行为的interface,例如,假设有个自定义的控件,开发人员觉得它需要支持Dock行为,就需要实现IDockProvider接口。UIAutomaitonClient.dll,定义了各种控件模式,以及一些用来支持更好的定位控件的辅助条件搜索类。UIAutomationCore.dll则是用来支持UIA provider和client之间的通信的。UIAutomationClientssideProviders.dll则主要是用来支持传统的winform的标准控件的。其关系可参考下图:
从软件开发者的角度来讲,有两种方式去使用UIA:第一,对于自定义的控件,按照provider api 的标准来实现,能够是使得自定义控件能够支持UIA(开发角度);第二,使用UIA core或者UIA client来编写自动化程序,对UI元素进行操作(测试或者辅助技术开发角度)。
UIA之Tree Model
在UIA中,程序UI的每一个部分都被认为是一个AutomationElement类,他们是一个树状的结构,Desktop被认为是每个windows based app的UIA树状图的根,从类的定义中,我们也可以看到一个AutomationElement类中有一个static的RootElement属性。
该树的结构中,一共有3中View Model,分别为Raw View, Control View和Content View。Raw View提供的信息最多,也是其他view的基础,最贴近于程序本身的编程结构;Control View是Raw View的子集,它最贴近于最终用户所能感知的UI结构,但是它不包含不能和用户相互交互的一些UI,例如listview的header,toolbar等等。而Content View则是Control View的一个子集,它只包含能和用户直接交互真实信息的控件,比如接受键盘输入的Textbox,选择不同值的Combobox;而诸如lable等控件则不会包含在其中。大家可以打开UISpy,针对某个application,看看3个view有什么不同,这样会有一个比较直观的认识。
UIA之Control Pattern
UIA大概一共定义了38种pattern,代表了常用的控件行为,他们也会提供一些具体的功能性的属性。对于UIA Provider来说,所做的事情就是定义控件相关的行为,找到该行为对应的模式,并实现该模式;对于client而言,即访问相关的方法和属性,来实现自动化。如某个控件需要有ValuePattern,则provider和client相对应的则为:
UIA之Properties
每个property都由一个数字和名字来标识,provider用数字ID来确定属性请求;而client则用AutomationProperty类获取具体的某一属性的内容。
UIA之Events
UIA是采用订阅模型,而不是以前的广播事件模型。定义了四种事件类型:Property change,Element action,Structure change和Global desktop change。