使用UI Automation实现自动化测试--3

 

Chapter 3  UI Automation中的几个重要属性

Control Tree of the AutomationElement

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

如下图所示:
            

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

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


AutomationElement.RootElement.FindFirt(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类是用来对相关属性进行条件匹配,在控件树中查找控件时,可以通过最佳匹配来找到相应的控件。

如下代码列出了使用不同的属性来构建PropertyCondition,通过PropertyCondition来查找控件树中的控件.
 

 

Code


posted @ 2009-09-10 16:05 开着拖拉机 阅读(3022) 评论(16) 编辑 收藏

 回复 引用   
#1楼2009-09-10 18:00 | TOOTH[未注册用户]
使用UIAutomation框架做的界面自动化测试,我们已经应用到上个项目中了。获得不同的控件需要的Condition是不同的(为了提高速度),先写N多方法获取控件,再封装成一个函数通过字符串参数获得所有能获得的控件,以及控件操作,对以后写用例就方便了。
我们还能处理PropertyGrid,呵呵,show一下。最新的White开源项目也封装的不错,但是没有创新。

 回复 引用   
#2楼2009-09-11 08:35 | wallace.wei[未注册用户]
web测试呢?浏览器下的各种控件,你们用什么做?
 回复 引用 查看   
#3楼[楼主]2009-09-11 11:17 | 开着拖拉机      
@TOOTH
UI Automation处理PropertyGrid方面了解到还不多,还望您帮忙啊

 回复 引用 查看   
#4楼[楼主]2009-09-11 11:18 | 开着拖拉机      
@wallace.wei
目前UI Automation还不支持web方面的测试,主要用于WPF以及win32程序的测试

 回复 引用   
#5楼2009-09-11 11:48 | wallace.wei[未注册用户]
@开着拖拉机
目前我们用WatiN做web的测试。
UI Automaition正打算了解下。

 回复 引用 查看   
#6楼2009-09-11 13:02 | 包建强      
请教一下,在WPF里面,使用NameProperty而不是ControlTypeProperty,为什么找不到Button呢?
这条语句aeButton得到不为null:
AutomationElement aeButton = aeForm.FindFirst(TreeScope.Children,
new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button));

但是这一条语句就不行,aeButton得到为null:
AutomationElement aeButton = aeForm.FindFirst(TreeScope.Children,
new PropertyCondition(AutomationElement.NameProperty, "button1"));

 回复 引用 查看   
#7楼[楼主]2009-09-11 14:02 | 开着拖拉机      
@包建强
WPF中
<Button Height="23" Margin="75,34,128,0" Name="button1" VerticalAlignment="Top">Button</Button>

Name=“button1”在UI Spy中为AutomationId,而Button为UI Spy中的Name,建议你将
AutomationElement aeButton = aeForm.FindFirst(TreeScope.Children,
new PropertyCondition(AutomationElement.NameProperty, "button1"));


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

试试看,或者把"button1"改为Button试试看

 回复 引用 查看   
#8楼2009-09-11 16:53 | 包建强      
ok,测试通过,老兄你经验丰富啊。写个系列吧,把每个控件都讲讲,或者去那里找参考资料呢?
 回复 引用 查看   
#9楼[楼主]2009-09-11 17:26 | 开着拖拉机      
@包建强
呵呵,过奖了,我将尽我所能试着写写UIA对常用控件的操作,UI Automation相关的资料一般都是在MSDN上找到的。
http://msdn.microsoft.com/zh-cn/library/ms747327.aspx

 回复 引用   
#10楼2009-09-17 11:26 | wallace.wei[未注册用户]
有问题想请教,你们做auto Testing的时候是自己写一个tool然后通过这个tool去做auto testing呢还是写一些auto case,通过过某平台自动运行这些case?如果是前者,那你们的测试数据是怎么准备的?如果是后者,那你们的平台是怎么做的?

 回复 引用 查看   
#11楼[楼主]2009-09-17 13:13 | 开着拖拉机      
我们用的是Nunit来运行TestCase, TestCase是调用由UI Automation以及Win32API结合构建的测试库(FTP( Functional Testing Platform )),测试数据有两种准备方式:
1. 在测试初始化阶段将需要的数据写入数据库,确保每条TestCase具有独立的数据。
2. 在每个TestCase运行之前先初始化本条TestCase所需的测试数据。
我们基本上是结合这两种方式进行测试数据准备的。

 回复 引用   
#12楼2009-10-27 13:09 | 1111111111111111[未注册用户]
好难啊,写那么多代码。vs2010中UI automation 只要拖拖拽拽就可以了,简单多了。跟你这个UI automation 是一回事吗?
 回复 引用 查看   
#13楼[楼主]2009-10-28 12:43 | 开着拖拉机      
@1111111111111111
vs2010目前还没有用过啊,UI Automation就是微软的一套用来进行UI自动化测试的平台

 回复 引用 查看   
#14楼2009-12-22 11:42 | yufun      
@1111111111111111
VS2010中是对UIAutomation的一个封装,跟White差不多
而且貌似封装的不怎么好使,反正我们是自己来封装UIAutomation来做

 回复 引用 查看   
#15楼2009-12-22 11:49 | yufun      
@包建强
UI Automation中的Name属性名字起的不好,貌似我在哪个博客看到有批评这个名字的,UI Automation中的Name叫Text更好一点。起这个名字估计是为了和AccessibleName保持统一吧,如果你的控件设置了AccessibleName,这个Name就会拿AccessibleName作为值,如果没有设置,会拿Window Text作为值
而AutomationID针对不同类型的控件是不一样的,比如WinForm和Win32,一般是用变量名作为AutomationID的,对于WPF,是可以通过AutomationProperties.AutomationId来设置的,如果没有设置,变量名将会作为AutomationID

 回复 引用 查看   
#16楼2010-11-10 15:29 | Gil      
对于带层次关系的控件树,假若A有子控件B,B有子控件C,那么用A.FindChild()或者A.FindAll()都是无法找到控件C的吧?