本主题介绍获取 UI 元素的 IUIAutomationElement 接口的各种方法。

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

Root 元素

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

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

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

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

作为 IUIAutomation 对象的属性提供的其他三个预定义条件可以单独使用,也可以与其他条件结合使用: IUIAutomation::ContentViewCondition ControlViewCondition RawViewCondition RawViewCondition 本身使用,等效于真实条件,因为它不按 IUIAutomationElement::CurrentIsControlElement CurrentIsContentElement 属性筛选元素。

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

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

使用 IUIAutomationElement::FindFirst FindAll 执行的搜索必须具有范围和起始位置。

有关这两种方法的任何注释也适用于 IUIAutomationElement::FindFirstBuildCache FindAllBuildCache

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

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

查找已知元素

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

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

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

查找子树中的元素

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

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

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

请注意,遍UI 自动化树会占用大量资源。 仅当无法使用 IUIAutomationElement::FindFirst FindAll BuildUpdatedCache 方法时,才遍视树。

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

Object

获取 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 自动化文档内容客户端示例应用