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

简介:

UI Automation也不是什么新东西了,很久以前曾经用过一次,最近又在一个测试中打算使用,于是又翻了一遍MSDN。MSDN里的介绍确实非常详细,但是对于一个刚刚接触的人来说,大而全的文档反而使得无从下手。往往一个简单的Demo比得上大段的文字说明,因此我打算用几个简单的Demo来介绍一下UI Automation到底是如何使用的。

首先,我们还是得知道UI Automation的MSDN文档在哪。在这:

http://msdn.microsoft.com/en-us/library/ms753107.aspx

我们只看关键的一节:

Using UI Automation for Automated Testing

上面的文档能够在你遇到各种复杂情况下有资料可查,下面就开始我们的Demo,大致分为以下几个步骤。

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,并且可以进行测试。下面这个地址可以查看一共有哪些Control Pattern,需要用到的时候查一下就知道了:

UI Automation Control Patterns Overview 

总结:

可以看出,我上面的例子一共也没多少行,就把UI Automation的基本用法介绍了一遍,这些东西也是最最常使用到的,通常的情况也都能应付过去。如果需要更加深入的内容,就得自己去详细查看MSDN的文档了。

同时,也许你也会发现,这套库用起来比较烦琐,就是简单的查找一个控件也要花费我们不少功夫。所以,我们可以在这套库的基础上去做自己的扩展,编写出一套适合自己的UI自动化库。一个最常见的例子就是做一个安装程序的自动化,我们需要去点击上面的下一步按钮,按钮点击后会进行安装操作,这时候按钮是灰色的,安装完成后,按钮恢复可用状态,然后点击完成。因为需要等待完成按钮出现,在自动化实现过程中我们可以实现一个等待控件的通用函数:

复制代码
static  AutomationElement WaitForElement(AutomationElement parent, Condition condition,  int  milisecondTimeout)
{
    var waitTime 
=   0 ;
    var element 
=  parent.FindFirst(TreeScope.Children, condition);

    
while  (element  ==   null )
    {
        
if  (waitTime  >=  milisecondTimeout)
        {
            
break ;
        }

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

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

    
return  element;
}
复制代码

往往我们使用控件的Name属性来标识,因此,我们可以再一步封装一下:

复制代码
static  AutomationElement WaitForElement( int  milisecondTimeout,  params   string [] controlTexts)
{
    var waitTime 
=   0 ;
    AutomationElement child 
=   null ;

    
while  ( true )
    {
        var parent 
=  AutomationElement.RootElement;
        var founded 
=   true ;
        
foreach  (var text  in  controlTexts)
        {
            child 
=  WaitForElement(parent, text,  10 );
            
if  (child  ==   null )
            {
                founded 
=   false ;
                
break ;
            }
            parent 
=  child;
        }

        
if  (founded)
        {
            
break ;
        }

        
if  (waitTime  >=  milisecondTimeout)
        {
            child 
=   null ;
            
break ;
        }

        Thread.Sleep(
500 );
        waitTime 
+=   500 ;
    }
    
    
return  child;
}
复制代码

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

var btn  =  WaitForElement( 5000 " 安装向导 " " 完成 " );

甚至可以把按钮的点击也封装,封装成下面的方式调用,就像在AutoIt脚本里一样简单:

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

最后,其实我想说的是,在codeplex上,有一个开源项目White,对UI Automation进行了一些易用性上的封装,非常值得我们去学习和参考,甚至直接拿来使用。下一篇我们将继续学习White测试框架,敬请关注。

 

 

 

本文转自CoderZh博客园博客,原文链接:http://www.cnblogs.com/coderzh/archive/2009/11/14/1603109.html,如需转载请自行联系原作者

相关文章
|
15天前
|
设计模式 前端开发 测试技术
告别脆弱:构建稳定UI自动化测试的3个核心策略
告别脆弱:构建稳定UI自动化测试的3个核心策略
213 113
|
2月前
|
存储 关系型数据库 测试技术
玩转n8n测试自动化:核心节点详解与测试实战指南
n8n中节点是自动化测试的核心,涵盖触发器、数据操作、逻辑控制和工具节点。通过组合节点,测试工程师可构建高效、智能的测试流程,提升测试自动化能力。
|
2月前
|
人工智能 JavaScript 算法
Playwright携手MCP:AI智能体实现自主化UI回归测试
MCP 协议使得 AI 能够通过 Playwright 操作浏览器,其中快照生成技术将页面状态转化为 LLM 可理解的文本,成为驱动自动化测试的关键。该方式适用于探索性测试和快速验证,但目前仍面临快照信息缺失、元素定位不稳定、成本高、复杂场景适应性差以及结果确定性不足等挑战。人机协同被认为是未来更可行的方向,AI 负责执行固定流程,人类则专注策略与验证。
|
2月前
|
机器学习/深度学习 人工智能 测试技术
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
EdgeMark是一个面向嵌入式AI的自动化部署与基准测试系统,支持TensorFlow Lite Micro、Edge Impulse等主流工具,通过模块化架构实现模型生成、优化、转换与部署全流程自动化,并提供跨平台性能对比,助力开发者在资源受限设备上高效选择与部署AI模型。
284 9
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
|
4月前
|
XML jenkins 机器人
JMeter+Ant+Jenkins实现接口自动化测试持续集成
本文介绍了如何使用Ant生成JMeter接口测试报告,并集成到Jenkins中实现自动化测试。内容涵盖Ant与JMeter环境配置、build.xml文件设置、测试执行及报告生成,同时包括Jenkins插件安装、项目配置和钉钉消息通知的集成,帮助实现持续测试与结果可视化。
598 0
|
1月前
|
人工智能 自然语言处理 JavaScript
Playwright MCP在UI回归测试中的实战:构建AI自主测试智能体
Playwright MCP结合AI智能体,革新UI回归测试:通过自然语言驱动浏览器操作,降低脚本编写门槛,提升测试效率与覆盖范围。借助快照解析、智能定位与Jira等工具集成,实现从需求描述到自动化执行的闭环,推动测试迈向智能化、民主化新阶段。
|
2月前
|
自然语言处理 前端开发 测试技术
使用 Playwright MCP 实现 UI 自动化测试
本文介绍如何结合Playwright与MCP协议实现智能化UI自动化测试。通过自然语言指令控制浏览器,降低技术门槛,提升效率,并涵盖环境搭建、核心功能、实战案例及最佳实践,展现对话式自动化的未来趋势。
|
4月前
|
人工智能 前端开发 测试技术
如何让AI帮你做前端自动化测试?我们这样落地了
本文介绍了一个基于AI的UI自动化测试框架在专有云质量保障中的工程化实践。
1795 21
如何让AI帮你做前端自动化测试?我们这样落地了
|
2月前
|
人工智能 JavaScript 测试技术
当Playwright遇见MCP,AI智能体实现自主化UI回归测试
本文探讨如何通过Model Context Protocol(MCP)让AI智能体驱动Playwright实现端到端自动化测试。重点解析快照技术的实现原理与实战流程,同时深入剖析其在信息丢失、元素定位、成本效率及逻辑复杂性等方面的现实挑战。

热门文章

最新文章