通过


获取 UI 自动化元素

注释

本文档适用于想要使用 System.Windows.Automation 命名空间中定义的托管 UI 自动化类的 .NET Framework 开发人员。 有关 UI 自动化的最新信息,请参阅 Windows 自动化 API:UI 自动化

本主题介绍获取 AutomationElement 用户界面 (UI) 元素的对象的各种方法。

注意

如果客户端应用程序可能尝试在其自己的用户界面中查找元素,则必须在单独的线程上发出所有 UI 自动化调用。 有关详细信息,请参阅 UI 自动化线程问题

Root 元素

所有对象 AutomationElement 搜索都必须具有起始位置。 这可以是任何元素,包括桌面、应用程序窗口或控件。

桌面的根元素(所有元素均派生自该元素)通过静态AutomationElement.RootElement属性获取。

注意

一般情况下,应尝试只获取到RootElement的直接子级。 搜索后代可能会循环访问数百甚至数千个元素,这可能会导致堆栈溢出。 如果尝试在较低级别获取特定元素,则应从应用程序窗口或较低级别的容器启动搜索。

条件

对于可用于检索 UI 自动化元素的大多数技术,必须指定一个 Condition,这是一组用于定义要检索的元素的条件。

最简单的条件是 TrueCondition,一个预定义的对象,指定搜索范围中的所有元素都将返回。 FalseConditionTrueCondition的反例,它不太有用,因为它会阻止任何元素被找到。

其他三个预定义条件可以单独使用,也可以与其他条件结合使用: ContentViewConditionControlViewConditionRawViewConditionRawViewCondition本身等效于TrueCondition,因为它不根据元素的IsControlElementIsContentElement属性进行筛选。

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

条件可以通过构造类型的对象,使用布尔逻辑进行组合。

搜索范围

使用FindFirstFindAll进行的搜索必须指定范围和起始位置。

范围定义要搜索的起始位置周围的空间。 这可能包括元素本身、其同级元素、其父元素、祖先、其直接子元素及其后代。

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

查找已知元素

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

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

查找子树中的元素

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

遍历子树

如果事先不知道客户端可能使用的应用程序,则可以使用 TreeWalker 该类构造所有感兴趣的元素的子树。 应用程序可能会在响应焦点更改事件时执行此操作;即,当应用程序或控件获得输入焦点时,UI 自动化客户端会检查子元素以及可能是所有后代元素。

另一种用途是使用 TreeWalker 来识别元素的祖先。 例如,通过向上遍历树,可以标识控件的父窗口。

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

领域 说明
ContentViewWalker 仅查找其 IsContentElement 属性为 true
ControlViewWalker 仅查找其 IsControlElement 属性为 true
RawViewWalker 查找所有元素。

获得TreeWalker后,使用它很简单。 只需调用 Get 方法即可在子树的元素之间导航。

该方法 Normalize 可用于从不属于视图的另一个元素导航到子树中的元素。 例如,假设你使用ContentViewWalker创建了子树的视图。 然后,应用程序会收到滚动条已接收输入焦点的通知。 由于滚动条不是内容元素,因此子树视图中不存在该滚动条。 但是,可以传递 AutomationElement 表示滚动条 Normalize ,并检索内容视图中最近的上级。

检索元素的其他方法

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

从事件

当应用程序收到 UI 自动化事件时,传递给事件处理程序的源对象是一个 AutomationElement。 例如,如果订阅了焦点更改事件,则传递给你的 AutomationFocusChangedEventHandler 源是接收焦点的元素。

有关详细信息,请参阅 “订阅 UI 自动化事件”。

从一个点开始

如果你有屏幕坐标(例如光标位置),则可以使用静态AutomationElement方法检索一个FromPoint

从窗口句柄

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

从重点控件

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

另见