Азы архитектуры фреймворка на PageObjects

Честно говоря, вижу такой подход (код) впервые в жизни.
Вы используете какой-нибудь открытый фреймворк? Или свой?

привет, в общем использую ООП для написания…вроде Patern используется…

я делаю так обычно : - главный класс с описанием тестов и вызовом их
второй - для самих действий, которые будут вызываться - driver.findElement(By…)
и третий , который возвращает значения для assert…

В целом, интересный подход, но немного “нестандартный”.
Я вам предлагаю, ознакомится с видео по паттерну PageObject от товарища @polusok

Еще есть пример работы с PageObject от @mamax

Посмотрите как оформлен код, там всего несколько классов с PageObject’ами.

Я думаю, он не откажется вам помочь разобраться с кодом. Можно спросить в этой теме: Не могу получить текст любого веб элемента с сайта http://booking.uz.gov.ua (JAVA) - #11 от пользователя mamax

я PageObject и использую :smile:

я просто редактировал названия классов, закидывая сюда, что бы конфиденциальность нарушить :slight_smile:

Expected hotel = 1.Select_("Homepage selecting");
Expected calendar = 1.Select_("Click on calendar");

Может быть множество модификаций PageObject. Это правильно, когда паттерн затачивается под конкретную идею.

Тем не менее, после такой заточки, код становится не совсем “стандартным”. Стандартным тут в кавычках, потому что на самом деле официальных стандартов нет.

Вот например, предположим есть страница поиска отелей по дате, с выбором даты по календарю. Тогда бы, тест выглядит приблизительно так. Это псевдо-Java :slight_smile:

Testcase: Search hotels

List<String> expectedHotels = new List<String>();
{
    "Hotel 1",
    "Hotel 2",
    "Hotel 3",
}

HotelPage hotelPage = new HotelPage();

hotelPage.selectDate(DateTime.getToday()); /* X1 */

HotelSearchResultPage searchResult = hotelPage.search(); /* X2 */

List<String> actualAvailableHotels = searchResult.getAvailableHotelsList(); /* X3 */

Assert(expectedHotels, actualAvailableHotels);

Я всего вашего кода не видел, может у вас так и происходит, но позвольте поясню пример.

В метке /* X1 */ выполняется запрос к конкретному действию PageObject. Передается именно конкретный параметр даты.

/* X2 */ В обычной реализации PageObject, методы, они же действия возвращают либо типы данных языка, т.е. массивы или строки, либо другие PageObject’ы. Обычно, другие пейджобжекты возвращаются в момент перехода на другую страницу. В данном примере, как раз вернулся пейджобжект на HotelSearchResultPage searchResult.

/* X3 */ Есть разные подходы в применении проверок. Лично я делаю так: методы PageObject возвращаются в виде обычных типов языка: числа, строки, массивы и DTO. Далее, я явно сравниваю актуальные и ожидаемые данные.

Подчеркиваю, что это лишь один из множества подходов.

Ну и по этому участку кода,
Обычно, технические детали реализации теста прячутся внутрь действий (методов) PageObject.
Т.е. строки выше и имплисит вейты, было бы неплохо поместить в метод hotelPage.selectDate