博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自动化测试 using System.Windows.Automation;
阅读量:5320 次
发布时间:2019-06-14

本文共 7329 字,大约阅读时间需要 24 分钟。

frameworke3.0 及以上

using System.Windows.Automation;

 

UIAutomationClient.dll

UIAutomationClientsideProviders.dll      C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\UIAutomationClientsideProviders.dll

UIAutomationProvider.dll

UIAutomationTypes.dll

 

下面的示例演示如何使用 FindAll 查找窗口中的所有已启用的按钮。

/// /// Finds all enabled buttons in the specified window element./// /// An application or dialog window./// 
A collection of elements that meet the conditions.
AutomationElementCollection FindByMultipleConditions(AutomationElement elementWindowElement){ if (elementWindowElement == null) { throw new ArgumentException(); } Condition conditions = new AndCondition( new PropertyCondition(AutomationElement.IsEnabledProperty, true), new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button) ); // Find all children that match the specified conditions. AutomationElementCollection elementCollection = elementWindowElement.FindAll(TreeScope.Children, conditions); return elementCollection;}

 

 

 

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

警告:

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

本主题包括下列各节。

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

根元素

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

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

警告:

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

条件

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

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

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

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

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

搜索范围

用 FindFirst 或 FindAll 执行的搜索必须具有一个范围和一个起点。

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

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

查找已知元素

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

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

查找子树中的元素

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

浏览子树

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

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

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

 

ContentViewWalker

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

ControlViewWalker

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

RawViewWalker

查找所有元素。

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

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

检索元素的其他方法

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

从事件中

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

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

从某个点中

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

从窗口句柄中

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

从具有焦点的控件中

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

请参见

概念

基于属性条件查找 UI 自动化元素
使用 TreeWalker 在 UI 自动化元素之间导航
UI 自动化树概述
 
 
 
 
 
 
 
 

表示一个 Condition,其计算结果总是为 true

命名空间:   System.Windows.Automation

程序集:  UIAutomationClient(在 UIAutomationClient.dll 中)

语法

Visual Basic(声明)
Public Shared ReadOnly TrueCondition As Condition
Visual Basic(用法)
Dim value As Conditionvalue = Condition.TrueCondition
C#
public static readonly Condition TrueCondition
Visual C++
public:static initonly Condition^ TrueCondition
J#
public static final Condition TrueCondition
JScript
public static final var TrueCondition : Condition

字段值

类型: System.Windows.Automation
..::.Condition

示例

在下面的示例中,使用 TrueCondition 检索在指定范围内的全部 UI 自动化元素。

C#  复制代码
/// /// Examples of using predefined conditions to find elements./// /// The element for the target window.public void StaticConditionExamples(AutomationElement elementMainWindow){    if (elementMainWindow == null)    {        throw new ArgumentException();    }    // Use TrueCondition to retrieve all elements.    AutomationElementCollection elementCollectionAll = elementMainWindow.FindAll(        TreeScope.Subtree, Condition.TrueCondition);    Console.WriteLine("\nAll control types:");    foreach (AutomationElement autoElement in elementCollectionAll)    {        Console.WriteLine(autoElement.Current.Name);    }    // Use ContentViewCondition to retrieve all content elements.    AutomationElementCollection elementCollectionContent = elementMainWindow.FindAll(        TreeScope.Subtree, Automation.ContentViewCondition);    Console.WriteLine("\nAll content elements:");    foreach (AutomationElement autoElement in elementCollectionContent)    {        Console.WriteLine(autoElement.Current.Name);    }    // Use ControlViewCondition to retrieve all control elements.    AutomationElementCollection elementCollectionControl = elementMainWindow.FindAll(        TreeScope.Subtree, Automation.ControlViewCondition);    Console.WriteLine("\nAll control elements:");    foreach (AutomationElement autoElement in elementCollectionControl)    {        Console.WriteLine(autoElement.Current.Name);    }}
Visual Basic  复制代码
''' ''' Examples of using predefined conditions to find elements.''' ''' The element for the target window.Public Sub StaticConditionExamples(ByVal elementMainWindow As AutomationElement)    If elementMainWindow Is Nothing Then        Throw New ArgumentException()    End If    ' Use TrueCondition to retrieve all elements.    Dim elementCollectionAll As AutomationElementCollection = elementMainWindow.FindAll(TreeScope.Subtree, Condition.TrueCondition)    Console.WriteLine(vbLf + "All control types:")    Dim autoElement As AutomationElement    For Each autoElement In elementCollectionAll        Console.WriteLine(autoElement.Current.Name)    Next autoElement    ' Use ContentViewCondition to retrieve all content elements.    Dim elementCollectionContent As AutomationElementCollection = elementMainWindow.FindAll(TreeScope.Subtree, Automation.ContentViewCondition)    Console.WriteLine(vbLf + "All content elements:")    For Each autoElement In elementCollectionContent        Console.WriteLine(autoElement.Current.Name)    Next autoElement    ' Use ControlViewCondition to retrieve all control elements.    Dim elementCollectionControl As AutomationElementCollection = elementMainWindow.FindAll(TreeScope.Subtree, Automation.ControlViewCondition)    Console.WriteLine(vbLf & "All control elements:")    For Each autoElement In elementCollectionControl        Console.WriteLine(autoElement.Current.Name)    Next autoElementEnd Sub 'StaticConditionExamples

权限

  • 对直接调用方的完全信任。此成员不能由部分信任的代码使用。有关更多信息,请参见通过部分受信任的代码使用库。

平台

Windows Vista

.NET Framework 和 .NET Compact Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。

版本信息

.NET Framework

受以下版本支持:3.5、3.0 SP1、3.0

请参见

概念

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

参考

Condition 类
Condition 成员
System.Windows.Automation 命名空间

转载于:https://www.cnblogs.com/jinxiu0406/p/3156329.html

你可能感兴趣的文章
html5-fullscreen和FileReader构造函数
查看>>
条款7:预先准备好内存不够的情况
查看>>
Day 5 前四天总结练习
查看>>
hubble和mongo做站内搜索
查看>>
EGLImage与纹理
查看>>
转载-Mac下iterm无法使用rz并提示waiting to receive.**B0100000023be50
查看>>
[Practical Git] Show who changed a line last with git blame
查看>>
C# Lock 解读
查看>>
泛型程序设计——Generic Programing
查看>>
阻塞socket 非阻塞socket 以及同步异步、阻塞非阻塞
查看>>
Javascript和HTML:
查看>>
css 初级总结
查看>>
移动端兼容性问题解决方案
查看>>
UVa 253 Cube painting
查看>>
UVa 247 (传递闭包) Calling Circles
查看>>
数据库事务知识
查看>>
解构ffmpeg(一)
查看>>
java web开发环境配置
查看>>
使用java api操作HDFS文件
查看>>
【BZOJ2325】[ZJOI2011]道馆之战 线段树+树链剖分
查看>>