引言

上一篇文章UI自动化 --- 微软UI Automation中,介绍了UI Automation能够做什么,且借助 Inspect.exe 工具完成了一个模拟点击操作的Demo,文章结尾也提出了自己的一些想法,想要借助UI Automation做一个UI自动化测试平台。想法毕竟是想法,还是得落地实践,一步一步来。

本篇文章内容详细学习UI Automation 的基础知识。

UI Automation 基础

上一篇文章中提到 UIAutomation 通过五个组件实现编程访问:

  • UI Automation tree(UI自动化树)
  • UI Automation elements(UI自动化元素)
  • UI Automation properties(UI自动化属性)
  • Control patterns(控件模式)
  • UI Automation events(UI自动化事件)

接下来一一学习,以下内容翻译自微软官方文档(https://learn.microsoft.com/en-us/dotnet/framework/ui-automation/ui-automation-fundamentals)。

UI Automation tree(UI自动化树)

UI自动化树可以通过过滤来创建仅包含特定客户端相关的 AutomationElement 对象的视图。这种方法允许客户端根据其特定需求自定义通过UI自动化呈现的结构。

客户端有两种方式来自定义视图:通过作用域和过滤。作用域是定义视图的范围,从一个基本元素开始:例如,应用程序可能只想查找桌面的直接子元素,或者某个应用程序窗口的所有后代元素。过滤是定义要包含在视图中的元素类型。

UI自动化提供程序通过在元素上定义属性来支持过滤,包括 IsControlElementPropertyIsContentElementProperty 属性。

UI自动化提供了三个默认视图:原始视图控件视图内容视图

这些视图是根据执行的过滤类型定义的;任何视图的作用域由应用程序定义。此外,应用程序还可以对属性应用其他过滤器;例如,只在控件视图中包含已启用的控件。

原始视图(Raw View)

UI自动化树的原始视图是以桌面为Root的 AutomationElement 对象的完整树。原始视图紧密遵循应用程序的本机编程结构,因此是最详细的可用视图。它也是其他视图构建的基础。由于该视图依赖于底层UI框架,因此WPF按钮的原始视图将与Win32按钮的原始视图不同。

通过在不指定属性的情况下搜索元素或使用 RawViewWalker 浏览树,可以获得原始视图。

AutomationElement elementNode = TreeWalker.RawViewWalker.GetFirstChild(AutomationElement.RootElement);

控件视图(Control View)

UI自动化树的控件视图简化了辅助技术产品描述UI给终端用户并帮助终端用户与应用程序交互的任务,因为它与终端用户感知的UI结构紧密对应。

控件视图是原始视图的一个子集。它包括原始视图中的所有UI项,这些项被用户理解为可交互,或对UI中的控件的逻辑结构起作用。

对UI逻辑结构有贡献但本身不可交互的UI项例如有列表视图的标题、工具栏、菜单和状态栏。

仅用于布局或装饰目的的非交互项不会在控件视图中显示。例如,一个本身不包含任何信息,仅用于布局对话框中的控件的面板。

控件视图中可见的非交互项例如有包含信息的图形和对话框中的静态文本。

控件视图中包含的非交互项不能接收键盘焦点。

通过搜索具有 IsControlElement 属性设置为 true 的元素,或使用 ControlViewWalker 浏览树,可以获得控件视图。

AutomationElement controlViewElementNode = TreeWalker.ControlViewWalker.GetFirstChild(AutomationElement.RootElement);

内容视图(Content View)

UI自动化树的内容视图是控件视图的一个子集。

它包含传达用户界面中真实信息的UI项,包括可以接收键盘焦点的UI项以及一些不是UI项上的标签的文本。例如,下拉组合框中的值将出现在内容视图中,因为它们代表终端用户正在使用的信息。

在内容视图中,组合框和列表框都被表示为一组UI项,其中可以选择一个或多个项。

在内容视图中,一个始终处于打开状态,而另一个可以展开和折叠的事实是无关紧要的,因为它旨在显示呈现给用户的数据或内容。

通过搜索具有 IsContentElement 属性设置为 true 的元素,或使用 ContentViewWalker 浏览树,可以获得内容视图。

AutomationElement ContentViewElementNode = TreeWalker.ContentViewWalker.GetFirstChild(AutomationElement.RootElement);

UI Automation elements(UI自动化元素)

UI自动化元素可以表示各种用户界面元素,例如窗口、按钮、文本框、复选框、列表框、菜单等等。每个元素都有一个唯一的标识符,称为 AutomationID,它可以用来定位和操作元素。例如模拟用户点击、输入文本、选择选项、获取界面元素属性等。

UI Automation properties(UI自动化属性)

每个属性都由一个数字和一个名称标识。属性的名称仅用于调试和诊断。提供程序使用数字ID来标识传入的属性请求。然而,客户端应用程序只使用 AutomationProperty 来标识它们希望检索的属性,AutomationProperty 封装了数字和名称。

表示特定属性的 AutomationProperty 对象可作为各种类中的字段使用。出于安全原因,UI自动化提供程序从 Uiautomationtypes.dll 中包含的一组单独的类中获取这些对象。

根据ID分组

以下表格按包含 AutomationPropertyIDs 的类对属性进行了分类。

属性的种类 客户端从中获取 ID 提供程序从中获取 ID
所有元素共有的属性(请参阅下表) AutomationElement AutomationElementIdentifiers
停靠窗口的位置 DockPattern DockPatternIdentifiers
可展开和折叠的元素的状态 ExpandCollapsePattern ExpandCollapsePatternIdentifiers
网格中某项的属性 GridItemPattern GridItemPatternIdentifiers
网格的属性 GridPattern GridPatternIdentifiers
具有多个视图的元素的当前和支持的视图 MultipleViewPattern MultipleViewPatternIdentifiers
在一定范围的值内移动的元素(如滑块)的属性 RangeValuePattern RangeValuePatternIdentifiers
滚动窗口的属性 ScrollPattern ScrollPatternIdentifiers
可选择的某项(如列表中的某项)的状态和容器 SelectionItemPattern SelectionItemPatternIdentifiers
包含选择项的控件的属性 SelectionPattern SelectionPatternIdentifiers
表中某项的列和行标题 TableItemPattern TableItemPatternIdentifiers
表的列和行标题以及方向 TablePattern TablePatternIdentifiers
切换控件的状态 TogglePattern TogglePatternIdentifiers
可移动、旋转、或调整大小的元素的功能 TransformPattern TransformPatternIdentifiers
具有值的元素的值和读/写功能 ValuePattern ValuePatternIdentifiers
窗口的功能和状态 WindowPattern WindowPatternIdentifiers

根据类别分组

这里只列举根据标识分组,除此之外还有按显示特征分组,按元素类型分组,按交互类型分组,按对模式的支持分组等,详见微软官方文档。

属性标识符 属性访问
AutomationIdProperty AutomationId
ClassNameProperty ClassName
FrameworkIdProperty FrameworkId
LabeledByProperty LabeledBy
NameProperty Name
ProcessIdProperty ProcessId
RuntimeIdProperty GetRuntimeId
NativeWindowHandleProperty NativeWindowHandle

Control patterns(控件模式)

UI自动化使用控件模式来表示常见的控件行为。例如,您可以使用 Invoke 控件模式来处理可以调用的控件(如按钮),并使用 Scroll 控件模式来处理带有滚动条的控件(如列表框、列表视图或组合框)。由于每个控件模式代表着一个独立的功能,它们可以组合在一起描述特定控件支持的完整功能集。

控件模式支持定义控件中可用的离散功能所需的方法、属性、事件和关系。

  • UI自动化元素与其父级、子级和同级之间的关系描述了元素在UI自动化树中的结构。

  • 方法允许UI自动化客户端操作控件。

  • 属性和事件提供有关控件模式功能以及控件状态的信息。

控件模式与UI的关系类似于接口与组件对象模型(COM)对象的关系。在COM中,您可以查询对象以了解它支持哪些接口,然后使用这些接口访问功能。在UI自动化中,UI自动化客户端可以询问控件支持哪些控件模式,然后通过支持的控件模式公开的属性、方法、事件和结构与控件进行交互。例如,对于多行编辑框,UI自动化提供程序实现了 IScrollProvider。当客户端知道 AutomationElement 支持 ScrollPattern 控件模式时,它可以使用该控件模式公开的属性、方法和事件来操作控件或访问有关控件的信息。

控件模式类 提供程序接口 说明
DockPattern IDockProvider 用于可在停靠容器中停靠的控件。 例如,工具栏或工具调色板。
ExpandCollapsePattern IExpandCollapseProvider 用于可展开或折叠的控件。 例如,应用程序中的菜单项,如 “文件” 菜单。
GridPattern IGridProvider 用于支持网格功能(如调整大小和移动到指定单元格)的控件。 例如 Windows 资源管理器中的大图标视图或 Microsoft Word 中的不带标头的简单表格。
GridItemPattern IGridItemProvider 用于在网格内具有单元格的控件。 单个单元格应支持 GridItem 模式。 例如 Microsoft Windows 资源管理器详细信息视图中的每个单元格。
InvokePattern IInvokeProvider 用于可被调用的控件,如按钮。
MultipleViewPattern IMultipleViewProvider 用于可在同一组信息、数据或子级的多个表示形式之间切换的控件。 例如,在列表视图控件中,数据可用于缩略图、磁贴、图标、列表或详细信息视图。
RangeValuePattern IRangeValueProvider 用于具有一系列可应用于该控件的值的控件。 例如,包含年份的微调框控件可能具有从 1900 到 2010 的年份范围,而表示月份的另一个微调框控件则会具有从 1 到 12 的月份范围。
ScrollPattern IScrollProvider 用于可滚动的控件。 例如,一个控件其所具有的滚动条在控件的可视区域中存在的信息超过了可被显示的信息时,便处于活动状态。
ScrollItemPattern IScrollItemProvider 用于一种控件,该控件具有可滚动列表中的各个项。 例如,一个列表控件,该控件具有滚动列表中的各个项,如组合框控件。
SelectionPattern ISelectionProvider 用于选择容器控件。 例如,列表框和组合框。
SelectionItemPattern ISelectionItemProvider 用于选择容器控件中的各个项,如列表框和组合框。
TablePattern ITableProvider 用于具有网格以及标头信息的控件。 例如 Microsoft Excel 工作表。
TableItemPattern ITableItemProvider 用于表中的项。
TextPattern ITextProvider 用于可公开文本信息的编辑控件和文档。
TogglePattern IToggleProvider 用于在其中可切换状态的控件。 例如,复选框和可选中的菜单项。
TransformPattern ITransformProvider 用于可调整大小、移动和旋转的控件。 Transform 控件模式通常用于设计器、窗体、图形编辑器和绘图应用程序。
ValuePattern IValueProvider 允许客户端在不支持某个值范围的控件上获取或设置值。 例如,日期时间选择器。
WindowPattern IWindowProvider 向 Microsoft Windows 操作系统公开特定于窗口的信息(一种基本概念)。 属于窗口的控件示例是顶级应用程序窗口(Microsoft Word、Microsoft Windows 资源浏览器等)、多文档界面 (MDI)子窗口和对话框。

UI Automation events(UI自动化事件)

Microsoft UI自动化事件是屏幕阅读器和屏幕放大器等辅助技术的关键功能。这些UI自动化客户端跟踪由UI自动化提供程序触发的事件,当UI中发生某些情况时,它们使用这些信息通知终端用户。

通过允许提供程序应用程序有选择地触发事件,根据是否有客户端订阅这些事件,或者如果没有客户端监听任何事件,则可以完全不触发事件,从而提高效率。

UI 自动化事件有以下类型。更详细内容请阅读微软官方文档。

事件 说明
属性更改 当 UI 自动化元素上的某个属性或控件模式更改时引发。 例如,如果客户端需要监视应用程序的复选框控件,它可以注册来侦听 ToggleState 属性上的属性更改事件。 选中或取消选中该复选框控件时,提供程序会引发事件且客户端会采取必要的操作。
元素操作 当来自最终用户或编程活动的 UI 结果出现更改时引发;例如,单击或通过 InvokePattern 调用一个按钮。
结构更改 在 UI 自动化树的结构更改时引发。 当桌面上有新 UI 项变得可见、隐藏或删除时,结果便发生更改。
全局桌面更改 当与客户端相关的的全局操作发生时引发,例如当焦点从一个元素转换到另一个元素、或窗口关闭时。

结尾

文中只列举了部分内容,更详细内容请阅读微软官方文档,文档还是很详细的,比较难受的地方就是示例代码太少,可能需要自己发掘了。

总的来说,我觉得一些简单UI自动化测试执行起来应该是没问题的,但是一些自定义控件,或者复杂操作流程的,可能就需要费些脑筋了,费脑筋了还不一定能搞定。

搞搞看吧。

参考链接

https://learn.microsoft.com/en-us/dotnet/framework/ui-automation/using-ui-automation-for-automated-testing

UI自动化 --- UI Automation 基础详解的更多相关文章

  1. Dom探索之基础详解

    认识DOM DOM级别 注::DOM 0级标准实际并不存在,只是历史坐标系的一个参照点而已,具体的说,它指IE4.0和Netscape Navigator4.0最初支持的DHTML. 节点类型 注:1 ...

  2. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  3. javaScript基础详解(1)

    javaScript基础详解 首先讲javaScript的摆放位置:<script> 与 </script> 可以放在head和body之间,也可以body中或者head中 J ...

  4. Python学习一:序列基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...

  5. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  6. 深入浅出DOM基础——《DOM探索之基础详解篇》学习笔记

    来源于:https://github.com/jawil/blog/issues/9 之前通过深入学习DOM的相关知识,看了慕课网DOM探索之基础详解篇这个视频(在最近看第三遍的时候,准备记录一点东西 ...

  7. 三剑客基础详解(grep、sed、awk)

    目录 三剑客基础详解 三剑客之grep详解 1.通配符 2.基础正则 3.grep 讲解 4.拓展正则 5.POSIX字符类 三剑客之sed讲解 1.sed的执行流程 2.语法格式 三剑客之Awk 1 ...

  8. linux自动化交互脚本expect详解set timeout 5是 意思是在expect语句中,5s后超时,不再作出选择。

    linux自动化交互脚本expect详解  更新时间:2020年10月21日 10:13:20   作者:lendsomething     这篇文章主要介绍了linux自动化交互脚本expect的相 ...

  9. java继承基础详解

    java继承基础详解 继承是一种由已存在的类型创建一个或多个子类的机制,即在现有类的基础上构建子类. 在java中使用关键字extends表示继承关系. 基本语法结构: 访问控制符 class 子类名 ...

  10. java封装基础详解

    java封装基础详解 java的封装性即是信息隐藏,把对象的属性和行为结合成一个相同的独立单体,并尽可能地隐藏对象的内部细节. 封装的特性是对属性来讲的. 封装的目标就是要实现软件部件的"高 ...

随机推荐

  1. UnrealEngine - 网络同步入门

    1 网络同步机制 UE 提供了强大的网络同步机制: RPC :可以在本地调用,对端执行 属性同步:标记一个属性为 UPROPERTY(Replicated) 就可以自动将其修改后的值同步到客户端 移动 ...

  2. ServletContext 详解(转载)

    转载:https://www.cnblogs.com/zjdxr-up/p/7761813.html ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释 ...

  3. IIS 部署.NET CORE 项目 出现 HTTP 错误 500.19 - Internal Server Error

    当出现这个错误时是因为服务器上没有.NET CORE对应的SDK以及运行时文件,我的.NET CORE版本是2.2,下载的就是2.2对应的文件. 附上.NET CORE2.2版本的下载链接 下载 .N ...

  4. day47:Bootstrap

    什么是Bootstrap? Bootstrap是一个开源框架,是对html\css\js\jquery等的封装,用法,复制黏贴一把梭. 关于Bootstrap的一些常用网址 网址: https://w ...

  5. Kubernetes入门实践(搭建Wordpress网站)

    容器只是对单个进程的隔离和封装,实际的应用场景要求许多的应用进程互相协同工作,因此出现了容器编排,Kubernetes将集群中的计算资源定义为节点(Node),其中又划分成控制面和数据面两类,控制面是 ...

  6. API 接口主流协议有哪些?如何创建 HTTP/HTTP、WebSocket/WebSockets、TCP/UDP、gRPC、SOAP、Dubbo/HSF 等不同协议?

    API 接口协议繁多,不同的协议有着不同的使用场景.70% 互联网应用开发者日常仅会接触到最通用的 HTTP 协议,相信大家希望了解更多其他协议的信息.我们今天会给大家介绍各种 API 接口主流协议和 ...

  7. 【原型设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

    简介 原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类,同时又能保证性能. 这种模式是实现了一个原型接口,该接口用于创建当前对象的 ...

  8. OpenFec介绍

    官网: http://openfec.org/accueil.html   1.提供的编解码器 Reed-Solomon stable codec over GF(28)                ...

  9. es6 新增 set 和 map数据结构以及应用场景

    https://www.cnblogs.com/sexintercourse/p/12269580.html Set数据容器,这是一个能够存储无重复值的有序列表. 1. 创建集合 set let se ...

  10. 2022-09-05:作为国王的统治者,你有一支巫师军队听你指挥。 :给你一个下标从 0 开始的整数数组 strength , 其中 strength[i] 表示第 i 位巫师的力量值。 对于连续的一

    2022-09-05:作为国王的统治者,你有一支巫师军队听你指挥. :给你一个下标从 0 开始的整数数组 strength , 其中 strength[i] 表示第 i 位巫师的力量值. 对于连续的一 ...