百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

UI自动化 --- UI Automation 基础详解

ccwgpt 2024-10-10 04:43 67 浏览 0 评论

引言

上一篇文章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
所有元素共有的属性(请参阅下表)AutomationElementAutomationElementIdentifiers
停靠窗口的位置DockPatternDockPatternIdentifiers
可展开和折叠的元素的状态ExpandCollapsePatternExpandCollapsePatternIdentifiers
网格中某项的属性GridItemPatternGridItemPatternIdentifiers
网格的属性GridPatternGridPatternIdentifiers
具有多个视图的元素的当前和支持的视图MultipleViewPatternMultipleViewPatternIdentifiers
在一定范围的值内移动的元素(如滑块)的属性RangeValuePatternRangeValuePatternIdentifiers
滚动窗口的属性ScrollPatternScrollPatternIdentifiers
可选择的某项(如列表中的某项)的状态和容器SelectionItemPatternSelectionItemPatternIdentifiers
包含选择项的控件的属性SelectionPatternSelectionPatternIdentifiers
表中某项的列和行标题TableItemPatternTableItemPatternIdentifiers
表的列和行标题以及方向TablePatternTablePatternIdentifiers
切换控件的状态TogglePatternTogglePatternIdentifiers
可移动、旋转、或调整大小的元素的功能TransformPatternTransformPatternIdentifiers
具有值的元素的值和读/写功能ValuePatternValuePatternIdentifiers
窗口的功能和状态WindowPatternWindowPatternIdentifiers

根据类别分组

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

属性标识符属性访问
AutomationIdPropertyAutomationId
ClassNamePropertyClassName
FrameworkIdPropertyFrameworkId
LabeledByPropertyLabeledBy
NamePropertyName
ProcessIdPropertyProcessId
RuntimeIdPropertyGetRuntimeId
NativeWindowHandlePropertyNativeWindowHandle

Control patterns(控件模式)

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

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

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

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

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

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

控件模式类提供程序接口说明
DockPatternIDockProvider用于可在停靠容器中停靠的控件。 例如,工具栏或工具调色板。
ExpandCollapsePatternIExpandCollapseProvider用于可展开或折叠的控件。 例如,应用程序中的菜单项,如 “文件” 菜单。
GridPatternIGridProvider用于支持网格功能(如调整大小和移动到指定单元格)的控件。 例如 Windows 资源管理器中的大图标视图或 Microsoft Word 中的不带标头的简单表格。
GridItemPatternIGridItemProvider用于在网格内具有单元格的控件。 单个单元格应支持 GridItem 模式。 例如 Microsoft Windows 资源管理器详细信息视图中的每个单元格。
InvokePatternIInvokeProvider用于可被调用的控件,如按钮。
MultipleViewPatternIMultipleViewProvider用于可在同一组信息、数据或子级的多个表示形式之间切换的控件。 例如,在列表视图控件中,数据可用于缩略图、磁贴、图标、列表或详细信息视图。
RangeValuePatternIRangeValueProvider用于具有一系列可应用于该控件的值的控件。 例如,包含年份的微调框控件可能具有从 1900 到 2010 的年份范围,而表示月份的另一个微调框控件则会具有从 1 到 12 的月份范围。
ScrollPatternIScrollProvider用于可滚动的控件。 例如,一个控件其所具有的滚动条在控件的可视区域中存在的信息超过了可被显示的信息时,便处于活动状态。
ScrollItemPatternIScrollItemProvider用于一种控件,该控件具有可滚动列表中的各个项。 例如,一个列表控件,该控件具有滚动列表中的各个项,如组合框控件。
SelectionPatternISelectionProvider用于选择容器控件。 例如,列表框和组合框。
SelectionItemPatternISelectionItemProvider用于选择容器控件中的各个项,如列表框和组合框。
TablePatternITableProvider用于具有网格以及标头信息的控件。 例如 Microsoft Excel 工作表。
TableItemPatternITableItemProvider用于表中的项。
TextPatternITextProvider用于可公开文本信息的编辑控件和文档。
TogglePatternIToggleProvider用于在其中可切换状态的控件。 例如,复选框和可选中的菜单项。
TransformPatternITransformProvider用于可调整大小、移动和旋转的控件。 Transform 控件模式通常用于设计器、窗体、图形编辑器和绘图应用程序。
ValuePatternIValueProvider允许客户端在不支持某个值范围的控件上获取或设置值。 例如,日期时间选择器。
WindowPatternIWindowProvider向 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

?


相关推荐

滨州维修服务部“一区一策”强服务

