注释
本文档适用于想要使用 System.Windows.Automation 命名空间中定义的托管 UI 自动化类的 .NET Framework 开发人员。 有关 UI 自动化的最新信息,请参阅 Windows 自动化 API:UI 自动化。
本主题介绍获取 AutomationElement 用户界面 (UI) 元素的对象的各种方法。
注意
如果客户端应用程序可能尝试在其自己的用户界面中查找元素,则必须在单独的线程上发出所有 UI 自动化调用。 有关详细信息,请参阅 UI 自动化线程问题。
Root 元素
所有对象 AutomationElement 搜索都必须具有起始位置。 这可以是任何元素,包括桌面、应用程序窗口或控件。
桌面的根元素(所有元素均派生自该元素)通过静态AutomationElement.RootElement属性获取。
注意
一般情况下,应尝试只获取到RootElement的直接子级。 搜索后代可能会循环访问数百甚至数千个元素,这可能会导致堆栈溢出。 如果尝试在较低级别获取特定元素,则应从应用程序窗口或较低级别的容器启动搜索。
条件
对于可用于检索 UI 自动化元素的大多数技术,必须指定一个 Condition,这是一组用于定义要检索的元素的条件。
最简单的条件是 TrueCondition,一个预定义的对象,指定搜索范围中的所有元素都将返回。 FalseCondition是TrueCondition的反例,它不太有用,因为它会阻止任何元素被找到。
其他三个预定义条件可以单独使用,也可以与其他条件结合使用: ContentViewCondition、 ControlViewCondition和 RawViewCondition。 RawViewCondition本身等效于TrueCondition,因为它不根据元素的IsControlElement或IsContentElement属性进行筛选。
其他条件是从一个或多个 PropertyCondition 对象构建的,每个对象都指定属性值。 例如,可以 PropertyCondition 指定元素已启用,或者它支持特定的控件模式。
条件可以通过构造类型
搜索范围
使用FindFirst或FindAll进行的搜索必须指定范围和起始位置。
范围定义要搜索的起始位置周围的空间。 这可能包括元素本身、其同级元素、其父元素、祖先、其直接子元素及其后代。
搜索的范围由枚举中的 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。