В предыдущей статье мы рассмотрели структуру проекта. Проект можно скачать по ссылке GitHub.
Создание класса главного окна (MainWindow Page Object)
Класс MainWindow.cs представляет главное окно нашего приложения WPF (имейте в виду, что подаю урезанный код. Полный код можно скачать с репозитория по ссылке выше).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using ArtOfTest.WebAii.Controls.Xaml.Wpf; using ArtOfTest.WebAii.Silverlight; using ArtOfTest.WebAii.TestTemplates; using System.Threading; namespace SampleApp.Tests.Framework.Elements { public class MainWindow : XamlElementContainer { public static string WINDOW_NAME = "MainWindow"; private string mainPath = "XamlPath=/Border[0]/AdornerDecorator[0]/ContentPresenter[0]/Grid[0]/"; public MainWindow(VisualFind find) : base(find) { } private Button Button_Browse { get { return Get<Button>(mainPath + "Button[0]"); } } public void ClickBrowseButton() { Button_Browse.User.Click(); } } } |
MainWindow согласно паттерну проектирования Page Object. Обьекты (элементы) являются приватными (private) свойствами. Действия над ними – публичные (public) методы, которые используются и вызываються в блоках кода тестов.
Как говорилось ранее – основная идея этого паттерна,- предотвращение дублирования кода для более гибкой поддержкт фреймворка автоматизации.
Класс MainWindow расширяет XamlElementContainer, который реализован фреймворком Telerik. Для поиска элементов WPF приложения используется следующий метод типа TControl, который реализует класс XamlElementContainer:
1 2 |
public TControl Get<TControl>(params string[] clauses) where TControl : ArtOfTest.WebAii.Controls.Xaml.IFrameworkElement; |
Альтернативный вариант реализации MainWindow
Вместо наследования от класса XamlElementContainer можно просто передать обьект VisualFind конструктору MainWindow и искать элементы следующим образом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
using ArtOfTest.WebAii.Controls.Xaml.Wpf; using ArtOfTest.WebAii.Silverlight; using System.Threading; namespace SampleApp.Tests.Framework.Elements { public class MainWindow { public static string WINDOW_NAME = "MainWindow"; private string mainPath = "XamlPath=/Border[0]/AdornerDecorator[0]/ContentPresenter[0]/Grid[0]/"; private VisualFind visualFind; public MainWindow(VisualFind find) { visualFind = find; } private Button Button_Browse { get { return visualFind.ByExpression( new XamlFindExpression(mainPath + "Button[0]")). CastAs<Button>(); } } public void ClickBrowseButton() { Button_Browse.User.Click(); } } } |
Как находить элементы написано в этой статье article.
XamlPath
Как вы могли заметить я использую метод XamlPath find для поиска элементов и простоты в обслуживании. Синтаксис XamlPath довольно похож на синтаксис XPath. Главное отличие индексы элементов основаны на нулевых значениях (Button[0] – определяет первый обьект кнопки). Самая сложная часть в автоматизации – поиск XamlPath. Я нашел следующий инструмент для его определения WPF Inspector. Он предоставляет всю необходимую информацию о структуре приложения WPF.
WPF Inspector
Это скриншот поиска XamlPath для кнопки “Browse”. Если вам покажется сложным поиск с помощью WPF Inspector, то можно воспользоваться другими инструментами.
Все элементы главного окна в классе MainWindow являются WPF-элементами, поэтому использование White ни к чему. В случае контролов WinForms, который появляется при выполнении действий над WPF-элементами вам следует передать обьект White в конструктор.
1 2 3 4 |
public MainWindow(VisualFind find, Application applicationWhite) : base(find) { appWhite = applicationWhite; } |
Использование обьекта White для поиска элементов WinForms будет рассмотрено в следующей статье.