本主题介绍获取 UI 元素的 IUIAutomationElement 接口的各种方法。
IUIAutomationElement 用于 UI 自动化文档内容客户端示例应用 。
尽管可以使用 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 属性的下列预定义对象之一。
获取 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 自动化文档内容客户端示例应用