WPF UI Автоматизация с Caliburn.Micro? - PullRequest
4 голосов
/ 02 апреля 2011

Я пытаюсь написать некоторые тесты автоматизации пользовательского интерфейса для приложения WPF, использующего Caliburn.Micro и White .Я использую встроенные соглашения CM для привязки своих элементов управления к свойствам и методам модели представления.Я также использую классы Conductor, чтобы на одном экране можно было видеть несколько представлений.Как правило, это означает, что несколько элементов управления на экране могут иметь одинаковое значение x:Name.Это будет просто связано с другой моделью представления.Хорошую идею о том, что я пытаюсь сделать, можно увидеть в примере приложения HelloScreens, которое поставляется с CM .

Проблема, с которой я работаю, заключается в том, что у меня будет несколько XAMLэлементы с таким же атрибутом x:Name, чтобы CM мог обрабатывать всю работу по связыванию для меня.К сожалению, это означает, что несколько UIItem объектов будут иметь один и тот же идентификатор автоматизации пользовательского интерфейса.Например, единственный способ получить, например, различные элементы TextBlock с x:Name="DisplayName", - это выполнить следующий вызов:

SearchCriteria criteria = SearchCriteria.ByAutomationId("DisplayName").AndIndex(1);
WPFLabel label = myWindow.Get<WPFLabel>(criteria);

Это означает, что мои тесты должны знать точный порядокчто различные элементы управления размещены на экране, что кажется очень хрупким.Я могу увидеть, как мои тесты ломаются, просто добавив другую модель представления.

  • Есть ли способ указать идентификатор автоматизации, кроме использования атрибута x:Name?
  • Было бы этопроще, если бы я использовал платформу автоматизации пользовательского интерфейса напрямую вместо белого?
  • Или мне действительно нужно отказаться от связывания, основанного на соглашениях CM, и присвоить каждому уникальное значение x:Name и связать их вручную?

ОБНОВЛЕНО

Чтобы пояснить, что я имею в виду, когда несколько видов видны одновременно, вот мой общий макет.У меня есть ShellViewModel, который я получаю из Conductor<IScreen>.Collection.OneActive.Тогда мое представление имеет ItemsControl, которое связано со свойством Items модели оболочки.Каждый шаблон элемента показывает кнопку, предназначенную для загрузки этого конкретного IScreen в ContentControl, который находится в представлении оболочки.Итак, если я попытаюсь найти элемент с x:Name="DisplayName", у меня появится метка в представлении оболочки, метка на кнопке в ItemsControl, а также метка внутри ContentControl.

Ответы [ 2 ]

5 голосов
/ 07 апреля 2011

Хотя AutomationId по умолчанию происходит из атрибута x: Name, его можно переопределить, установив AutomationProperties.AutomationId .

1 голос
/ 05 апреля 2011

Одной из опций может быть изменение делегатов BindProperties и BindActions типа ViewModelBinder для работы с именами элементов управления, имена которых изменяются в зависимости от представления, которому они принадлежат.

Например, вы можете при желании добавить имя представления в качестве префикса к каждому элементу управления, который может иметь повторяющиеся имена в других представлениях. Так что DisplayName может стать ListViewDisplayName, а ContentViewDisplayName.

Любой текст от имени элемента управления до слова «View», включая слово «View», может быть удален для формирования чистого имени элемента управления перед продолжением обработки элемента управления.

...