Цепочки sleep (Sleep Chain)
Несколько вызовов Thread.sleep следуют один за другим после каждого действия в тесте или Page Object. Антипаттерн является расширением «жёстких задержек» — специфичен для сценариев с многошаговой навигацией.
Симптомы
- Несколько
Thread.sleep(...)в одном методе или тест-шаге - Суммарная задержка одного сценария — 10–30 секунд и более
-
sleepдобавляется автоматически «про запас» после любого клика - Время прогона всего сьюта растёт пропорционально количеству шагов
Причины возникновения
- Первый
sleep«помог» — стали добавлять везде по аналогии - Нет единого механизма ожидания, каждый разработчик решает проблему по-своему
- Неудобный или непонятный API
WebDriverWaitвынуждает прибегать к sleep - «Защитное» кодирование: лучше подождать лишние 2 сек, чем разбираться с флаки
Почему это проблема
- Экспоненциальный рост: каждый новый шаг добавляет задержку; 20 шагов × 2 сек = 40 сек только на sleep
- Всё равно нестабильно: на медленном CI задержки всё равно недостаточно — тест падает
- Блокировка параллельных потоков: спящий поток зря занимает ресурсы CI
- Маскировка проблем производительности: медленное приложение скрывается за sleep, а не выявляется
Решение
Заменить каждый sleep на ожидание конкретного условия:
// ❌
cartPage.clickCheckout();
Thread.sleep(2000);
checkoutPage.fillAddress(address);
Thread.sleep(1500);
checkoutPage.confirm();
Thread.sleep(3000);
// ✅
cartPage.clickCheckout();
waitFor(urlContains("/checkout"));
checkoutPage.fillAddress(address);
waitFor(ExpectedConditions.elementToBeClickable(paymentSelector));
checkoutPage.confirm();
waitFor(urlContains("/confirmation"));