我应该使用AutomationPeer还是AutomationElement?或两者兼而有之?

时间:2015-06-26 15:33:27

标签: c# wpf ui-automation microsoft-ui-automation

我刚开始使用AutomationElement,因为我们想要对自定义控件进行集成测试,而我认为我应该使用AutomationElement。

我已经成功创建了一个带有自定义控件的Window,并且可以成功获取窗口和控件的AutomationElements

  // Retrieve the View
  System.Windows.Automation.Condition viewCondition = new PropertyCondition(AutomationElement.AutomationIdProperty, "MyTestView");
  AutomationElement view = AutomationElement.RootElement.FindFirst(TreeScope.Children, viewCondition);
  Assert.IsNotNull(view);

  // Retrieve the CustomControl
  System.Windows.Automation.Condition comboboxCondition = new PropertyCondition(AutomationElement.AutomationIdProperty, "MyCustomControl");
  AutomationElement combobox = view.FindFirst(TreeScope.Children, comboboxCondition);
  Assert.IsNotNull(comboboxCondition);

现在,我想要做的是使用,例如ValuePattern。这就是我感到困惑的地方。

在查找信息时,我在referencesource.microsoft.com搜索了WPF源代码。我遇到了实现IValueProvider的ComboboxAutomationPeer,所以现在我很困惑。

还应该实现实现IValueProvider的MyCustomControlAutomationPeer,然后AutomationElement会使用ValuePattern吗?或者我应该让MyCustomControl实现IValueProvider吗?

1 个答案:

答案 0 :(得分:1)

您不必实施任何使用模式的内容。 UI Automation为您完成此任务(充当目标应用程序的代理)。这在官方文档中得到了很好的解释:Get Supported UI Automation Control Patterns

以下是一个示例摘录:

    SelectionItemPattern pattern;
    try
    {
        pattern = yourAutomationElement.GetCurrentPattern(SelectionItemPattern.Pattern) as SelectionItemPattern;
    }
    catch (InvalidOperationException ex)
    {
        Console.WriteLine(ex.Message);  // Most likely "Pattern not supported." 
        return;
    }
    pattern.Select();