Настройка сцены
У меня есть простое приложение Microsoft WPF, которое состоит из (управляемого данными) GroupBox, содержащего группу кошек и группу собак. Обе группы Cat и Dog содержат по два групповых элемента каждая. Когда я запускаю приложение, все выглядит нормально, я вижу группы и их содержимое на экране.
Запуск приложения приводит к следующему окну:
Однако, когда я создаю тест UIAutomation, я не могу найти элементы автоматизации для элементов группы, только группы; только к группам Cat и Dog можно получить доступ либо с помощью маршрута AutomationElement, либо с помощью UISpy.exe, как показано на изображении ниже:
Дочерние компоненты для отдельных элементов группы Cat и Dog отсутствуют, и мне нужно иметь возможность получить их как элементы автоматизации в моем тестовом коде:
[TestMethod]
public void MyTest()
{
Condition controlTypeCondition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Group);
var foreGroundWindow = GetForegroundWindow();
var collection = foreGroundWindow.FindAll(TreeScope.Descendants, controlTypeCondition);
foreach (AutomationElement element in collection)
{
logger.Debug("Name: " + element.Current.Name);
var children = element.FindAll(TreeScope.Children, Condition.TrueCondition);
logger.Debug("Number of children: " + children.Count);
}
}
В настоящее время выводится:
Имя: Кот
Количество детей: 0
Имя: Собака
Количество детей: 0
Воспроизведение проблемы
Чтобы воспроизвести эту проблему, создайте новое приложение WPF в Visual Studio (с именем WpfApplication1) и замените содержимое MainWindow.xaml следующим:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
</ResourceDictionary.MergedDictionaries>
<XmlDataProvider x:Key="data">
<x:XData>
<Animals xmlns="">
<Animal name="Felix" Species="Cat" />
<Animal name="Garfield" Species="Cat" />
<Animal name="Rex" Species="Dog" />
<Animal name="Rover" Species="Dog" />
</Animals>
</x:XData>
</XmlDataProvider>
<CollectionViewSource x:Key="AnimalsBySpecies" Source="{Binding Source={StaticResource data}, XPath=Animals/Animal}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="@Species" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</ResourceDictionary>
</Window.Resources>
<ItemsControl ItemsSource="{Binding Source={StaticResource AnimalsBySpecies}}">
<ItemsControl.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<GroupBox Header="{Binding Name}">
<ItemsPresenter />
</GroupBox>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ItemsControl.GroupStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding XPath=@name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Window>
На самом деле мой код выглядит не совсем так, поскольку это приложение MVVM. Но для краткости я упростил это до одного файла XAML, который воспроизводит ту же проблему. Важно отметить, что содержимое группы заполняется из привязки XAML.
Итак, как я могу получить доступ к контенту с помощью UIAutomation?
Любая помощь очень ценится!