Захватывает реальные ответы API, пока ваш набор Playwright выполняется локально, а затем воспроизводит их байт-в-байт в CI. Без бэкенда, без сети и без моков, написанных вручную, которые нужно поддерживать.
MIT · TypeScript · работает с SSR Next.js и TanStack Start, SPA и расширениями Chrome · поддержка WebSocket
npx playwright test
REC · MODE=record · local run
your appproxyreal API
⤓
saved e2e/recordings/todos.GET.mock.json
▶
REPLAY · MODE=replay · CI
your appproxydisk
✓
200 OK · 3 ms · zero network
Посмотрите, как он записывает, а затем воспроизводит
Один прогон Playwright записывает реальные ответы на диск; переключитесь на воспроизведение — и тот же набор тестов пройдёт с выключенным бэкендом, без сети.
Два записывающих механизма, один прокси
Запросы исходят из двух мест, поэтому есть два механизма записи. Используйте любой — или оба вместе. Оба записывают один раз и воспроизводят с диска, поэтому CI работает с выключенным бэкендом и без моков, написанных вручную.
Прокси
.mock.json
Next.js / TanStack Start SSR → прокси → реальный API
Находится между вашим сервером и API. Записывает серверные запросы — SSR-fetch, route handlers и всё, что вызывает ваш backend-for-frontend.
Для full-stack-приложений, где сервер вызывает API.
Инструменты для моков хороши в разных задачах. Приведённая ниже комбинация — запись реального трафика через SSR, браузер и WebSocket без моков, написанных вручную, — это ниша, которую остальные оставляют незакрытой.
Сравнение возможностей test-proxy-recorder с routeFromHAR в Playwright, MSW, Polly.js, playwright-network-cache и Mocky Balboa.
Возможность
test-proxy-recorder
Playwright routeFromHAR
MSW
Polly.js
playwright-network-cache
Mocky Balboa
Запись реального трафика
✓ Да
✓ Да
✕ Нет
✓ Да
✓ Да
✕ Нет
Серверная сторона (SSR)
✓ Да
✕ Нет
✓ Да
~ Частично
✕ Нет
✓ Да
Сторона браузера
✓ Да
✓ Да
✓ Да
✓ Да
✓ Да
✓ Да
WebSocket
✓ Да
✕ Нет
✓ Да
✕ Нет
✕ Нет
✕ Нет
Нативно для Playwright
✓ Да
✓ Да
✕ Нет
✕ Нет
✓ Да
✓ Да
Поддерживается
✓ Да
✓ Да
✓ Да
✕ Нет
✓ Да
✓ Да
~ Polly.js перехватывает HTTP в Node, поэтому мокинг SSR возможен внутри процесса приложения, но не как часть прогона Playwright. MSW и Mocky Balboa тоже воспроизводят реальные ответы — но моки вы пишете вручную. О том, когда стоит выбрать что-то другое, рассказано в документации.
Работает с вашим реальным провайдером аутентификации
Входите через Cognito, Auth0, Clerk или WorkOS — по-настоящему, при каждом прогоне. Записывается только API вашего приложения; аутентификация остаётся живой, ваши данные уходят офлайн.
// e2e/auth.setup.ts — log in for real, once. Never recorded.
Разверните всё одной командой, направьте ваш API на прокси, затем запишите и закоммитьте. Приложение только для браузера? init пропустит шаг SSR за вас.
Самый быстрый путь: отдайте это вашему AI-агенту
Скопируйте это, подставьте URL вашего бэкенда и вставьте в Claude Code, Cursor или любого кодинг-агента — он запустит init и доделает проводку по подсказке, которую init печатает.
Set up test-proxy-recorder for end-to-end tests in this project, then follow the
instructions that `init` prints. Run these commands:
npx @tanstack/intent@latest install
npm install --save-dev test-proxy-recorder
Then run init, passing this project's backend API base URL as the target — find
it yourself from the app's env/config (the URL the app calls in dev); don't
Единственное, что init не может угадать: какая переменная окружения хранит базовый URL вашего API. Направьте её на прокси, когда рекордер включён, на реальный бэкенд в остальных случаях — прокси никогда не запускается в продакшене.
// Point your app at the proxy when the recorder is enabled, at the real backend otherwise.
// The proxy never runs in production — TEST_PROXY_RECORDER_ENABLED is set only for e2e.
registerProxyFetch(); // no-op in production unless TEST_PROXY_RECORDER_ENABLED=true
Запись, коммит, воспроизведение
Задайте MODE = 'record', запустите один раз против реального API, затем переключите на 'replay' и закоммитьте. Записи живут в git — именно это делает CI детерминированным. Не добавляйте их в .gitignore.
Если это сэкономило вам полдня, звезда займёт одну секунду — именно так следующий человек найдёт проект, а соло-мейнтейнер поймёт, что нужно продолжать. Наткнулись на проблему или есть идея? Создайте issue или присоединяйтесь к Discord.