Установка Playwright решает две задачи сразу: ставит тестовый раннер и завозит браузерные движки, которыми он управляет. Это важно понять с самого начала, потому что пакет и браузеры - разные сущности с разным жизненным циклом. Раннер - обычная npm-зависимость, а Chromium, Firefox и WebKit - отдельные бинарники, которые Playwright скачивает и хранит в своём кэше, а не в node_modules проекта.
Рекомендуемый путь - официальный генератор npm init playwright@latest. Он не просто ставит пакет: задаёт несколько вопросов и разворачивает готовую структуру. Для TypeScript-проекта разумные ответы - положить тесты в каталог e2e, добавить workflow GitHub Actions и сразу установить браузеры. На выходе получается рабочий playwright.config.ts, пример теста и настроенный CI, от которых можно отталкиваться, а не собирать всё вручную.
Когда проект уже существует и нужен только раннер, установка ручная и такая же короткая. Пакет @playwright/test ставится dev-зависимостью, а браузеры завозит отдельная команда npx playwright install. Разделение неслучайно: обновление npm-пакета и обновление движков - два разных действия, и Playwright намеренно не тянет сотни мегабайт бинарников через обычный npm-граф.
В Linux-окружении CI одних бинарников мало: браузерам нужны системные библиотеки - шрифты, графические и звуковые зависимости. Для этого есть npx playwright install --with-deps: он ставит и браузеры, и их системные зависимости одной командой. Это стандартный шаг в CI-пайплайне; без него браузер на чистой ubuntu-машине просто не запустится, и тесты упадут ещё до первого сценария.
Ключевое правило эксплуатации - держать версию пакета и версию браузеров согласованными. Бинарники версионируются вместе с раннером: конкретной версии @playwright/test соответствует конкретный набор браузеров. Поэтому после обновления пакета сразу прогоняют install той же версией - иначе тесты будут гоняться на движках, для которых раннер не рассчитан, и поведение начнёт расходиться с ожидаемым.
Полезно один раз зафиксировать обе команды - генератор для нового проекта и ручную установку для существующего, - чтобы не вспоминать их каждый раз. Ниже собраны оба варианта плюс шаг для Linux CI; к этой карте возвращаешься при заведении нового окружения или починке сломанной установки.
Отдельная тема - что не должно попасть в репозиторий. Кэш браузеров - это сотни мегабайт бинарников, привязанных к платформе; коммитить его бессмысленно и вредно, он раздувает историю и всё равно не переносится между ОС. Браузеры устанавливают из чистого состояния на каждой машине командой install, а в CI кэшируют средствами самого CI, а не через git.
Типичные провалы установки предсказуемы. Забыть --with-deps в Linux CI - и получить падение запуска браузера на ровном месте, которое выглядит как загадочная ошибка теста. Обновить @playwright/test, но не обновить браузеры - и ловить расхождения поведения между локалью и CI. И закоммитить browser cache, раздув репозиторий бинарниками, которые всё равно придётся переустанавливать. Ставьте пакет и браузеры согласованно и держите кэш вне git.
# Рекомендуемый генератор нового проекта
npm init playwright@latest
# Ответы для TypeScript-проекта:
# Where to put tests? e2e
# Add GitHub Actions? yes
# Install browsers? yes# Ручная установка в существующий проект
npm i -D @playwright/test
npx playwright install
# Linux CI - браузеры плюс системные зависимости
npx playwright install --with-deps