引言
上一篇文章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自动化提供程序通过在元素上定义属性来支持过滤,包括 IsControlElementProperty
和 IsContentElementProperty
属性。
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自动化测试执行起来应该是没问题的,但是一些自定义控件,或者复杂操作流程的,可能就需要费些脑筋了,费脑筋了还不一定能搞定。
搞搞看吧。
参考链接