Получить AutomationElement для пользовательского элемента управления WPF
Я хочу использовать Windows AutomationElement
s для имитации ввода пользователя во время тестирования. Мой конкретный вариант использования - это ручная настройка выбора 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.FindMe
UserControl
?
С помощью 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 установлен на дочерние элементы, он не будет сканировать все дерево при поиске соответствующих элементов. В зависимости от того, что делает ваш пользовательский элемент управления, элемент, который вы получаете, может оказаться бесполезным. Без реализации каких-либо пользовательских шаблонов для вашего контроля единственное, что вы сможете сделать, - это извлечь из него другие элементы.