【问题标题】:AutomationPeer.GetChildrenCore () only reports first child to VisualStudio.TestToolsAutomationPeer.GetChildrenCore () 只向 VisualStudio.TestTools 报告第一个孩子
【发布时间】:2018-07-27 16:24:54
【问题描述】:

我无法正确覆盖 GetChildrenCore。我将它用于 Canvas 以获取有关其子项(线、矩形)的信息。

输出正确指示第一个孩子,但错过了第二个。即使 Canvas 已经包含两者。

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

【问题讨论】:

    标签: xamarin windows-store-apps ui-automation visualstudio.testtools


    【解决方案1】:

    我终于找到了答案。当为孩子们的 AutomationPeers 使用缓存时,它可以完美地工作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      相关资源
      最近更新 更多