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