UI Test Automation Framework - это современный фреймворк для автоматизации тестирования веб-приложений, построенный на базе Selenide, JUnit 5 и поддерживающий многопоточное выполнение тестов.
qa-ui-framework/
├── src/main/java/qa/autotest/
│ ├── app/dto/ # Data Transfer Objects
│ │ ├── UserDto.java
│ │ ├── ProductDto.java
│ │ ├── CartDto.java
│ │ └── CheckoutDto.java
│ ├── pages/ # Page Object Model
│ │ ├── BasePage.java
│ │ ├── LoginPage.java
│ │ ├── InventoryPage.java
│ │ ├── ProductDetailsPage.java
│ │ ├── CartPage.java
│ │ ├── CheckoutStepOnePage.java
│ │ ├── CheckoutStepTwoPage.java
│ │ └── CheckoutCompletePage.java
│ └── framework/
│ ├── drivers/
│ │ └── DriverManager.java # WebDriver management
│ ├── config/
│ │ ├── TestConfig.java # Configuration interface
│ │ └── ConfigFactory.java # Config factory
│ └── utils/ # Utility classes
└── src/test/java/examples/
├── BaseTest.java
├── login/
├── inventory/
├── cart/
├── checkout/
└── navigation/
Назначение: Моделирование данных предметной области
Особенности:
- Использование Lombok для минимизации boilerplate кода
- Builder pattern для гибкого создания объектов
- Immutable объекты (где применимо)
Примеры:
@Data
@Builder
public class UserDto {
private String username;
private String password;
private String firstName;
private String lastName;
}Назначение: Инкапсуляция логики взаимодействия с UI
Иерархия:
BasePage (общие элементы: header, cart, burger menu)
├── LoginPage
├── InventoryPage
├── ProductDetailsPage
├── CartPage
├── CheckoutStepOnePage
├── CheckoutStepTwoPage
└── CheckoutCompletePage
Принципы:
- Одна страница = один класс
- Методы возвращают Page Objects для fluent interface
- Использование Selenide для упрощения работы с элементами
- Allure Steps для лучшей отчетности
Пример:
@Step("Login with username: {username}")
public InventoryPage login(String username, String password) {
usernameInput.setValue(username);
passwordInput.setValue(password);
loginButton.click();
return new InventoryPage();
}DriverManager управляет жизненным циклом WebDriver:
Возможности:
- Автоматическое управление драйверами (WebDriverManager)
- Поддержка 4 браузера: Chrome, Firefox, Edge, Safari
- Thread-safe реализация через ThreadLocal
- Поддержка headless режима
- Интеграция с Selenium Grid
- Настройка timeouts и размера окна
Пример:
public static void initDriver(TestConfig config) {
String browser = config.browser();
WebDriver webDriver = createLocalDriver(browser, config.browserHeadless());
driver.set(webDriver);
WebDriverRunner.setWebDriver(webDriver);
}Использует Owner library для управления конфигурациями:
Приоритет загрузки:
- System properties (-Dkey=value)
- Environment variables
- Environment-specific properties (local.properties, ci.properties)
- Default properties (default.properties)
Пример:
@Config.Sources({
"system:properties",
"system:env",
"classpath:config/${env}.properties",
"classpath:config/default.properties"
})
public interface TestConfig extends Config {
@Key("browser")
String browser();
}BaseTest предоставляет:
- Инициализацию WebDriver перед каждым тестом
- Очистку WebDriver после теста
- Доступ к конфигурации
- Логирование
- Поддержку параллельного выполнения
Инкапсуляция логики страниц в отдельные классы
Гибкое создание DTO объектов
Создание конфигураций и драйверов
Управление конфигурацией (thread-safe)
Цепочка вызовов методов для читаемости
Каждый поток имеет свой экземпляр WebDriver:
private static final ThreadLocal<WebDriver> driver = new ThreadLocal<>();@Execution(ExecutionMode.CONCURRENT)
public abstract class BaseTest {
// ...
}Каждый поток пишет в отдельный лог-файл:
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>threadName</key>
</discriminator>
</appender>@Epic- группировка по эпикам@Feature- группировка по функциональности@Story- группировка по user stories@Step- описание шагов@Severity- приоритет теста
- Скриншоты при ошибках
- Логи выполнения
- HTML исходный код страницы
- Автоматический запуск тестов
- Параллельное выполнение
- Сохранение артефактов (отчеты, логи, скриншоты)
- Поддержка разных браузеров
- Изолированное окружение
- Предустановленные браузеры
- Headless режим по умолчанию
- Использование Page Objects для инкапсуляции логики UI
- DTO для моделирования данных вместо Map/JSON
- Fluent interface для читаемости тестов
- Thread-safe реализация для параллельности
- Централизованная конфигурация через Owner
- Детальное логирование с поддержкой многопоточности
- Allure steps для прозрачных отчетов
- Автоматическое управление драйверами через WebDriverManager
Фреймворк готов к промышленному использованию и может быть легко адаптирован под специфические требования проекта.