跳转到主要内容

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 信号,如果在 500ms 内未退出,随后发送 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 其中之一。如果同时指定了 urlwait,则当满足至少一个条件时,认为服务器已启动。
wait仅当产生特定输出时才认为命令已启动。接受一个对象,其中包含可选的 stdout 和/或 stderr 正则表达式。正则表达式中的命名捕获组会存储在环境变量中,例如 /Listening on port (?<my_server_port>\d+)/ 会将端口号存储在 process.env['MY_SERVER_PORT'] 中。如果同时指定了 urlwait,则当满足至少一个条件时,认为服务器已启动。

添加服务器超时

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',
},
});