今年以来,胜利油田地面工程维修中心滨州维修服务部探索实施“一区一策”服务模式,持续拓展新技术应用场景,以优质的服务、先进的技术,助力解决管理区各类维修难题。服务部坚持问题导向,常态化对服务范围内的13...

谷歌A2A协议和MCP协议有什么区别?A2A和MCP的差异是什么?

在人工智能的快速发展中,如何实现AI模型与外部系统的高效协作成为关键问题。谷歌主导的A2A协议(Agent-to-AgentProtocol)和Anthropic公司提出的MCP协议(ModelC...

谷歌大脑用架构搜索发现更好的特征金字塔结构,超越Mask-RCNN等

【新智元导读】谷歌大脑的研究人员发表最新成果,他们采用神经结构搜索发现了一种新的特征金字塔结构NAS-FPN,可实现比MaskR-CNN、FPN、SSD更快更好的目标检测。目前用于目标检测的最先...

一文彻底搞懂谷歌的Agent2Agent(A2A)协议

前段时间,相信大家都被谷歌发布的Agent2Agent开源协议刷屏了,简称A2A。谷歌官方也表示,A2A是在MCP之后的补充,也就是MCP可以强化大模型/Agent的能力,但每个大模型/Agent互为...

谷歌提出创新神经记忆架构,突破Transformer长上下文限制

让AI模型拥有人类的记忆能力一直是学界关注的重要课题。传统的深度学习模型虽然在许多任务上取得了显著成效,但在处理需要长期记忆的任务时往往力不从心。就像人类可以轻松记住数天前看过的文章重点,但目前的...

不懂设计?AI助力,人人都能成为UI设计师!

最近公司UI资源十分紧张,急需要通过AI来解决UI人员不足问题,我在网上发现了几款AI应用非常适合用来进行UI设计。以下是一些目前非常流行且功能强大的工具,它们能够提高UI设计效率,并帮助设计师创造出...

速来!手把手教你用AI完成UI界面设计

晨星技术说晨星技术小课堂第二季谭同学-联想晨星用户体验设计师-【晨星小课堂】讲师通过简单、清晰的语言描述就能够用几十秒自动生成一组可编辑的UI界面,AIGC对于UI设计师而言已经逐步发展成了帮助我们...

「分享」一端录制,多端使用的便捷 UI 自动化测试工具,开源

一、项目介绍Recorder是一款UI录制和回归测试工具,用于录制浏览器页面UI的操作。通过UIRecorder的录制功能,可以在自测的同时,完成测试过程的录制,生成JavaScr...

APP自动化测试系列之Appium介绍及运行原理

在面试APP自动化时,有的面试官可能会问Appium的运行原理,以下介绍Appium运行原理。Appium介绍Appium概念Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序...

【推荐】一个基于 SpringBoot 框架开发的 OA 办公自动化系统

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍oasys是一个基于springboot框架开发的OA办公自动化系统,旨在提高组织的日常运作和管理...

自动化实践之:从UI到接口,Playwright给你全包了!

作者:京东保险宋阳1背景在车险系统中,对接保司的数量众多。每当系统有新功能迭代后,基本上各个保司的报价流程都需要进行回归测试。由于保司数量多,回归测试的场景也会变得重复而繁琐,给测试团队带来了巨大的...

销帮帮CRM移动端UI自动化测试实践:Playwright的落地与应用

实施背景销帮帮自2015年成立以来,移动端UI自动化测试的落地举步维艰,移动端的UI自动化测试一直以来都未取得良好的落地。然而移动互联网时代,怎样落地移动端的UI自动化测试以快速稳定进行移动端的端到端...

编写自动化框架不知道该如何记录日志吗?3个方法打包呈现给你。

目录结构1.loguru介绍1.1什么是日志?程序运行过程中,难免会遇到各种报错。如果这种报错是在本地发现的,你还可以进行debug。但是如果程序已经上线了,你就不能使用debug方式了...

聊聊Python自动化脚本部署服务器全流程(详细)

来源:AirPython作者:星安果1.前言大家好,我是安果!日常编写的Python自动化程序,如果在本地运行稳定后,就可以考虑将它部署到服务器,结合定时任务完全解放双手但是,由于自动化程序与平...

「干货分享」推荐5个可以让你事半功倍的Python自动化脚本

作者:俊欣来源:关于数据分析与可视化相信大家都听说自动化流水线、自动化办公等专业术语,在尽量少的人工干预的情况下,机器就可以根据固定的程序指令来完成任务,大大提高了工作效率。今天小编来为大家介绍几个P...

取消回复欢迎 发表评论: