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();

优质内容筛选与推荐>>
1、[转]驾驭你的“职场布朗运动”
2、Ubuntu cd
3、iOS跳转界面时隐藏tabBar的方法
4、每天一个linux命令(21):df命令
5、hmac模块使用


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号