• UI Automation Basic Summary


      两年没Coding了,终于在换新公司之后可以重新把Code捡起来,很庆幸有公司可以给我这个机会做自动化测试工具开发。接收的第一份任务就是做Windows平台上 一款产品的最动化BVT测试,测试技术主要是用微软提供的自动化测试框架UIA,因而就从网上找了很多博客看了下,并自己重新总结了一下,希望自己不要忘记同时也记录一下自己的工作学习过程。

    1. UI Automation Introduction

    1.1 Overview

    UI Automation是Microsoft .NET 3.0框架下提供的一种用于自动化测试的技术,是在MSAA基础上建立的,MSAA就是Microsoft Active Accessibility。UI Automation在某些方面超过了MSAA,UI自动化提供了Windows Vista中,微软Windows XP的全部功能,和Windows Server 2003。

    在UI Automation中,所有的窗体、控件都表现为一个AutomationElement, AutomationElement 中包含此控件或窗体的属性,在实现自动化的过程中,我们通过其相关属性进行对控件自动化操作。对于UI用户界面来说,所有显示在桌面上的UI,其实际是一个UI Tree,根节点是desktop。我们可以使用UI Spy或者是SPY++来获得Window和Control的相关信息。在UI Automation里,根节点表示为AutomationElemnet.RootElement. 通过根节点,我们可以通过窗体或控件的Process Id、Process Name或者Window Name找到相应的子AutomationElement,例如Dialog、Button、 TextBox、Checkbox等标准控件,通过控件所对应的Pattern进行相关的操作。

    1.2 UI Automation structure

    如下图所示:  

                         

         1. 在服务端由UIAutomationProvider.dll和UIAutomationTypes.dll提供。

         2. 在客户端由UIAutomationClient.dll和UIAutomationTypes.dll提供。

         3. UIAutomationCore.dll为UI自动化的核心部分,负责Server端和Client端的交互。

         4. UIAUtomationClientSideProvides.dll为客户端程序提供自动化支持。

    1.3 UI Automation Properties

    Control Tree of the AutomationElement

    在UI Automation控件树中,根节点为Desktop window, 其他运行在用户桌面的窗体都作为Desktop window的子节点。

    如下图所示:

    Desktop window可通过AutomationElement.RootElement属性获取,子节点中的窗体或对话框可通过

            AutomationElement.RootElement.FindAll(TreeScope.Descendants, condition)

            或
            AutomationElement.RootElement.FindFirst(TreeScope.Descendants, condition)来获取。

    AutomationElement property

    在UI Automation中有如下几个重要属性:

    1.         AutomationIdProperty: 通过AutomationId来查找AutomationElement。

    2.         NameProperty: 通过控件的Name属性来查找AutomationElement。

    3.         ControlType: 通过控件的类型来查找AutomationElement

    4.         AutomationId: 唯一地标识 自动化元素,将其与同级相区分。

    5.         Name:  WPF 按钮的 Content 属性、Win32 按钮的 Caption 属性以及 HTML 图像的 ALT 属性都映射到 UI 自动化视图中的同一个属性 Name

    注:PropertyCondition类是用来对相关属性进行条件匹配,在控件树中查找控件时,可以通过最佳匹配来找到相应的控件。

    2. UI Control Pattern

             UIA大概一共定义了38种pattern,代表了常用的控件行为,他们也会提供一些具体的功能性的属性。对于UIA Provider来说,所做的事情就是定义控件相关的行为,找到该行为对应的模式,并实现该模式;对于client而言,即访问相关的方法和属性,来实现自动化。MS提供的常用控件Pattern主要包括以下:

    1

    DockPattern

    2

    ExpandCollapsePattern

    3

    GridPattern

    4

    GridItemPattern

    5

    InvokePattern

    6

    MultipleViewPattern

    7

    RangeValuePattern

    8

    ScrollPattern

    9

    ScrollItemPattern

    10

    SelectionPattern

    11

    SelectionItemPattern

    12

    TablePattern

    13

    TableItemPattern

    14

    TextPattern

    15

    TogglePattern

    16

    TransformPattern

    17

    ValuePattern

    18

    WindowPattern

    2.1 DockPattern

              DockPattern用于操作可停靠容器控件,我们最熟悉的VS2005/2008中的ToolBox,Solution Explorer都可以设置不同的DockPosition,使用DockPattern的前提为控件支持DockPattern。 DockPattern中的DockPosition有六个枚举变量,即Bottom、Left、Right、Top、Fill和None。如果控件支持DockPattern, 则可以获取相对应的DockPosition以及设置控件的DockPosition。

    2.2 ExpandCollapsePattern

             表示以可视方式进行展开(以显示内容)和折叠(以隐藏内容)的控件。例如ComboBox控件支持ExpandCollapsePattern。ExpandCollapsePattern有两个主要方法:

    Expand()方法:隐藏 AutomationElement 的全部子代节点、控件或内容。

    Collapse()方法:显示 AutomationElement 的全部子节点、控件或内容。

    2.3 InvokePattern

    InvokePattern是UIA中最常用的Pattern之一,WPF和Winform中的button控件都支持InvokePattern。

    对InvokePattern的Invoke()方法的调用应立即返回,没有出现阻止情况。但是,此行为完全依赖于 Microsoft UI 自动化提供程序实现。在调用 Invoke() 会引起阻止问题(如Winform中的模式对话框,但是WPF中的对话框的处理方式和winform不同,所以可以使用Invoke()方法来操作WPF中的模式对话框,因为WPF中的模式对话框不会出现阻止的问题)的情况下,要调用此方法,则需要另起线程来操作。

    2.4 ValuePattern

    ValuePattern是UI Automation中最常见的Pattern之一,Winform和WPF的TextBox控件都支持ValuePattern。

    ValuePattern的一个重要的方法是SetValue,在允许调用 SetValue 之前,控件应将其 IsEnabledProperty 设置为 true 并将其 IsReadOnlyProperty 设置为 false。

    通过ValuePattern的Current属性可以获得控件的value和IsReadOnly属性。

    实现 Value 控件模式时,请注意以下准则和约定:

    如果任何项的值是可编辑的,则诸如 ListItemTreeItem 等控件必须支持 ValuePattern,而不管控件的当前编辑模式如何。如果子项是可编辑的,则父控件还必须支持 ValuePattern

    2.5 WindowPattern

             WindowPattern 控件模式用于支持在传统的 图形用户界面 (GUI) 内提供基于基本窗口的功能的控件。必须实现此控件模式的控件的示例包括顶级应用程序窗口、多文档界面 (MDI) 子窗口、大小可调的拆分窗格控件、模式对话框以及气球状帮助窗口。可以使用WindowPattern来对window进行操作,例如验证window是否激活,是否最大化、最小化、正常模式以及关闭window等。

    2.6 SelectionItemPattern

            支持SelectionItemPattern的控件有ListView、ListBox、RadioButton、GridView等。

           1.  SelectionItemPattern的三个重要方法:

    1. AddToSelection:将当前元素添加到所选项的集合。

    2. RemoveFromSelection: 从选定项的集合中移除当前元素。

    3. Select: 取消所有已选中的项,然后选择当前元素。

          2.  SelectionItemPattern的Current属性
         可通过Current属性的IsSelected属性来判断AutomationElement是否被selected.

    2.7 TogglePattern

           支持TogglePattern的控件有CheckBox,TreeView中的button控件等。

           TogglePattern的方法

           Toggle方法用于操作可以循环通过的一组状态并在设置后保持某种状态。

           TogglePattern属性

           Current属性中的ToggleState有如下三种状态:

           1. On

           2. Off

           3. Indeterminate

    2.8 GridPattern

           支持GridPattern的最常见的控件为GridView, 在WPF中使用ListView和GridView组合即可得到相应的GridView。

           GridPattern的方法

           GetItem:此方法有两个参数,即DataGrid的Row和Column。

           通过GridPattern的GetItem方法可以获取DataGrid中的某个确定的单元格,进而对单元进行操作。

           对单元格的操作主要有以下几个方面:

           1. 编辑单元个中的数据。

           2. 获取单元格中的数据。

           3. 获取单元格中嵌套的AutomationElement(一般使用与自定义控件中)。

           GridPattern的属性

           GridPattern的Current属性中有如下两个属性:

           1. RowCount属性:GridPattern二维表格的行数。

           2. ColumnCount属性:GridPattern二维表格列数。

    2.9 ScrollPattern

           ScrollPattern是用来操作控件的滚动条,目前支持ScrollPattern的控件有ListBox,ListView,GridView,TreeView.

           ScrollPattern主要方法

           1. Scroll 水平和垂直滚动内容区域的可见区域滚动, Scroll有两个参数,其类型为ScrollAmount枚举类型。

           2. ScrollHorizontal 按指定的 ScrollAmount 水平滚动内容区域的当前可见区域滚动。

           3. ScrollVertical 按指定的 ScrollAmount 垂直滚动内容区域的当前可见区域滚动。

           ScrollPattern属性

           1. VerticallyScrollable 属性用于判定是否可以垂直滚动。

           2. HorizontallyScrollable 属性用于判定是否可以水平滚动。

           3. HorizontalScrollPercent 获取当前水平滚动条的位置。

           4. VerticalScrollPercent 获取当前垂直滚动条的位置。

    3. UI Automation Tips

      1. 启动被测试的程序

    Process p = Process.Start(@"E:/Project/WinFormTest/WinFormTest/bin/Debug/WinFormTest.exe");

      2. 自动化根元素

    AutomationElement aeDeskTop = AutomationElement.RootElement;

      3. 获得对主窗体对象的引用      

    AutomationElement aeForm = AutomationElement.FromHandle(p.MainWindowHandle);

    if (null == aeForm)

    {

    Console.WriteLine("Cannot find the WinFormTest from.");

    }

      4. 找到第一次出现的Button控件

    AutomationElement aeButton = aeForm.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "button1"));

      5. 多条件查找

    var btnCondition = new AndsCondition(

    new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button),

    new PropertyCondition(AutomationElement.NameProperty, "ok"));

    查找最好使用AutomationID, ProcessID一般每次都不固定。 

      6. 找到所有的TextBox控件

    AutomationElementCollection aeAllTextBoxes = aeForm.FindAll(TreeScope.Children, new    PropertyCondition(AutomationElement.ControlTypeProperty,          ControlType.Edit));

      7. 通过ValuePattern设置TextBox1的值

    ValuePattern vpTextBox1 = (ValuePattern)aeTextBox1.GetCurrentPattern(ValuePattern.Pattern);

    vpTextBox1.SetValue("30");

      8. 通过InvokePattern模拟点击按钮

    InvokePattern ipClickButton1 = (InvokePattern)aeButton.GetCurrentPattern(InvokePattern.Pattern);

    ipClickButton1.Invoke();

      9. 获取textbox中的值

    string result = (string)aeTextBox.GetCurrentPropertyValue(ValuePattern.ValueProperty);

      10. 实现关闭被测试程序                  

    WindowPattern wpCloseForm = (WindowPattern)aeForm.GetCurrentPattern(WindowPattern.Pattern);

    wpCloseForm.Close();

  • 相关阅读:
    redis中的发布订阅(Pub/Sub)
    emmc基础技术8:操作模式3-interrupt mode
    Linux命令-tar
    git获取内核源码的方法
    Linux内核基础设施
    Linux内核简介
    emmc基础技术8:操作模式2-device identification mode
    内核子系统文档撰写方法
    eMMC基础技术6:eMMC data读写
    eMMC基础技术10:寄存器介绍
  • 原文地址:https://www.cnblogs.com/Blackeye286/p/3152950.html
Copyright © 2020-2023  润新知