UIAutomation - 从寻找一个对话框说开去

    故事的开始,是这样的。。。

   

    我在对一个功能进行测试,测试的目的就是获得期待的对话框,并且验证对话框中的内容。有一点值得提及,对话框的出现是没有任何规律的,这就意味着需要等待很长的时间才能看见期待的对话框;或者对话框的出现是非常频繁的,这意味着测试用例的书写,是为了验证各种不同的对话框。

 

    时间久了,我在也无法忍受等待与平凡的手动验证,这让我感觉很是乏味。但是,转念一想,毕竟自己非常熟悉软件自动化测试,干嘛留着这么多手动测试用例,和恼人的点击给自己?于是,就有了下面篇幅 --- 通过UIAutomation查找由应用程序产生的对话框(MessageBox)。

 

(一) 准备工作

       (0) 自己写个Windows Form程序,添加一个Button,为Button添加Click事件,弹出MessageBox。

       (1) 新建一个C#控制台应用程序

       (2) 添加应用dll -> UIAutomationClient,UIAutomationType

       (3) 下载一个UISpye。

 

(二) 你需要知道的一些东西

    (1) C#语法。别告诉我你不知道这个?基本的总该懂点吧?好吧,C语言懂么?

    (2) UIAutomationClient。提供客户端的一些API,说简单些这个.dll可以让你与应用程序交互。

    (3) UIAutomationType。包括一些控件的类型信息,如按钮,窗体,复选框等等。

    (4) Control Type。代表一个控件的类型。如按钮,树视图等等。

    (5) Control Parttern。代表一个控件的模式,比如下拉列表是Control Type,但是它的下拉展开列表选项就是Control Pattern了。

    (6) AutomationElement。UIA中将所有的控件看作是AutomationElement,所有的UI在windows里面表现为一个树型结构,根节点是桌面。

 

(三) 让我们开始吧!

    (1) 编写一个函数,通过窗体的名字来获得窗体的一个AutomationElement对象。

 

 

    解释一下,创建了两个PropertyCondition,用于生成属性条件。这里定义了两个,名字属性以及类型属性,并将两个属性组合起来, 最后找到第一个符合条件的元素。

 

    (2) 再写个函数,通过元素的AutomationId获得一个AutomationElement对象。

 

 

 

    解释一下,同上。

 

    (3)  基本的工作都做完了,下面可以进行应用了。

           a) 把先前写的那个Windows Form程序打开,点击按钮,让MessageBox弹出来。

           b) 调用GetWindowsByName,获得窗体。

 

 

        解释一下,AutomationElement.RootElement即代表了桌面,也即是根节点。“Form1”即是窗体的名字。如果不知道窗体的名字,那么UISpy就派上用场了,你所需要做的就是启动UISpy,展开Form1节点,后续的就不用我多说了吧!

   

          c) 找到对话框。

 

 

          d) 找到OK按钮。

 

 

        解释一下,“65535”这是ok按钮的AutomationId,具体的ID我记不大清了,非常抱歉,个人电脑上没装UISpy。现在好了,你应景获得了OK按钮了,接下了就是要点击它。是不是感觉很酷呢?(我听见有人说没有了,哈!)

 

          e) 获得InvokePattern。

 

 

        解释一下,需要解释么?所有你不懂的,msdn一下你就上当,呵呵。

 

          f) WOW~~是不是很酷,这真是太棒了。

 

 

好了,我也要睡觉了,晚安!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据UIAutomation封装了很多自定义方法 现在只需要实例化之后 直接调用方法即可完成。比如单击某个按钮,现在只需要直接调用ClickElement,非常实用。 ClickElement 单击指定的自动化元素 DisselectAllDataGridRow 不选中所有行 DisselectDataGridRow 不选中特定的某一行 FocusWindow 获取窗口焦点 GetAllElement 获取指定父自动化元素下的所有激活的控件 GetAllElementDetails 获取指定自动化元素下的详细信息包括AutomationID,ControlType以及Name GetAllMenus 获取所有菜单项 GetAllSubMenus 获取某个菜单下的所有子菜单项 GetColumnsFromGridLine 获取指定行的所有列 GetColumnValuesFromGridLine 获取行的每一列数据 GetControlType(AutomationElement) 获取制动自动化元素的控件类型 GetControlType(TypeOfControl) 获取UIAutomation的控件类型 GetDocumentText 获取document控件的值 GetElementByID 获取父自动化元素下指定元素控件ID的引用 GetElementByName 获取父自动化元素下的指定子元素的引用 GetElementsByControlType 获取父自动化元素下的特定类型的所有自动化元素 GetGridLinesFromDataGrid 获取网格控件的全部行元素的引用 GetHeaderFromDataGrid 获取指定网格控件的标题栏引用 GetMenuBar 获取菜单栏控件 GetMenuByName 通过特定的名称去获取菜单UI自动化元素 GetName 获取指定自动化元素的名称 GetSubMenuByName 获取主菜单下的指定子菜单项的引用 GetValue 获取指定自动化元素的值 GetWindowByName(String) 获取desktop下的指定窗口名称的子UI自动化元素 GetWindowByName(String, AutomationElement) 获取特定父UI自动化元素下的制定窗口名称的子UI自动化元素 GetWindowList() 获取当前桌面根下所有的UI自动化元素下 GetWindowList(AutomationElement) 获取特定父UI自动化元素下的所有窗口的名称 RefindMainApplication 重新获取desktop下的指定窗口的自动化元素引用 SelectAllDataGridRow 选中所有行 SelectDataGridRow(AutomationElement) 选中特定的某一行 SelectDataGridRow(AutomationElement, Boolean) 将特定的DateGridRow加入选中项中 SelectValueInComboBox 从下拉框中选中指定值的项 SelectValueInListBox 从列表中选中指定值的项 SetValue 给予指定自动化元素赋值 以上的方法还不是很完善 正在完善中。如果有什么意见和建议,请发送邮件获取 chenxu7601257@qq.com 如果你看了这个帮助文件之后觉得有用的,请发邮件获取,我将把dll文件给你。谢谢。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值