UI Automation自定义控件处理 , In 测试 , Views: 49 , Comments: 0 , Index: 339 , 07 August 2015

在做Wpf/Winform UI自动化测试的时候,我们往往不得不面对一个非标准的控件,通过常规的方法我们是得不到控件信息的。下面是一个解决方法:

(1)在被测软件该控件类上通过实现接口添加对自动化的支持。

protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer() 
{ 
     ImprovedPivotGridAutomationPeer peer = new ImprovedPivotGridAutomationPeer(gridPresenter); 
     peer.InvalidatePeer(); 
     return peer; 
}
UI Automation通过相对位置来进行对象识别 , In 测试 , Views: 46 , Comments: 0 , Index: 381 , 07 June 2015

下面这个类是用来辅助我们通过相对位置关系来找控件。

class LocationFinder 
    { 
        AutomationElement element; 
        public LocationFinder(AutomationElement element) 
        { 
            this.element = element; 
        } 
 
        public AutomationElement getWindow(AutomationElement element) 
        { 
            TreeWalker tWalker = TreeWalker.ControlViewWalker; 
            AutomationElement parentItem = tWalker.GetParent(element); 
            if (!parentItem.Current.ControlType.Equals(ControlType.Window)) 
            { 
                return getWindow(parentItem); 
            } 
            return parentItem; 
        }
UI Automation对象识别方式 , In 测试 , Views: 75 , Comments: 0 , Index: 342 , 07 May 2015

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));

12 3 4