Жёсткие задержки (Hard-coded Sleeps)
Thread.sleep используется для ожидания загрузки страницы или появления элемента. Значение задержки берётся «на глаз» и вшивается прямо в код.
Симптомы
-
Thread.sleep(3000)после клика или навигации - Магические числа:
sleep(1000),sleep(5000)без комментария -
TimeUnit.SECONDS.sleep(2)в Page Object или тест-методе - Переменная
WAIT_TIMEOUT = 3000в константах, применяемая через sleep
Причины возникновения
- Самый очевидный способ «подождать»: разработчик добавил sleep и тест прошёл
- Незнание Selenium Explicit/Fluent Wait API
- Копипаста из статей и туториалов пятилетней давности
- Давление сроков: «работает — не трогай»
Почему это проблема
- Медленные тесты: 10 sleep по 2 сек — это минус 20 секунд на каждый прогон; при 100 тестах — уже полчаса
- Нестабильность на CI: сервер под нагрузкой отвечает медленнее, 2 секунды не хватает — тест падает флакиво
- Ложная надёжность: на быстрой машине тест всегда зелёный, хотя реальный пользователь может ждать дольше
- Невозможно параллелизировать: каждый поток блокируется на sleep, не делая полезной работы
Решение
Заменить на явное ожидание конкретного условия:
// ❌
loginPage.clickLogin();
Thread.sleep(3000);
assertThat(dashboardPage.getWelcomeText()).contains("Добро пожаловать");
// ✅
loginPage.clickLogin();
assertThat(dashboardPage.waitUntilVisible().getWelcomeText())
.contains("Добро пожаловать");