Получить AutomationElement для пользовательского элемента управления WPF

Я хочу использовать Windows AutomationElements для имитации ввода пользователя во время тестирования. Мой конкретный вариант использования - это ручная настройка выбора ListBox, и из того, что я нахожу в сети, мне понадобится элемент AutomationElement для моего списка, чтобы манипулировать им.

Предположим, у меня было окно, подобное этому:

<Window x:Class="CryptoAdmin_Test.Helper.FreshWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:CryptoAdmin_Test.Helper">
    <StackPanel>
        <UserControl x:FieldModifier="public" x:Name="FindMe" />
    </StackPanel>
</Window>

Поскольку у меня есть ссылка на UserControl, я смогу найти ее, не запуская поиск с рабочего стола (AutomationElement.RootElement).

Какой самый быстрый способ получить AutomationElement для меня window.FindMeUserControl?

С помощью AutomationElement.RootElement.FindFirst(...); Начну с рабочего стола, и я не вижу общего способа, который бы сделал этот поиск быстрым без какой-либо возможности для ложных срабатываний.

1 ответ

Решение

Это должен быть самый быстрый способ найти его. Это также предполагает, что вы даете окну имя, потому что в противном случае его будет довольно сложно найти, если вы не запустите процесс из своего приложения и не получите для него идентификатор процесса.

AutomationElement mainWindow = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "MainWindow"));
AutomationElement findMe = mainWindow.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "FindMe"));

Поскольку TreeScope установлен на дочерние элементы, он не будет сканировать все дерево при поиске соответствующих элементов. В зависимости от того, что делает ваш пользовательский элемент управления, элемент, который вы получаете, может оказаться бесполезным. Без реализации каких-либо пользовательских шаблонов для вашего контроля единственное, что вы сможете сделать, - это извлечь из него другие элементы.

Другие вопросы по тегам