【问题标题】:Implementation of IValueProvider leads to UITestControlNotAvailableExceptionIValueProvider 的实现导致 UITestControlNotAvailableException
【发布时间】:2018-07-27 16:01:27
【问题描述】:

我在 WindowsStore 应用程序的 UI 自动化方面遇到了一些困难。我一实现 IValueProvider 就会得到一个 UITestControlNotAvailableException。如果我删除它的实现,它就可以工作。

  • Microsoft.VisualStudio.TestTools.UITest.Extension.UITestControlNotAvailableException(控件不可用或无效。)
  • InnerException:指向对 testControl.Name 的调用 (Microsoft.VisualStudio.TestTools.UITesting.UITestControl.get_Name())
  • InnerException:事件无法调用任何订阅者(来自 HRESULT 的异常:0x80040201)

StackTrace 如下所示:

at Microsoft.VisualStudio.TestTools.UITest.Extension.Uia.UiaUtility.MapAndThrowException(Exception e, IUITechnologyElement element, Boolean useRethrowException)
at Microsoft.VisualStudio.TestTools.UITest.Extension.Uia.UiaUtility.GetAutomationPropertyValue[T](AutomationElement element, AutomationProperty property)
at Microsoft.VisualStudio.TestTools.UITest.Extension.Uia.UiaElement.GetAutomationPropertyValue[T](AutomationProperty automationProperty)
at Microsoft.VisualStudio.TestTools.UITest.Extension.Uia.UiaElement.get_NativeWindowHandle()
at Microsoft.VisualStudio.TestTools.UITest.Extension.Uia.UiaElement.get_WindowHandle()
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.get_IsRefetchRequired()
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.EnsureValid(Boolean waitForReady, Boolean refetch)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.GetPropertyValuePrivate(String propertyName)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.GetPropertyPrivate(String propertyName)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.GetPropertyOfType[T](String propertyName)
at Microsoft.VisualStudio.TestTools.UITesting.UITestControl.get_Name()
at UITest.Framework.Windows.TestGround.GetElementString(UITestControl element, Int32 level) in ...
at UITest.Framework.Windows.TestGround.WalkTree(UITestControl element, Int32 level) in ...
at UITest.Framework.Windows.TestGround.WalkTree(UITestControl element, Int32 level) ...
at UITest.Framework.Windows.TestGround.WalkTree(UITestControl element, Int32 level) ...
at UITest.Framework.Windows.TestGround.WalkTree(UITestControl element, Int32 level) ...
at UITest.Framework.Windows.TestGround.PrintTree(Modes mode, XamlWindow window) in ...

在应用程序端,我使用此代码获取有关控件的信息:

public class CanvasAP : FrameworkElementAutomationPeer, IValueProvider
{
    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 object GetPatternCore(PatternInterface patternInterface)
    {
        if (patternInterface == PatternInterface.Value)
        {
            return this;
        }

        return base.GetPattern(patternInterface);
    }


    #region Implementation of IValueProvider
    bool IValueProvider.IsReadOnly => true;

    string IValueProvider.Value
    {
        get
        {
            var str = "Test";
            var owner = (Windows.UI.Xaml.Controls.Canvas)Owner;

            foreach (var child in owner.Children)
            {
                str += $"{child.GetType()}";
            }

            return str;
        }
    }

    void IValueProvider.SetValue(string value)
    {
    }
    #endregion
}

在 UI 自动化客户端,我使用此代码获取有关控件的信息:

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】:

    发现了我犯的错误 - 它是在调用 base.GetPattern 而不是 base.GetPatternCore

    protected override object GetPatternCore(PatternInterface patternInterface)
    {
        if (patternInterface == PatternInterface.Value)
            return this;
    
        return base.GetPatternCore(patternInterface);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      相关资源
      最近更新 更多