Strategy (Стратегия)

Проблема

Ожидание элементов — ключевая задача в UI-тестировании. Разные ситуации требуют разных подходов: Thread.sleep() (ненадёжно), WebDriverWait (явное ожидание), FluentWait с игнорированием исключений (гибкое ожидание), кастомные ожидания. Без структуры в Page Object-ах расползается дублирование: каждый класс сам решает, как ждать, часто по-разному.

Strategy выносит алгоритм ожидания в отдельную иерархию классов. WaitStrategy — интерфейс. ExplicitWaitStrategy, FluentWaitStrategy — конкретные реализации. Page Object принимает стратегию через конструктор или сеттер. Стратегию можно подменить в тесте или в конфигурации, не меняя код страницы.

Структура модуля

strategy/
├── build.gradle
└── src/
    ├── main/
    │   └── java/
    │       └── dev/shipovalov/strategy/
    │           ├── WaitStrategy.java            # Интерфейс стратегии ожидания
    │           ├── ExplicitWaitStrategy.java    # Стратегия: WebDriverWait с фиксированным таймаутом
    │           ├── FluentWaitStrategy.java      # Стратегия: FluentWait с поллингом и игнорированием исключений
    │           └── GoogleSearchPage.java        # Page Object, принимающий стратегию как зависимость
    └── test/
        └── java/
            └── dev/shipovalov/strategy/
                └── StrategyPatternTest.java     # Тест, переключающий стратегии ожидания

Ключевые классы

Класс Назначение
WaitStrategy Интерфейс с методом waitForElement(WebDriver, By): WebElement
ExplicitWaitStrategy WebDriverWait — ждёт видимости элемента, стандартный подход
FluentWaitStrategy FluentWait — настраиваемый интервал поллинга, игнорирование NoSuchElementException
GoogleSearchPage Принимает WaitStrategy в конструкторе, использует её для поиска элементов

Пример использования

// Явное ожидание — подходит для большинства случаев
WaitStrategy explicit = new ExplicitWaitStrategy(Duration.ofSeconds(10));
GoogleSearchPage page = new GoogleSearchPage(driver, explicit);

// Гибкое ожидание — для нестабильных элементов (анимации, AJAX)
WaitStrategy fluent = new FluentWaitStrategy(
    Duration.ofSeconds(15),
    Duration.ofMillis(500),
    List.of(NoSuchElementException.class, StaleElementReferenceException.class)
);
GoogleSearchPage page = new GoogleSearchPage(driver, fluent);

// В тестах можно подменить на мок-стратегию без реального ожидания
WaitStrategy instant = (driver, by) -> driver.findElement(by);

Запуск тестов

./gradlew :strategy:test

Отчёт о результатах: strategy/build/reports/tests/test/index.html