Перейти к основному содержимому

Веб-сервер

Введение

В Playwright есть опция webServer в файле конфигурации, которая позволяет запускать локальный dev-сервер перед выполнением тестов. Это идеально при написании тестов во время разработки, а также когда у вас нет staging- или production-URL для тестирования.

Настройка веб-сервера

Используйте свойство webServer в конфигурации Playwright, чтобы запускать dev-веб‑сервер во время выполнения тестов.

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
// Запустите ваш локальный сервер разработки перед началом тестов
webServer: {
command: 'npm run start',
url: 'http://localhost:3000',
reuseExistingServer: !process.env.CI,
stdout: 'ignore',
stderr: 'pipe',
},
});
СвойствоОписание
testConfig.webServerЗапускает dev-веб‑сервер (или несколько) во время тестов.
commandКоманда shell для запуска локального dev-сервера вашего приложения.
cwdТекущая рабочая директория запущенного процесса; по умолчанию — директория файла конфигурации.
envПеременные окружения для команды. По умолчанию наследуются из process.env, дополнительно добавляется PLAYWRIGHT_TEST=1.
gracefulShutdownКак завершать процесс. Если не указано, группа процессов принудительно завершается с помощью SIGKILL. Если задано { signal: 'SIGTERM', timeout: 500 }, группе процессов отправляется сигнал SIGTERM, а затем — SIGKILL, если она не завершится в течение 500 мс. В качестве сигнала также можно использовать SIGINT. Таймаут 0 означает, что SIGKILL отправлен не будет. Windows не поддерживает сигналы SIGTERM и SIGINT, поэтому на Windows эта опция игнорируется. Обратите внимание: для остановки Docker-контейнера требуется SIGTERM.
ignoreHTTPSErrorsИгнорировать ли ошибки HTTPS при обращении к url. По умолчанию false.
nameЗадаёт пользовательское имя для веб‑сервера. Это имя будет добавляться в начало сообщений логов. По умолчанию [WebServer].
portУстарело. Используйте url. Порт, на котором ожидается HTTP-сервер. Playwright будет ждать, пока сервер начнёт принимать подключения. Нужно указать либо port, либо url.
reuseExistingServerЕсли true, будет переиспользован уже запущенный сервер на port или url, если он доступен. Если на port или url ничего не запущено, будет выполнена команда для старта нового сервера. Если false, будет выброшена ошибка, если какой‑то процесс уже слушает port или url. Обычно это задают как !process.env.CI, чтобы при локальном запуске тестов можно было использовать локальный dev-сервер.
stderrПробрасывать ли stderr команды в stderr процесса или игнорировать его. По умолчанию "pipe".
stdoutЕсли "pipe", stdout команды будет пробрасываться в stdout процесса. Если "ignore", stdout команды будет игнорироваться. По умолчанию "ignore".
timeoutСколько времени ждать запуска процесса и его доступности, в миллисекундах. По умолчанию 60000.
urlURL вашего HTTP-сервера, который должен вернуть статус 2xx, 3xx, 400, 401, 402 или 403, когда сервер будет готов принимать подключения. Нужно указать либо port, либо url.
waitСчитать команду запущенной только после того, как появится указанный вывод. Принимает объект с необязательными регулярными выражениями stdout и/или stderr. Именованные группы захвата в regex сохраняются в переменные окружения; например, /Listening on port (?<my_server_port>\\d+)/ сохранит номер порта в process.env['MY_SERVER_PORT'].

Добавление таймаута для сервера

Веб-серверам иногда требуется больше времени для запуска. В этом случае вы можете увеличить таймаут, чтобы дождаться старта сервера.

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
// Остальная часть вашей конфигурации...

// Запустите ваш локальный сервер разработки перед началом тестов
webServer: {
command: 'npm run start',
url: 'http://localhost:3000',
reuseExistingServer: !process.env.CI,
timeout: 120 * 1000,
},
});

Добавление baseURL

Также рекомендуется указать baseURL в секции use: {} вашей конфигурации, чтобы тесты могли использовать относительные URL и вам не приходилось постоянно указывать полный URL.

При использовании page.goto(), page.route(), page.waitForURL(), page.waitForRequest() или page.waitForResponse() учитывается базовый URL с помощью конструктора URL() для построения соответствующего URL. Например, установив baseURL на http://localhost:3000 и переходя к /login в ваших тестах, Playwright выполнит тест, используя http://localhost:3000/login.

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
// Остальная часть вашей конфигурации...

// Запустите ваш локальный сервер разработки перед началом тестов
webServer: {
command: 'npm run start',
url: 'http://localhost:3000',
reuseExistingServer: !process.env.CI,
},
use: {
baseURL: 'http://localhost:3000',
},
});

Теперь вы можете использовать относительный путь при навигации по странице:

test.spec.ts
import { test } from '@playwright/test';

test('test', async ({ page }) => {
// Это приведет к переходу на http://localhost:3000/login
await page.goto('./login');
});

Несколько веб-серверов

Несколько веб-серверов (или фоновых процессов) могут быть запущены одновременно, предоставив массив конфигураций webServer. См. testConfig.webServer для получения дополнительной информации.

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
webServer: [
{
command: 'npm run start',
url: 'http://localhost:3000',
name: 'Frontend',
timeout: 120 * 1000,
reuseExistingServer: !process.env.CI,
},
{
command: 'npm run backend',
url: 'http://localhost:3333',
name: 'Backend',
timeout: 120 * 1000,
reuseExistingServer: !process.env.CI,
}
],
use: {
baseURL: 'http://localhost:3000',
},
});