UIAComWrapper не удалось вернуть дочерние узлы элемента управления WPF, который ранее был СБРОШЕН - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь создать тесты закодированного пользовательского интерфейса в приложении 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 и у меня был почти идентичный опыт - на ранее свернутой кнопке не было дочерних узлов.

Что может быть причиной этого, и есть ли у вас какие-либо советы для этого?

1 Ответ

1 голос
/ 04 июля 2019

Чтобы убедиться, что вы работаете с современными AutomationElement объектами, обязательно отметьте этот вопрос об обновлении элементов управления.

Но так как вы упомянули о почти идентичной проблеме с использованием WinAppDriver, я скорее думаю, что проблема будет с тестируемым приложением. Если у вас есть доступ к исходному коду / разработчикам, работающим над этим кодом, пожалуйста, присмотритесь к коду / xaml с этой кнопкой и ее дочерними элементами. Скорее всего, проблема будет найдена там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...