Какой опыт работы с асинхронностью и TypeScript в Playwright?
Что проверяют
Понимаете ли вы, что каждое действие в Playwright асинхронное, и умеете ли полагаться на встроенные ожидания вместо ручных пауз. Следом часто спрашивают, как вы ловите пропущенный await и как ждёте сетевой ответ после клика.
Как отвечать
Покажите, что работаете через @playwright/test, а не через голый скрипт с chromium.launch():
- локаторы:
page.getByRole('button', { name: 'Отправить' }),getByTestId,locator(). Локатор ленивый и перед действием сам ждёт, пока элемент станет видимым, стабильным и доступным. СвязкаwaitForSelectorиElementHandleсчитается устаревшим подходом; - web-first проверки:
await expect(locator).toBeVisible()иtoHaveText()повторяют проверку до таймаута. Разовая проверкаexpect(await locator.isVisible()).toBe(true)так не умеет и даёт нестабильные тесты; - ожидание события: промис создаётся до действия, иначе событие можно пропустить:
const resp = page.waitForResponse('**/api/orders'); await button.click(); await resp;; - параллельность: независимые операции можно собрать в
Promise.all, но шаги сценария идут последовательно, иначе порядок действий становится случайным; - TypeScript: типизированные фикстуры через
test.extend<{ loginPage: LoginPage }>(), Page Object в виде классов. Playwright транспилирует TS, но не проверяет типы, поэтому в CI нужен отдельныйtsc --noEmit.
Таймауты у Playwright есть по умолчанию: 30 секунд на тест и 5 секунд на expect, их меняют в playwright.config.ts. Хорошо звучит пример, как вы нашли причину нестабильного теста через trace viewer.
Где спотыкаются
Забывают await перед действием или expect. Тест проходит зелёным, а проверка на самом деле не выполнилась. Ловят это правило @typescript-eslint/no-floating-promises и плагин eslint-plugin-playwright.
Лечат нестабильность через page.waitForTimeout(3000). Это прячет проблему и замедляет прогон, правильнее ждать конкретное состояние.
Путают асинхронность с параллельностью: думают, что async сам по себе ускоряет тесты. Параллельный запуск настраивается числом воркеров и fullyParallel в конфиге.