自动化测试 using System.Windows.Automation;

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 查找窗口中的所有已启用的按钮。

/// <summary>
/// Finds all enabled buttons in the specified window element.
/// </summary>
/// <param name="elementWindowElement">An application or dialog window.</param>
/// <returns>A collection of elements that meet the conditions.</returns>
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。

“折叠”图像请参见

概念

 
 
 
 
 
 
 
 

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

命名空间:   System.Windows.Automation
程序集:  UIAutomationClient(在 UIAutomationClient.dll 中)

“折叠”图像语法

Visual Basic(声明)
Public Shared ReadOnly TrueCondition As Condition
Visual Basic(用法)
Dim value As Condition

value = 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# “复制”图像复制代码
/// <summary>
/// Examples of using predefined conditions to find elements.
/// </summary>
/// <param name="elementMainWindow">The element for the target window.</param>
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 “复制”图像复制代码
''' <summary>
''' Examples of using predefined conditions to find elements.
''' </summary>
''' <param name="elementMainWindow">The element for the target window.</param>
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 autoElement

End Sub 'StaticConditionExamples


“折叠”图像权限

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

“折叠”图像平台

Windows Vista

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

“折叠”图像版本信息

.NET Framework

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

“折叠”图像请参见

概念

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

参考

System.Windows.Automation 命名空间
posted @ 2013-06-26 11:45  韩大先生  阅读(2166)  评论(0编辑  收藏  举报