Как решать проблемы с нестабильными тестами и использовать локаторы?
Что проверяют
Умеете ли вы отличить нестабильный тест от нестабильного продукта и лечить причину, а не заглушать симптом повторными запусками. Следом почти всегда просят назвать, какой локатор вы выберете для конкретной кнопки и почему.
Как отвечать
Флаки-тест сначала ловят и воспроизводят: гоняют один тест много раз подряд (--repeat-each в Playwright, плагин pytest-repeat), смотрят историю падений в CI, собирают трейс, скриншот и видео в момент падения. Причины, которые встречаются чаще всего:
- гонки с интерфейсом: тест кликает раньше, чем элемент готов. Лечится явным ожиданием условия:
WebDriverWaitсExpectedConditionsв Selenium, в Playwright автоожидание и проверки видаexpect(locator).toBeVisible().Thread.sleepиtime.sleepне лечат, а прячут проблему и замедляют прогон; - общие данные: тесты зависят от порядка запуска или делят одного пользователя при параллельном прогоне. Каждый тест создаёт свои данные через API;
- окружение: внешние сервисы, сеть, анимации, часовой пояс. Внешнее мокают, анимации отключают;
- перерисовка DOM: в Selenium это
StaleElementReferenceException, элемент нужно искать заново, а не хранить ссылку.
По локаторам порядок предпочтения такой: атрибут для тестов (data-testid, в Playwright getByTestId), роль и доступное имя (getByRole), видимый текст. Абсолютный XPath вида /html/body/div[3]/... и сгенерированные классы вроде .css-1a2b3c ломаются от любой правки вёрстки. Хороший локатор находит ровно один элемент: Playwright в строгом режиме сам падает, если совпадений несколько.
Тест, который пока не удалось починить, уходит в карантин с задачей, а не висит в общем прогоне.
Где спотыкаются
Включают автоматические перезапуски и считают вопрос закрытым. Если тест проходит со второй попытки, это всё ещё баг теста или продукта.
Смешивают неявные и явные ожидания в Selenium. Документация прямо не советует так делать: время ожидания становится непредсказуемым.
Отвечают только про локаторы, хотя причина большинства флаков в данных и окружении. Сменив XPath на data-testid, гонку за общим аккаунтом не вылечить.