Когда клонируешь репозиторий с тестами Playwright и получаешь Cannot find module '@playwright/test', причина одна: забыл запустить npm install. Папка node_modules никогда не коммитится в репозиторий, потому что весит несколько сотен мегабайт, а npm install пересоздаёт её из package.json за секунды. Вторая частая ошибка, Executable doesn't exist at /home/user/.cache/ms-playwright/chromium-XXX, означает что бинарники браузеров устарели и нужен npx playwright install. Гайд объясняет что контролируют package.json, package-lock.json и node_modules, какие команды запускать регулярно, и что означают префиксы ^ и ~ перед версиями пакетов.
Что такое npm
npm (Node Package Manager) делает три вещи: хранит реестр JavaScript-пакетов (больше 2 миллионов), скачивает пакеты из реестра в твой проект и отслеживает какие пакеты нужны проекту.Когда разработчик пишет полезный код, он публикует его как пакет на npm. Остальные устанавливают этот пакет вместо того чтобы писать то же самое с нуля.
Playwright, TypeScript, ESLint, Faker.js, dotenv: всё это npm-пакеты которые составляют типичный стек автоматизации тестирования.
Файл package.json
В каждом Node.js-проекте есть package.json. Это дескриптор проекта: что это за проект, что ему нужно и как его запускать.
Типичный package.json Playwright-проекта выглядит так:
{
"name": "my-playwright-tests",
"version": "1.0.0",
"scripts": {
"test": "npx playwright test",
"test:headed": "npx playwright test --headed",
"test:ui": "npx playwright test --ui"
},
"devDependencies": {
"@playwright/test": "^1.44.0",
"typescript": "^5.4.5"
}
}Основные секции
name: название проектаscripts: команды которые запускаются черезnpm rundevDependencies: пакеты нужные только в разработке (тест-инструменты, линтеры)dependencies: пакеты нужные в продакшне (в проектах только с тестами не используется)
dependencies и devDependencies
| | dependencies | devDependencies |
|-|----------------|------------------|
| Когда нужны | В продакшне (запуск приложения) | Только в разработке (сборка, тесты, линтинг) |
| Примеры | express, react, axios | playwright, typescript, eslint |
| Флаг установки | npm install package-name | npm install -D package-name |
В QA-репозиториях почти всё идёт в devDependencies. Ты строишь инструментарий для тестирования, не продакшн-приложение.
Папка node_modules
Когда запускаешь npm install, npm:
1. Читает package.json
2. Скачивает все указанные пакеты из реестра
3. Кладёт их в node_modules/
4. Устанавливает ВСЕ ЗАВИСИМОСТИ этих пакетов (и их зависимостей...)
Поэтому node_modules содержит тысячи файлов даже если в проекте всего три прямые зависимости. Playwright, например, тянет за собой десятки пакетов которые использует внутри.
Файлы внутри node_modules не трогай напрямую: ими управляет npm.
В git папку тоже не коммить. Она весит сотни мегабайт. В репозиторий идут package.json и package-lock.json, а клонировавший проект запускает npm install чтобы восстановить node_modules.
Проверь .gitignore:
node_modules/Эта строка должна там быть. Если нет, добавь.
package-lock.json
При установке пакетов npm создаёт или обновляет package-lock.json. В нём записаны точные версии каждого установленного пакета, включая транзитивные зависимости.
package.json может указывать "playwright": "^1.44.0" (то есть 1.44.0 или любую совместимую новее). package-lock.json фиксирует конкретную версию которая была установлена. Это гарантирует что у всех в команде одинаковые версии зависимостей.
package-lock.json коммить в git. В отличие от node_modules, он маленький и детерминированный.
Основные npm-команды
# Установить все зависимости из package.json
npm install
# Установить пакет и добавить в devDependencies
npm install -D @faker-js/faker
# Установить пакет и добавить в dependencies
npm install dotenv
# Удалить пакет
npm uninstall @faker-js/faker
# Обновить все пакеты до последних совместимых версий
npm update
# Проверить пакеты на известные уязвимости
npm audit
# Исправить уязвимости автоматически (где возможно)
npm audit fix
# Запустить скрипт из package.json
npm run test
npm run test:headed
# Список всех установленных пакетов
npm list --depth=0
# Версия конкретного пакета
npm list playwrightКоманда npx
npx запускает npm-пакет без глобальной установки. С Playwright она встречается постоянно:
# Запустить тест-раннер Playwright (использует локальную версию из node_modules)
npx playwright test
# Установить браузеры Playwright
npx playwright install
# Открыть UI-режим Playwright
npx playwright test --ui
# Запустить codegen
npx playwright codegen https://lab.becomeqa.comКогда запускаешь npx playwright test, команда находит Playwright в локальной папке node_modules/.bin/ и запускает именно его. Так ты используешь версию проекта, а не глобально установленную.
Настройка нового Playwright-проекта с нуля
# Создать директорию и войти в неё
mkdir my-test-project && cd my-test-project
# Инициализировать npm-проект (создаёт package.json)
npm init -y
# Установить Playwright
npm init playwright@latest
# Готово — Playwright устанавливает себя и зависимостиЕсли добавляешь Playwright в существующий проект:
npm install -D @playwright/test
npx playwright installЧастые ошибки и способы исправления
Ошибка "Cannot find module"
Error: Cannot find module '@playwright/test'Запусти npm install. Скорее всего клонировал репозиторий и забыл установить зависимости.
Устаревшие браузеры Playwright
Error: Executable doesn't exist at /home/user/.cache/ms-playwright/chromium-XXXЗапусти npx playwright install. Бинарники браузеров нужно обновить.
Уязвимости безопасности
found 3 vulnerabilities (1 moderate, 2 high)Запусти npm audit fix. Посмотри что обновляется. Для неисправимых уязвимостей проверь: они в devDependencies? Для тестового кода риск ниже.
Конфликты node_modules после git pull
Если кто-то обновил зависимости, твои локальные node_modules могут устареть:
rm -rf node_modules
npm installРадикально, но всегда работает.
Префиксы версий ^ и ~
В package.json:
"@playwright/test": "^1.44.0"| Символ | Значение | Пример |
|--------|----------|--------|
| ^1.44.0 | Совместимо с 1.44.0 (обновляет minor и patch) | Принимает 1.45.0, 1.50.0, но не 2.0.0 |
| ~1.44.0 | Примерно 1.44.0 (обновляет только patch) | Принимает 1.44.1, 1.44.9, но не 1.45.0 |
| 1.44.0 | Ровно 1.44.0 | Обновлений нет |
В проектах с тестами стандарт: ^ (каретка). Держит актуальными minor-улучшения и защищает от мажорных ломающих изменений.
Что QA-инженеру нужно знать
Нужно понимать
- Что делает
npm installи когда запускать (всегда после клонирования, после обновленияpackage.json) - Что содержит
package.jsonи как его читать - Разницу между
dependenciesиdevDependencies - Как работает
npm run test(запускает скриптtestизpackage.json) - Почему
node_modulesне коммитится в git
Не нужно знать
Как публиковать пакеты на npm, как работает реестр пакетов изнутри, и про Yarn или pnpm (альтернативные пакетные менеджеры): они делают то же самое, Playwright работает с любым.
Этого достаточно чтобы настраивать проекты, устанавливать зависимости, запускать тесты и разбираться с типичными проблемами настройки.
→ See also: Установка Playwright: пошаговое руководство (2026) | JavaScript для QA-инженеров: необходимый минимум для автоматизации | TypeScript для QA: почему статическая типизация улучшает тесты