@Aleksey111

Грамотно ли я написал тестовый фреймворк selenium+pageObject+testng (нужна критика)?

Цель - в качестве практики написать тестовую модель по UI почты маил ру и автоматизировать подходящие под это дело тесты.
Сам проект - https://github.com/aleks70694/WebMailRuAutomatizat...
Пока только 3 тестика написал, и нужно понять, архитектурно и синтаксически правильно ли я всё делаю, чтобы можно было продолжать.

Что планирую добавить и какие проблемы решить:
1. Убрать Thred.sleep-ы.
2. Написать более интуитивно понятные названия методов, переменных.
3. Вынести некоторые захардкоженные значения.
4. Добавить какой нибудь конфигуратор отчетов - allure, например.
5. Добавить в итоговой реализации cucumber.

Вопросы следующие:
1. Правильно ли я применил паттерн Page Object в принципе? Возможно, какие-то недочеты есть?
2. При создании письма на странице с общим списком писем всплывает попап нового письма. Он как бы находится на странице с общим списком писем, но также это сам по себе значительный элемент с большим кол-вом тестов. Поэтому я вынес его, как отдельную страницу. Это правильно? Или нужно было создать внутренний класс этого попапа в EmailsListPage (классе страницы с общим списком писем)?
3. Я узнаю на какой странице нахожусь по следующему явному ожиданию, который я добавил в конструктор каждой страницы. Правильно ли это?
new WebDriverWait(driver, 10)
.until(ExpectedConditions.presenceOfElementLocated(title));

4. Во многих случаях я возвращаю объект страницы. Не избыточно ли это? Насколько я понимаю, драйвер и без этого понимает, что на странице произошли изменения, т.е. мне не нужно присваивать переменной страницы, с которой я буду работать дальше, возвращенный методом объект страницы.

public EmailsListPage deleteEmail () {
driver.findElement(contextMenuDelete).click();
return new EmailsListPage(driver);
}


@Test
public void deleteEmail() throws InterruptedException{
EmailsListPage emailsListPage = new EmailsListPage(driver);
int emailsCountBefore = emailsListPage.getCountEmailList();
emailsListPage.rightClickByEmail(emailsListPage.getEmailList(), 0);
emailsListPage.deleteEmail();
Thread.sleep(1000);
int emailsCountAfter = emailsListPage.getCountEmailList();
Assert.assertTrue((emailsCountBefore-1) == emailsCountAfter);
}

5. В тестах, собственно, указал тестовые методы с помощью аннотаций @Test. Соответственно подготовительные действия перед каждым тестом я пометил с помощью @BeforeTest и @AfterTest соответственно. Но при запуске всего класса с тестами в таком случае @BeforeTest происходит однократно и все тесты одновременно в этом окне пытаются выполниться. Почему так может происходить? (проблема решилась тем, что фикстуры пометил как @BeforeMethod и @AfterMethod )
6. Какие нибудь тестовые данные (ссылки, названия кнопок, названия страниц и тд) наверняка можно вынести в какие-нибудь property файлы. Вот как это к проекту присобачить? Чтобы доставать из файлика, например, по getProperty(baseUrl) данные.
7. Этой строке место в классе с тестами? Может это можно указать где-то в настройках проекта?
System.setProperty("webdriver.chrome.driver", "src\\main\\resources\\chromedriver.exe");

8. Планирую реализовать тестики и использовать окружение, библиотеки, инструменты максимально близкие к тем, что используются на реальных проектах. Что тут еще можете посоветовать, к чему стремиться? Стек точно java+selenium+pageObject+testNG+allure. Селениду позже буду осваивать.
9. Возможно еще есть какие-то архитектурные или синтаксические недочеты? Может что-то куда-то вынести можно или нужно?

Спасибо!
  • Вопрос задан
  • 159 просмотров
Решения вопроса 1
SlavikF
@SlavikF
Что я увидел не так:

О том, что такое паттерн Page Object в Священном Писании не записано, поэтому одни считают так правильно, а другие - иначе.

Основная идея Page Object pattern: низкоуровневое взаимодействие с браузером выносится в Page Objects, а в тестах остаётся в основном бизнес-логика.

В вашем случае, в методе preCondition вы открываете страницу браузера:
driver.get("https://mail.ru/");
Более правильно перенести это в конструктор LoginPage.

Методы typeLogin, clickEnterPasswordButton, ... возвращают "this". Я это часто вижу. Но смысла в этом мало. Это может иметь какой-то смысл, если действие (нажатие клавиши, клик на кнопку), которое возвращают другую страницу (другого типа), да и в таких случаях зачастую можно не заморачиваться с этим.

В остальном тесты, в свете page object pattern выглядит нормально.

В свете логики тестов, у deleteEmail похоже есть предположение, что в ящике уже есть какое-то количество emails. А если нету? тест будет валиться.

Thread.sleep - это обычно сразу красный флаг. Это 100% признак ненадёжного теста. В местах, где надо ждать (анимации, загрузки, ...) нужно поллить. Можно вот так:
https://www.selenium.dev/selenium/docs/api/java/or...
Но на самом деле вариантов много.

Ещё вы добавили chromedriver.exe в репу.
Бинарники в репе - это плохо.
В вашем случае может помочь вот эта библиотека:
https://github.com/bonigarcia/webdrivermanager

Ещё у вас репе debug.log
Его в репе быть не должно. Нужно убрать через .gitignore
Да .idea туда же.

Ещё режет глаза слово "popap". Это прям сразу видеть человек английских не знать.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы