51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1840|回复: 0
打印 上一主题 下一主题

使用UI Automation库用于UI自动化测试

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-4-13 14:03:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. 添加引用。 需要添加UIAutomationClient.dll,UIAutomationClientSideProvider.dll,UIAutomationTypes.dll

2. 添加相应的命名空间System.Windows.Automation。

3. 查找你感兴趣的控件。你要单击一个按钮或是在一个文本框输入内容,你得先找到它。要找到你要的控
件,你就必须提供一些的标识来定位你的控件,包括:控件类型,标题等等。看一个简单的例子,如何找
到一个窗口,标题为"test"。
var desktop = AutomationElement.RootElement; // 先找到根元素,可以认为是桌面
var condition = new PropertyCondition(AutomationElement.NameProperty, "test"); // 定义我们的查找条
件,名字是test
var window = desktop.FindFirst(TreeScope.Children, condition); // 在桌面的子控件中查找第一个符合条件
的窗体。
UI Automation有一个配套的工具,用于查看控件的属性和事件,就是UI Spy,单个文件,绿色版,非常好
用。
上面的PropertyCondtion是单个的属性条件,如果需要设置多个条件,可以使用AndContion对象。比如,
我们在上面的window窗口中其中一个按钮,标题是"ok":
var btnCondition = new AndCondition(
                new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button),
                new PropertyCondition(AutomationElement.NameProperty, "ok"));
我们最常用的几个属性就是AutomationID,ControlType,NameProperty了,这几个属性都可以在UI Spy
里查到。

4. 如何触发控件的事件。比如,按钮的点击事件,窗口的拖动事件等等。好是来个简单的例子,也是最最
常用的例子,按钮的点击:
var button = window.FindFirst(TreeScope.Children, btnCondition);
var clickPattern = (InvokePattern)button.GetCurrentPattern(InvokePattern.Pattern);
clickPattern.Invoke();
我们怎么知道一个控件有哪些Pattern呢,还是看UI Spy。在左边的树目录中右键需要查看的控件,选中“
Control Patterns”就可以查看有哪些Pattern,并且可以进行测试。下面这个地址可以查看一共有哪些Con
trol Pattern,需要用到的时候查一下就知道了:
UI Automation Control Patterns Overview  
总结:

可以看出,我上面的例子一共也没多少行,就把UI Automation的基本用法介绍了一遍,这些东西也是最
最常使用到的,通常的情况也都能应付过去。如果需要更加深入的内容,就得自己去详细查看MSDN的文
档了。
同时,也许你也会发现,这套库用起来比较烦琐,就是简单的查找一个控件也要花费我们不少功夫。所以,
我们可以在这套库的基础上去做自己的扩展,编写出一套适合自己的UI自动化库。一个最常见的例子就是
做一个安装程序的自动化,我们需要去点击上面的下一步按钮,按钮点击后会进行安装操作,这时候按钮
是灰色的,安装完成后,按钮恢复可用状态,然后点击完成。因为需要等待完成按钮出现,在自动化实现
过程中我们可以实现一个等待控件的通用函数:
复制代码
  1. static AutomationElement WaitForElement(AutomationElement parent, Condition condition, int milisecondTimeout)
  2. {
  3.     var waitTime = 0;
  4.     var element = parent.FindFirst(TreeScope.Children, condition);

  5.     while (element == null)
  6.     {
  7.         if (waitTime >= milisecondTimeout)
  8.         {
  9.             break;
  10.         }

  11.         Thread.Sleep(500);
  12.         waitTime += 500;

  13.         element = parent.FindFirst(TreeScope.Children, condition);
  14.     }

  15.     return element;
  16. }
复制代码

复制代码
往往我们使用控件的Name属性来标识,因此,我们可以再一步封装一下:
复制代码
  1. static AutomationElement WaitForElement(int milisecondTimeout, params string[] controlTexts)
  2. {
  3.     var waitTime = 0;
  4.     AutomationElement child = null;

  5.     while (true)
  6.     {
  7.         var parent = AutomationElement.RootElement;
  8.         var founded = true;
  9.         foreach (var text in controlTexts)
  10.         {
  11.             child = WaitForElement(parent, text, 10);
  12.             if (child == null)
  13.             {
  14.                 founded = false;
  15.                 break;
  16.             }
  17.             parent = child;
  18.         }

  19.         if (founded)
  20.         {
  21.             break;
  22.         }

  23.         if (waitTime >= milisecondTimeout)
  24.         {
  25.             child = null;
  26.             break;
  27.         }

  28.         Thread.Sleep(500);
  29.         waitTime += 500;
  30.     }
  31.    
  32.     return child;
  33. }
复制代码

复制代码
因此,我就可以这样来等待一个控件的出现:

var btn = WaitForElement(5000, "安装向导", "完成");
甚至可以把按钮的点击也封装,封装成下面的方式调用,就像在AutoIt脚本里一样简单:

Click("安装向导", "完成");

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-17 20:24 , Processed in 0.062555 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表