Я начинаю использовать TestStack White (автоматизация пользовательского интерфейса) для автоматизации тестов в существующем приложении WPF. При использовании стандартных элементов управления все работает нормально. Однако я сталкиваюсь с проблемами при попытке взаимодействия с пользовательскими элементами управления.
Например, у меня есть LabeledComboBox, который на самом деле является TextBlock плюс ComboBox. Это определяется как класс, производный от Control плюс ControlTemplate в XAML:
public class LabeledComboBox : Control
{
static LabeledComboBox()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(LabeledComboBox), new FrameworkPropertyMetadata(typeof(LabeledComboBox)));
}
}
<local:LabeledComboBox>
<local:LabeledComboBox.Template>
<ControlTemplate TargetType="{x:Type local:LabeledComboBox}">
<StackPanel>
<TextBlock Text="Text"/>
<ComboBox/>
</StackPanel>
</ControlTemplate>
</local:LabeledComboBox.Template>
</local:LabeledComboBox>
Этот элемент управления работает, но если вы запустите автоматизацию пользовательского интерфейса, убедитесь, что единственная часть, видимая для автоматизации пользовательского интерфейса, — это ComboBox, а доступ к TextBlock недоступен.
Однако, если вы создаете это как UserControl с использованием XAML и кода программной части, TextBox и ComboBox должным образом видны для автоматизации пользовательского интерфейса.
Я попытался создать AutomationPeer (FrameworkElementAutomationPeer) для своего элемента управления, но пока не смог сделать TextBlock видимым для автоматизации пользовательского интерфейса. Одним из интересных результатов является то, что FrameworkElementAutomationPeer::GetChildrenCore() правильно возвращает список из двух одноранговых элементов автоматизации, один для TextBlock и один для ComboBox.
Как мне изменить свой пользовательский элемент управления, чтобы его можно было правильно протестировать с помощью UI Automation и White?