获取 UI 自动化元素

注意注意

本文档的目标读者是欲使用 System.Windows.Automation 命名空间中定义的托管 UI Automation类的 .NET Framework 开发人员。有关 UI Automation的最新信息,请参见 Windows Automation API: UI Automation(Windows 自动化 API:UI 自动化)。

本主题描述获取 user interface (UI) 元素的 AutomationElement 对象的各种方法。

警告说明警告

如果客户端应用程序可以尝试在其自己的用户界面中查找元素,则必须在一个单独的线程上进行所有 UI Automation调用。有关更多信息,请参见 UI 自动化线程处理问题

本主题包括下列各节。

  • 根元素
  • 条件
  • 搜索范围
  • 查找已知元素
  • 查找子树中的元素
  • 浏览子树
  • 检索元素的其他方法
  • 相关主题

根元素

所有 AutomationElement 对象搜索必须具有一个起点。 此起点可以是任何元素,包括桌面、应用程序窗口或控件。

所有元素所起源于的根元素是从静态的 AutomationElement.RootElement 属性中获得的。

警告说明警告

通常,您应当尝试只获取 RootElement 的直接子项。对子代的搜索可能循环访问数百个甚至数千个元素,从而可能导致堆栈溢出。如果尝试在较低级别上获取特定元素,应该从应用程序窗口或者从较低级别的容器中开始搜索。

条件

对于用于检索 UI Automation元素的大多数方法,您必须指定 Condition,这是一组用于定义要检索的元素的条件。

最简单的条件是 TrueCondition,这是一个指定要返回搜索范围内的所有元素的预定义对象。 FalseConditionTrueCondition 的对立条件,其作用不大,因为它将阻止找到任何元素。

下面是三个其他的预定义条件,这些条件既可以单独使用,也可以与其他条件一起使用:ContentViewConditionControlViewConditionRawViewCondition。 单独使用的 RawViewCondition 等效于 TrueCondition,因为它不根据元素的 IsControlElementIsContentElement 属性来筛选元素。

其他条件是根据一个或多个 PropertyCondition 对象(每个对象都指定一个属性值)建立的。 例如,PropertyCondition 可以指定元素处于启用状态或元素支持某种控件模式。

通过构建 AndConditionOrConditionNotCondition 类型的对象,可以用布尔逻辑将条件结合起来。

搜索范围

FindFirstFindAll 执行的搜索必须具有一个范围和一个起点。

范围定义了要搜索的起点周围的空间。 这可以包括元素本身、其同级项、父项、祖先、直接子项以及子代。

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

查找已知元素

若要查找由已知元素的 NameAutomationId、某些其他属性或属性组合标识的已知元素,最简单的方法是使用 FindFirst 方法。 如果查找的元素是一个应用程序窗口,则搜索的起点可以是 RootElement

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

查找子树中的元素

若要查找与已知元素有关且满足特定条件的所有元素,您可以使用 FindAll。 例如,您可以使用这种方法从列表或菜单中检索列表项或菜单项,或找出对话框中的所有控件。

浏览子树

如果您事先不了解可与客户端一起使用的应用程序,则可以使用 TreeWalker 类建立一个包含感兴趣的所有元素的子树。 您的应用程序可能会执行此操作以响应 focus-changed 事件;也就是说,在应用程序或控件接收输入焦点时,UI 自动化客户端将检查子项,可能还会检查有焦点的元素的所有子代。

使用 TreeWalker 的另一种方式是识别元素的祖先。 例如,通过向上浏览树,您可以识别控件的父窗口。

通过创建类的对象(用 Condition 定义感兴趣的元素),或者使用以下被定义为 TreeWalker 的字段的预定义对象之一,您可以使用 TreeWalker

ContentViewWalker

只查找 IsContentElement 属性为 true 的元素。

ControlViewWalker

只查找 IsControlElement 属性为 true 的元素。

RawViewWalker

查找所有元素。

在获得了 TreeWalker 之后,可以直接使用它。 只需调用 Get 方法便可在子树的元素中导航。

Normalize 方法可用于从视图外的另一元素导航到子树中的某个元素。 例如,假设您使用 ContentViewWalker 创建了一个子树视图。 然后,您的应用程序收到通知,得知滚动条已经接收了输入焦点。 因为滚动条不是内容元素,所以子树视图中未呈现滚动条。 但是,您可以将代表滚动条的 AutomationElement 传递到 Normalize 并检索内容视图中最接近的祖先。

检索元素的其他方法

除了应用搜索和导航之外,您还可以通过以下方法来检索 AutomationElement

从事件中

当您的应用程序接收 UI Automation事件时,传递到事件处理程序的源对象为 AutomationElement。 例如,如果您订阅了 focus-changed 事件,则传递到 AutomationFocusChangedEventHandler 的源是收到焦点的元素。

有关更多信息,请参见订阅 UI 自动化事件

从某个点中

如果您具有屏幕坐标(例如,光标位置),则可以使用静态的 FromPoint 方法来检索 AutomationElement

从窗口句柄中

若要从 HWND 中检索 AutomationElement,请使用静态的 FromHandle 方法。

从具有焦点的控件中

可以从静态的 FocusedElement 属性中检索表示焦点控件的 AutomationElement

请参见

任务

基于属性条件查找 UI 自动化元素

使用 TreeWalker 在 UI 自动化元素之间导航

概念

UI 自动化树概述