Я пытаюсь создать тесты закодированного пользовательского интерфейса в приложении WPF. Я использую Visual Studio 2019 для создания / запуска тестов.
Я сталкиваюсь со странным поведением, когда кнопка WPF, свернутая при запуске (но позднее сделанная видимой / включенной), не отображает дочерние узлы, использующие любой из методов FindXXX, доступных для объекта AutomationElement, связанного с кнопкой. Другие кнопки, которые не были свернуты, похоже, не имеют этой проблемы. Я должен отметить, что причина, по которой я ожидаю дочерние узлы для этой кнопки WPF, заключается в том, что в XAML она определяется следующим образом:
<Button x:Name="ButtonStop" Grid.Row="0" Grid.Column="2" Command="{Binding TheVm.StopCommand}">
<Button.Style>
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonStyleA}">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding TheVm.DisplayButton}" Value="False">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
<StackPanel Style="{StaticResource ControlsStackPanelStyle}">
<Image Source="pack://application:,,,/Assets/icon1.png" Style="{StaticResource ControlsButtonImageStyle}"/>
<ContentPresenter Content="Stop" Style="{StaticResource ControlsButtonTextStyle}"/>
</StackPanel>
</Button>
С помощью приложения INSPECT.EXE я могу правильно видеть дочерние узлы этой кнопки, но когда я пересекаю элементы автоматизации, у меня есть доступ к ним, они отсутствуют.
Тестовый код, который я использую для проверки читабельного текста:
// Wait for 'Stop' button to become enabled, and verify correct text
uIButtonStopButton.WaitForControlEnabled();
var displayText = (!uIButtonStopButton.DisplayText.Equals(""))
? uIButtonStopButton.DisplayText
: GetFirstNodeText(uIButtonStopButton.NativeElement as AutomationElement;
Assert.AreEqual("Stop", displayText, "Stop button doesn\'t have correct text.");
Где метод GetFirstNodeText выглядит следующим образом:
private static string GetFirstNodeText(AutomationElement automationElement)
{
if (automationElement != null)
{
// Get first AutomationElement node that is a 'text' control-type
var textEl = automationElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.LocalizedControlTypeProperty, "text"));
if (textEl != null) return textEl.Current.Name;
}
return "";
}
Дополнительный (интересный) фрагмент информации: я попробовал аналогичный тест с использованием Appium / WinAppDriver и у меня был почти идентичный опыт - на ранее свернутой кнопке не было дочерних узлов.
Что может быть причиной этого, и есть ли у вас какие-либо советы для этого?