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