代码之家  ›  专栏  ›  技术社区  ›  Florian

自动对等。GetChildrenCore()只向VisualStudio报告第一个子级。测试工具

  •  0
  • Florian  · 技术社区  · 8 年前

    我无法正确重写GetChildrenCore。我将其用于画布,以获取有关其子对象(直线、矩形)的信息。

    输出正确地指示第一个子项,但忽略了第二个子项。即使画布已经包含了这两种内容。

    Custom Canvas  
        Custom Line Childs of Canvas parent: 2  
    

    相反,它应该是这样的:

    Custom Canvas  
        Custom Line Childs of Canvas parent: 2  
        Custom Rectangle Childs of Canvas parent: 2  
    

    应用程序侧边:

    public class ElementAP : FrameworkElementAutomationPeer
    {
        private FrameworkElement Owner = null;
        private Int32 Count = 0;
    
        public ElementAP(FrameworkElement owner, Int32 count) : base (owner)
        {
            Owner = owner;
            Count = count;
        }
    
        protected override AutomationControlType GetAutomationControlTypeCore()
        {
            return AutomationControlType.Custom;
        }
    
        protected override string GetClassNameCore()
        {
            return $"{Owner.GetType().Name} Childs of Canvas parent: {Count}"; 
        }
    }
    
    public class CanvasAP : FrameworkElementAutomationPeer
    {
        public CanvasAP(Windows.UI.Xaml.Controls.Canvas owner) : base(owner)
        {
        }
    
        protected override AutomationControlType GetAutomationControlTypeCore()
        {
            return AutomationControlType.Custom;
        }
    
        protected override string GetClassNameCore()
        {
            return "Canvas";
        }
    
        protected override IList<AutomationPeer> GetChildrenCore()
        {
            var owner = (Windows.UI.Xaml.Controls.Canvas)Owner;           
            var list = new List<AutomationPeer> ();
    
            foreach (var child in owner.Children)
            {
                var peer = new ElementAP(child as FrameworkElement, owner.Children.Count);
    
                list.Add(peer);
            }
    
            return list;
        }
    }       
    

    UI测试端:

    private static string WalkTree(UITestControl element, Int32 level = 0)
    {
        var children = element.GetChildren();
    
        var str = "";
        foreach (var c in children)
        {
            str += GetElementString(c, level);
            str += WalkTree(c, level + 1);
        }
    
        return str;
    }
    
    private static string GetElementString(UITestControl element, Int32 level = 0)
    {
        var xaml = element as XamlControl;
        var str = "";
        for (var i = 0; i < level; i++)
            str += "  ";
    
        str += $"{element.ControlType} {element.ClassName} {element.Name} {xaml?.AutomationId ?? ""}\n";
    
        return str;
    }   
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Florian    8 年前

    我终于找到了答案。当为孩子们的自动对等点使用缓存时,它工作得非常好。

    public class ElementAP : FrameworkElementAutomationPeer
    {
        public UIElement Element { get { return Owner; } }
    
        public ElementAP(FrameworkElement owner) : base(owner)
        {
        }
    
        protected override AutomationControlType GetAutomationControlTypeCore()
        {
            return AutomationControlType.Custom;
        }
    
        protected override string GetClassNameCore()
        {
            return Owner.GetType().Name;
        }
    }
    
    public class CanvasAP : FrameworkElementAutomationPeer
    {
        private List<ElementAP> _cachedAutomationPeers = new List<ElementAP>();
    
        public CanvasAP(Windows.UI.Xaml.Controls.Canvas owner) : base(owner)
        {
        }
    
        protected override AutomationControlType GetAutomationControlTypeCore()
        {
            return AutomationControlType.Custom;
        }
    
        protected override string GetClassNameCore()
        {
            return "Canvas";
        }
    
        protected override IList<AutomationPeer> GetChildrenCore()
        {
            var owner = (Windows.UI.Xaml.Controls.Canvas)Owner;
    
            if (owner.Children.All(c => c is CanvasA))
                return base.GetChildrenCore();
    
            var list = new List<ElementAP>();
    
            foreach (var child in owner.Children)
            {
                var peer = _cachedAutomationPeers.FirstOrDefault(p => p.Element == child) ?? new ElementAP(child as FrameworkElement);
    
                list.Add(peer);
            }
    
            _cachedAutomationPeers = list;
    
            return list.Cast<AutomationPeer>().ToList();
        }
    }