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 不支持 SIGTERM 和 SIGINT 信号,因此该选项在 Windows 上会被忽略。请注意,关闭 Docker 容器需要 SIGTERM。 |
ignoreHTTPSErrors | 在获取 url 时是否忽略 HTTPS 错误。默认为 false。 |
name | 为 Web 服务器指定自定义名称。此名称将作为日志消息的前缀。默认为 [WebServer]。 |
port | 已弃用。请改用 url。你的 http 服务器预计出现的端口。它会等待直到该端口接受连接。应该指定 port 或 url 其中之一。 |
reuseExistingServer | 如果为 true,则在 port 或 url 上已有服务器可用时,它将重用该服务器。如果该 port 或 url 上没有服务器在运行,它将运行命令启动一个新服务器。如果为 false,则当现有进程正在监听该 port 或 url 时,它将抛出错误。通常应将其设置为 !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 状态码。应该指定 port 或 url 其中之一。如果同时指定了 url 和 wait,则当满足至少一个条件时,认为服务器已启动。 |
wait | 仅当产生特定输出时才认为命令已启动。接受一个对象,其中包含可选的 stdout 和/或 stderr 正则表达式。正则表达式中的命名捕获组会存储在环境变量中,例如 /Listening on port (?<my_server_port>\d+)/ 会将端口号存储在 process.env['MY_SERVER_PORT'] 中。如果同时指定了 url 和 wait,则当满足至少一个条件时,认为服务器已启动。 |
添加服务器超时
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',
},
});