Как вы автоматизировали UI-тестирование?

«Как вы автоматизировали UI-тестирование?» — вопрос из категории Selenium и Selenide, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

На последнем проекте с веб-приложением мы автоматизировали 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.