Ответ
На последнем проекте с веб-приложением мы автоматизировали UI-тесты с использованием Selenide (надстройка над Selenium WebDriver) и JUnit 5. Ключевые принципы:
1. Архитектура (Page Object + Page Elements): Каждая страница или значимый виджет — это отдельный класс. Локаторы и базовые методы вынесены в элементы.
// Пример Page Object для страницы логина
public class LoginPage {
// Локаторы с помощью аннотаций Selenide
@FindBy(css = "#username")
private SelenideElement usernameField;
@FindBy(css = "#password")
private SelenideElement passwordField;
@FindBy(css = "button[type='submit']")
private SelenideElement submitButton;
@FindBy(css = ".alert-error")
private SelenideElement errorMessage;
// Методы действий
public void login(String user, String pass) {
usernameField.setValue(user);
passwordField.setValue(pass);
submitButton.click();
}
public String getErrorMessage() {
return errorMessage.shouldBe(visible).getText();
}
}
2. Стабильность через умные ожидания: Selenide автоматически ждет появления элементов и стабильности перед действиями, что резко снижает количество flaky-тестов.
3. Интеграция в CI/CD и отчетность:
// Пример теста
public class LoginTest {
@Test
public void userCanLoginWithValidCredentials() {
open("https://app.example.com/login");
new LoginPage()
.login("standard_user", "secret_sauce");
// Проверка успешного входа
$(By.id("inventory_container")).shouldBe(visible);
}
@Test
public void userSeesErrorWithInvalidPassword() {
open("https://app.example.com/login");
LoginPage loginPage = new LoginPage();
loginPage.login("locked_user", "wrong");
// Проверка текста ошибки
assertThat(loginPage.getErrorMessage())
.isEqualTo("Epic sadface: Username and password do not match");
}
}
4. Дополнительные практики:
- Запуск в Docker-контейнерах для воспроизводимости окружения.
- Генерация скриншотов и HTML-отчетов при падении теста.
- Параметризация тестовых данных через
@CsvFileSource.