Цепочки 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"));