Есть ли встроенная обработка динамических элементов в Playwright и как она работает?
Что проверяют
Понимаете ли вы, что в Playwright ожидания встроены в сами действия и проверки, и не тащите ли привычки из Selenium с явными ожиданиями и паузами. Следом обычно спрашивают, как вы боретесь с нестабильными тестами и чем Locator отличается от ElementHandle.
Как отвечать
Да, встроенная обработка есть, и держится она на трёх механизмах:
- auto-waiting: перед действием Playwright проверяет actionability. Для
click()элемент должен быть в DOM, видим, стабилен (не анимируется), принимать события (его ничто не перекрывает) и быть enabled, дляfill()ещё и editable. Проверки повторяются, пока не пройдут или не кончится таймаут; - ленивые локаторы:
page.getByRole('button', { name: 'Сохранить' })не ищет элемент сразу, а находит его заново при каждом действии. Поэтому перерисовка DOM фреймворком не даёт аналогаStaleElementReferenceException. Локатор строгий: если совпало несколько элементов, действие упадёт, а не кликнет в первый попавшийся; - web-first assertions:
await expect(locator).toBeVisible(),toHaveText(),toHaveCount()перезапрашивают состояние до таймаута, по умолчанию 5 секунд дляexpect.
Для сложных случаев есть инструменты точнее: page.waitForResponse(), чтобы дождаться конкретного запроса, expect.poll() для произвольного условия, expect(...).toPass() для повторения целого блока, page.addLocatorHandler() для внезапных оверлеев вроде баннера cookies. page.waitForSelector() и locator.waitFor() работают, но нужны редко: обычно их заменяет проверка через expect.
Добавьте пример из практики: какой элемент был нестабильным и что помогло, локатор по роли или ожидание ответа API.
Где спотыкаются
Ставят page.waitForTimeout(3000). Тест становится и медленным, и нестабильным, документация прямо называет это плохой практикой.
Пишут expect(await locator.isVisible()).toBe(true). isVisible() возвращает состояние на текущий момент без повторов, и проверка начинает падать через раз.
Лечат строгий режим через .first() или force: true. Первое прячет неоднозначный локатор, второе отключает проверки actionability, и тест кликает туда, куда пользователь кликнуть не может.