获取 UI 自动化元素
本主题介绍如何获取 UI 元素的 IUIAutomationElement 接口。
IUIAutomationElement 在 UI 自动化文档内容客户端示例应用中使用。
Root 元素
尽管可以使用方法(例如 IUIAutomation::GetFocusedElement)直接检索元素,但某些客户端应用程序需要查看元素的分层结构,称为 UI 自动化树。 此层次结构的根元素是桌面。 可以使用 IUIAutomation::GetRootElement 方法或 IUIAutomation::GetRootElementBuildCache 方法获取此元素。 这两种方法都检索 IUIAutomationElement 接口指针。 可以使用 IUIAutomationElement::FindFirst 和 FindAll 等方法搜索后代元素。
注意
通常,应尝试仅获取根元素的直接子级。 搜索后代可能会循环访问数百或数千个元素。 如果尝试在较低级别上获取特定元素,应该从应用程序窗口或者从较低级别的容器中开始搜索。
条件
对于用于检索 UI 自动化元素的大多数技术,必须指定条件。 条件是一组条件,用于定义要检索的元素。 条件由 IUIAutomationCondition 接口表示。
最简单的条件是 true 条件,它是一个预定义对象,指定将返回搜索范围中的所有元素。 false 条件是 true 条件的反函数,它不太有用,因为使用它会导致无法找到任何元素。 可以使用 IUIAutomation::CreateTrueCondition 获取 true 条件的接口。
其他三个预定义条件(可用作 IUIAutomation 对象的属性)可以单独使用,也可以与其他条件结合使用:IUIAutomation::ContentViewCondition、ControlViewCondition 和 RawViewCondition。 单独使用的 RawViewCondition 等效于 true 条件,因为它不按 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 的属性。
对象 | 目的 |
---|---|
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 方法。