获取 UI 自动化元素

本主题介绍如何获取 UI 元素的 IUIAutomationElement 接口。

IUIAutomationElementUI 自动化文档内容客户端示例应用中使用。

Root 元素

尽管可以使用方法(例如 IUIAutomation::GetFocusedElement)直接检索元素,但某些客户端应用程序需要查看元素的分层结构,称为 UI 自动化树。 此层次结构的根元素是桌面。 可以使用 IUIAutomation::GetRootElement 方法或 IUIAutomation::GetRootElementBuildCache 方法获取此元素。 这两种方法都检索 IUIAutomationElement 接口指针。 可以使用 IUIAutomationElement::FindFirstFindAll 等方法搜索后代元素。

注意

通常,应尝试仅获取根元素的直接子级。 搜索后代可能会循环访问数百或数千个元素。 如果尝试在较低级别上获取特定元素,应该从应用程序窗口或者从较低级别的容器中开始搜索。

 

条件

对于用于检索 UI 自动化元素的大多数技术,必须指定条件。 条件是一组条件,用于定义要检索的元素。 条件由 IUIAutomationCondition 接口表示。

最简单的条件是 true 条件,它是一个预定义对象,指定将返回搜索范围中的所有元素。 false 条件是 true 条件的反函数,它不太有用,因为使用它会导致无法找到任何元素。 可以使用 IUIAutomation::CreateTrueCondition 获取 true 条件的接口。

其他三个预定义条件(可用作 IUIAutomation 对象的属性)可以单独使用,也可以与其他条件结合使用:IUIAutomation::ContentViewConditionControlViewConditionRawViewCondition。 单独使用的 RawViewCondition 等效于 true 条件,因为它不按 IUIAutomationElement::CurrentIsControlElementCurrentIsContentElement 属性筛选元素。

其他条件是从条件对象生成的,每个条件指定属性值。 例如,属性条件可能指定元素已启用或支持特定控件模式。

可以通过调用 IUIAutomation::CreateAndConditionCreateOrConditionCreateNotCondition 和相关方法来组合使用布尔逻辑的条件。

搜索范围

使用 IUIAutomationElement::FindFirstFindAll 执行的搜索必须具有作用域和起始位置。

注意

这两种方法的任何评论也适用于 IUIAutomationElement::FindFirstBuildCacheFindAllBuildCache

 

作用域定义要搜索的起始位置周围的空间。 这可能包括元素本身、其同级、其父级、其直接子级和后代。 请注意,Find 方法不支持搜索 Microsoft UI 自动化树;也就是说,不支持搜索上级元素。

搜索范围由 TreeScope 枚举类型中的值的按位组合定义。

查找已知元素

若要查找通过名称、自动化 ID 或其他属性或属性组合标识的已知元素,最简单的方法是使用 IUIAutomationElement::FindFirst 方法。 如果要寻找的元素是应用程序窗口,则搜索的起点可以是根元素。

这种查找 UI 自动化元素的方法在自动化测试方案中最有用。

有关演示如何查找已知元素的代码示例,请参阅按名称查找元素

查找子树中的元素

若要查找满足特定条件且与已知元素相关的所有元素,可以在已知元素上调用 IUIAutomationElement::FindAll。 例如,使用此方法可从列表或菜单中检索列表项或菜单项,或标识对话框中的所有控件。

有关演示如何在子树中查找元素的代码示例,请参阅查找相关元素

浏览子树

如果你事先不知道客户端可能使用的应用程序,可以使用 IUIAutomationTreeWalker 构造所有感兴趣的元素的子树。 例如,客户端可能会执行此操作,以响应焦点更改的事件;也就是说,当应用程序或控件收到输入焦点时,UI 自动化客户端会检查子元素的子级和所后代。

请注意,遍历 UI 自动化树是资源密集型操作。 仅当无法使用 IUIAutomationElement::FindFirstFindAllBuildUpdatedCache 方法时,才遍历树。

可以通过将自定义条件传递给 IUIAutomation::CreateTreeWalker 来定义自己的树遍历程序,也可以使用以下预定义对象之一,这些对象定义为基 IUIAutomation 的属性。

对象 目的
ContentViewWalker 仅查找 IUIAutomationElement::CurrentIsContentElement 属性为 TRUE 的元素。
ControlViewWalker 仅查找 IUIAutomationElement::CurrentIsControlElement 属性为 TRUE 的元素。
RawViewWalker 查找所有元素。

 

获取 IUIAutomationTreeWalker 后,调用 IUIAutomationTreeWalker::GetXxx 方法以导航子树的元素,传入要从其开始遍历的元素。

IUIAutomationTreeWalker::Normalize 方法可用于从不属于视图的另一个元素导航到子树中的元素。 例如,假设使用 IUIAutomation::ContentViewWalker 创建子树的视图。 应用程序收到滚动条已接收输入焦点的通知。 因为滚动条不是内容元素,所以子树视图中未呈现滚动条。 但是,可以将表示滚动条的 IUIAutomationElement 传递给 IUIAutomationTreeWalker::Normalize 并检索内容视图中最近的上级。

有关如何使用 IUIAutomationTreeWalker 接口的代码示例,请参阅如何演练 UI 自动化树

检索元素的其他方法

除了搜索和导航,还可以通过以下方式检索 IUIAutomationElement

从事件中

当应用程序收到 UI 自动化事件时,传递给事件处理程序的源对象由 IUIAutomationElement 表示。 例如,如果订阅焦点更改事件,则传递给 IUIAutomationFocusChangedEventHandler 的源是接收焦点的元素。 有关详细信息,请参阅订阅 UI 自动化事件

从某个点中

若要从屏幕坐标(例如光标位置)检索 IUIAutomationElement,请使用 IUIAutomation::ElementFromPoint 方法。

从窗口句柄中

若要从 HWND 检索 IUIAutomationElement,请使用 IUIAutomation::ElementFromHandle 方法。

从具有焦点的控件中

若要检索表示焦点控件的 IUIAutomationElement,请使用 IUIAutomation::GetFocusedElement 方法。

UI 自动化树概述

UI 自动化文档内容客户端示例应用