跳转到主要内容

Web 服务器

简介

Playwright 在配置文件中提供了一个 webServer 选项,它允许你在运行测试之前启动一个本地开发服务器。这非常适合在开发过程中编写测试,并且当你没有可以测试的暂存或生产环境 URL 时。

配置 Web 服务器

在 Playwright 配置中使用 webServer 属性,在测试期间启动开发 Web 服务器。

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

export default defineConfig({
// Run your local dev server before starting the tests
webServer: {
command: 'npm run start',
url: 'https://:3000',
reuseExistingServer: !process.env.CI,
stdout: 'ignore',
stderr: 'pipe',
},
});
属性描述
testConfig.webServer在测试期间启动一个(或多个)开发 Web 服务器。
command启动应用程序本地开发服务器的 shell 命令。
cwd生成进程的当前工作目录,默认为配置文件所在的目录。
env命令的环境变量。默认为继承 process.env 并在其中添加 PLAYWRIGHT_TEST=1
gracefulShutdown如何关闭进程。如果未指定,进程组将被强制 SIGKILL。如果设置为 { signal: 'SIGTERM', timeout: 500 },进程组将收到一个 SIGTERM 信号,如果在 500 毫秒内没有退出,将发送 SIGKILL。你也可以使用 SIGINT 作为信号。0 的超时意味着不会发送 SIGKILL。Windows 不支持 SIGTERMSIGINT 信号,因此此选项在 Windows 上将被忽略。请注意,关闭 Docker 容器需要 SIGTERM
ignoreHTTPSErrors是否在获取 url 时忽略 HTTPS 错误。默认为 false
name为 Web 服务器指定一个自定义名称。此名称将作为日志消息的前缀。默认为 [WebServer]
port已弃用。请改用 url。你的 http 服务器预期出现的端口。它会等到接受连接才返回。应指定 porturl 中的一个。
reuseExistingServer如果为 true,则在可用时重用 porturl 上的现有服务器。如果该 porturl 上没有正在运行的服务器,它将运行命令以启动一个新服务器。如果为 false,如果在 porturl 上有现有进程正在监听,它将抛出错误。这通常应设置为 !process.env.CI,以便在本地运行测试时允许使用本地开发服务器。
stderr是否将命令的 stderr 管道传输到进程的 stderr 或忽略它。默认为 "pipe"
stdout如果为 "pipe",它将把命令的 stdout 管道传输到进程的 stdout。如果为 "ignore",它将忽略命令的 stdout。默认为 "ignore"
timeout等待进程启动并可用的时间长度(以毫秒为单位)。默认为 60000。
url你的 http 服务器的 URL,当服务器准备好接受连接时,该 URL 预期返回 2xx、3xx、400、401、402 或 403 状态码。应指定 porturl 中的一个。
wait仅在生成给定输出后才考虑命令已启动。接受一个包含可选 stdout 和/或 stderr 正则表达式的对象。正则表达式中的命名捕获组存储在环境变量中,例如 /Listening on port (?<my_server_port>\d+)/ 会将端口号存储在 process.env['MY_SERVER_PORT'] 中。

添加服务器超时

Web 服务器有时可能需要更长时间才能启动。在这种情况下,你可以增加超时时间来等待服务器启动。

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

export default defineConfig({
// Rest of your config...

// Run your local dev server before starting the tests
webServer: {
command: 'npm run start',
url: 'https://:3000',
reuseExistingServer: !process.env.CI,
timeout: 120 * 1000,
},
});

添加 baseURL

建议也在配置的 use: {} 部分指定 baseURL,以便测试可以使用相对 URL,并且你无需反复指定完整 URL。

当使用 page.goto()page.route()page.waitForURL()page.waitForRequest()page.waitForResponse() 时,它会通过使用 URL() 构造函数来构建相应的 URL,从而考虑基础 URL。例如,通过将 baseURL 设置为 https://:3000 并在测试中导航到 /login,Playwright 将使用 https://:3000/login 运行测试。

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

export default defineConfig({
// Rest of your config...

// Run your local dev server before starting the tests
webServer: {
command: 'npm run start',
url: 'https://:3000',
reuseExistingServer: !process.env.CI,
},
use: {
baseURL: 'https://:3000',
},
});

现在你可以在导航页面时使用相对路径

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

test('test', async ({ page }) => {
// This will navigate to https://:3000/login
await page.goto('./login');
});

多个 Web 服务器

可以通过提供 webServer 配置数组来同时启动多个 Web 服务器(或后台进程)。有关更多信息,请参阅 testConfig.webServer

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

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