UI Automation对象识别方式

UI Automation中查询子元素有两种方式,一种是通过TreeWalker类的GetFirstChild和GetLastChild方法。一种是通过AutomationElement类的FindFirst和FirstAll方法。

在UIA中,程序UI的每一个部分都被认为是一个AutomationElement类,他们是一个树状的结构,Desktop被认为是每个windows based app的UIA树状图的根,从类的定义中,我们也可以看到一个AutomationElement类中有一个static的RootElement属性。

对象识别:

AutomationnElement desktop = AutomationElement.RootElement;
PropertyCondition typeCond = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window);
PropertyCondition nameCond = new PropertyCondition(AutomationElement.NameProperty, "Trader Desktop");
AutomationElement traderDesktop = desktop.findFirst(TreeScope.Children, new AndCondition(nameCond, typeCond));
AutomationElementCollection traderDesktops = desktop.findAll(TreeScope.Children, new AndCondition(nameCond, typeCond));

对象遍历:

ContentViewWalker
表示一个预定义的 TreeWalker,其中包含目录树中标记为内容控件的元素的视图。Content View则是Control View的一个子集,它只包含能和用户直接交互真实信息的控件,比如接受键盘输入的Textbox,选择不同值的Combobox;而诸如lable等控件则不会包含在其中

ControlViewWalker
表示一个预定义的 TreeWalker,其中包含目录树中标记为控件的元素的视图。Control View是Raw View的子集,它最贴近于最终用户所能感知的UI结构,但是它不包含不能和用户相互交互的一些UI,例如listview的header,toolbar等等。

RawViewWalker
表示一个预定义的 TreeWalker,其中包含目录树中所有元素的视图。Raw View提供的信息最多,也是其他view的基础,最贴近于程序本身的编程结构。

private void WalkControlElements(AutomationElement rootElement, TreeNode treeNode) { 
     //TreeWalker.ControlViewWalker, TreeWalker.ContentViewWalker, TreeWalker.RawViewWalker
     AutomationElement elementNode = TreeWalker.ControlViewWalker.GetFirstChild(rootElement)
     while (elementNode != null) { 
        TreeNode childTreeNode = treeNode.Nodes.Add(elementNode.Current.ControlType.LocalizedControlType);
        WalkControlElements(elementNode, childTreeNode); 
        elementNode = TreeWalker.ControlViewWalker.GetNextSibling(elementNode); 
     } 
}

为什么有了微软给出的对象识别(过滤)方式,我们还要自己做对象的遍历:

微软给出的对象识别(过滤)主要就是利用TreeWalker.ControlViewWalker来遍历所有的标准控件,然后根据过滤条件来筛选。但对于那些非标准控件,一开始就被排除了,这个时候我们就需要使用RawViewWalker.

两者之间还是有性能上的区别,在MSDN的TreeWalker类说明中有这么一段话描述:“使用 TreeWalker 在 UI 自动化目录树中导航可能导致进程间调用,并且其效率不如使用 FindAll 或 FindFirst 方法来定位元素”。有效率上的区别,这点很关键,要知道在一个元素非常多的被测试应用程序上,有很大一部分的工作就在于定位元素,即查找元素,如果测试用例有成百上千条的时候,这两种查找元素的方式有一点效率上的差异,通过大数量级的测试用例运行后的累积效应,其测试所用总时间也会差异较大。

2 days ago, this page was being read.

,

Subscribe to Comments