持续集成
Playwright 测试可以在 CI 环境中执行。我们为常见的 CI 提供商创建了示例配置。
Introduction
在 CI 上运行测试的 3 个步骤:
Ensure CI agent can run browsers: 在 Linux 代理中使用 我们的 Docker 镜像 或使用 CLI 安装您的依赖项。
Install Playwright:
pip install playwright
playwright install --with-depsRun your tests:
pytest
CI configurations
命令行工具 可用于在 GitHub Actions 上安装所有操作系统依赖项。
GitHub Actions
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r local-requirements.txt
pip install -e .
- name: Ensure browsers are installed
run: python -m playwright install --with-deps
- name: Run your tests
run: pytest
我们在 GitHub Actions 上运行 我们的测试,涵盖 3 个平台(Windows、Linux、macOS)和 3 个浏览器(Chromium、Firefox、WebKit)的矩阵。
GitHub Actions on deployment
这将在 GitHub Deployment 进入 success 状态后开始测试。像 Vercel 这样的服务使用此模式,以便您可以在其部署的环境中运行端到端测试。
name: Playwright Tests
on:
deployment_status:
jobs:
test:
timeout-minutes: 60
runs-on: ubuntu-latest
if: github.event.deployment_status.state == 'success'
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v2
with:
node-version: '14.x'
- name: Install dependencies
run: npm ci
- name: Install Playwright
run: npx playwright install --with-deps
- name: Run Playwright tests
run: npx playwright test
env:
# This might depend on your test-runner/language binding
PLAYWRIGHT_TEST_BASE_URL: ${{ github.event.deployment_status.target_url }}
Docker
我们有一个 预构建的 Docker 镜像,可以直接使用,也可以作为更新现有 Docker 定义的参考。
建议配置
- 使用 Chromium 时也建议使用
--ipc=host——否则 Chromium 可能会耗尽内存并崩溃。在 Docker 文档 中了解有关此选项的更多信息。 - 启动 Chromium 时看到其他奇怪的错误?在本地开发时尝试使用
docker run --cap-add=SYS_ADMIN运行您的容器。 - 建议使用
--initDocker 标志或 dumb-init 以避免对 PID=1 的进程进行特殊处理。这是僵尸进程的常见原因。
GitHub Actions (via containers)
GitHub Actions 支持通过使用 jobs.<job_id>.container 选项 在容器中运行作业。
steps:
playwright:
name: 'Playwright Tests'
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/playwright:v1.28.0-focal
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r local-requirements.txt
pip install -e .
- name: Ensure browsers are installed
run: python -m playwright install --with-deps
- name: Run your tests
run: pytest
Azure Pipelines
对于 Windows 或 macOS 代理,无需其他配置,只需安装 Playwright 并运行您的测试。
对于 Linux 代理,您可以使用 我们的 Docker 容器 以及 Azure Pipelines 支持 运行容器化作业。或者,您可以使用 命令行工具 安装所有必要的依赖项。
要运行 Playwright 测试,请使用此管道任务:
jobs:
- deployment: Run_E2E_Tests
pool:
vmImage: ubuntu-20.04
container: mcr.microsoft.com/playwright:v1.28.0-focal
environment: testing
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: Bash@3
displayName: 'Run Playwright tests'
inputs:
workingDirectory: 'my-e2e-tests'
targetType: 'inline'
failOnStderr: true
env:
CI: true
script: |
npm ci
npx playwright test
如果任何 playwright 测试失败,这将导致管道运行失败。如果您还想将测试结果与 Azure DevOps 集成,请使用 failOnStderr:false 和内置的 PublishTestResults 任务,如下所示:
jobs:
- deployment: Run_E2E_Tests
pool:
vmImage: ubuntu-20.04
container: mcr.microsoft.com/playwright:v1.28.0-focal
environment: testing
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: Bash@3
displayName: 'Run Playwright tests'
inputs:
workingDirectory: 'my-e2e-tests'
targetType: 'inline'
failOnStderr: false
env:
CI: true
script: |
npm ci
npx playwright test
exit 0
- task: PublishTestResults@2
displayName: 'Publish test results'
inputs:
searchFolder: 'my-e2e-tests/test-results'
testResultsFormat: 'JUnit'
testResultsFiles: 'e2e-junit-results.xml'
mergeTestResults: true
failTaskOnFailedTests: true
testRunTitle: 'My End-To-End Tests'
注意:JUnit 报告器需要通过以下方式进行相应配置
在 playwright.config.ts 中。
CircleCI
在 Circle CI 上运行 Playwright 与在 GitHub Actions 上运行非常相似。为了指定预构建的 Playwright Docker 镜像,只需在配置中使用 docker: 修改代理定义,如下所示:
executors:
pw-focal-development:
docker:
- image: mcr.microsoft.com/playwright:v1.28.0-focal
environment:
NODE_ENV: development # Needed if playwright is in `devDependencies`
注意:使用 docker 代理定义时,您是在指定 playwright 运行的资源类为“中等”层 此处。Playwright 的默认行为是将工作进程数设置为检测到的核心数(在中等层的情况下为 2)。将工作进程数覆盖为大于此数字将导致不必要的超时和失败。
同样,如果您通过 Jest 使用 Playwright,那么您可能会遇到生成子进程的错误:
[00:00.0] jest args: --e2e --spec --max-workers=36
Error: spawn ENOMEM
at ChildProcess.spawn (internal/child_process.js:394:11)
这很可能是由于 Jest 自动检测整台机器上的进程数(36)而不是容器允许的进程数(2)。要解决此问题,请在测试命令中设置 jest --maxWorkers=2。
Sharding in Circle CI
Circle CI 中的分片索引为 0,这意味着您需要覆盖默认的并行环境变量。以下示例演示了如何通过将 1 添加到 CIRCLE_NODE_INDEX 以传递到 --shard cli 参数中,从而以 4 的 Circle CI 并行度运行 Playwright。
playwright-job-name:
executor: pw-focal-development
parallelism: 4
steps:
- run: SHARD="$((${CIRCLE_NODE_INDEX}+1))"; npx playwright test -- --shard=${SHARD}/${CIRCLE_NODE_TOTAL}
Jenkins
Jenkins 支持管道的 Docker 代理。使用 Playwright Docker 镜像 在 Jenkins 上运行测试。
pipeline {
agent { docker { image 'mcr.microsoft.com/playwright:v1.28.0-focal' } }
stages {
stage('e2e-tests') {
steps {
// Depends on your language / test framework
sh 'npm install'
sh 'npx playwright test'
}
}
}
}
Bitbucket Pipelines
Bitbucket Pipelines 可以使用公共 Docker 镜像作为构建环境。要在 Bitbucket 上运行 Playwright 测试,请使用我们的公共 Docker 镜像(请参阅 Dockerfile)。
image: mcr.microsoft.com/playwright:v1.28.0-focal
GitLab CI
要在 GitLab 上运行 Playwright 测试,请使用我们的公共 Docker 镜像(请参阅 Dockerfile)。
stages:
- test
tests:
stage: test
image: mcr.microsoft.com/playwright:v1.28.0-focal
script:
...
Caching browsers
默认情况下,Playwright 在安装 Playwright NPM 包时下载浏览器二进制文件。NPM 包有一个 postinstall 钩子,用于下载浏览器二进制文件。此行为可以使用 环境变量 进行自定义。
在 CI 上缓存浏览器是 严格可选的:postinstall 钩子应该在每次运行时执行并下载浏览器二进制文件。
Exception: node_modules are cached (Node-specific)
大多数 CI 提供商缓存 npm-cache 目录(位于 $HOME/.npm)。如果您的 CI 管道缓存 node_modules 目录并且您运行 npm install(而不是 npm ci),则默认配置
将不起作用。这是因为 npm install 步骤将在磁盘上找到 Playwright NPM 包,并且不会执行 postinstall 步骤。
如果您的存储库没有
package-lock.json文件,Travis CI 会自动缓存node_modules。
可以通过以下方法之一修复此行为:
- 改为缓存
$HOME/.npm或 npm-cache 目录。(这是大多数 CI 提供商的默认行为。) - 在运行
npm install之前将PLAYWRIGHT_BROWSERS_PATH=0设置为环境变量。这将在node_modules目录下下载浏览器二进制文件,并将它们与包代码一起缓存。请参阅 管理浏览器二进制文件。 - 使用
npm ci(而不是npm install),它强制执行全新安装:通过删除现有的node_modules目录。请参阅 npm 文档。 - 使用以下步骤缓存浏览器二进制文件。
Directories to cache
在默认行为下,Playwright 将浏览器二进制文件下载到以下目录:
- Windows 上为
%USERPROFILE%\AppData\Local\ms-playwright - MacOS 上为
~/Library/Caches/ms-playwright - Linux 上为
~/.cache/ms-playwright
要在 CI 运行之间缓存浏览器下载,请在 CI 配置中缓存此位置,并使用 Playwright 版本的哈希值。
Debugging browser launches
Playwright 支持 DEBUG 环境变量以在执行期间输出调试日志。在调试 Error: Failed to launch browser 错误时,将其设置为 pw:browser* 很有帮助。
DEBUG=pw:browser* pytest
Running headed
默认情况下,Playwright 以无头模式启动浏览器。这可以通过在启动浏览器时传递标志来更改。
- Sync
- Async
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# Works across chromium, firefox and webkit
browser = p.chromium.launch(headless=False)
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
# Works across chromium, firefox and webkit
browser = await p.chromium.launch(headless=False)
asyncio.run(main())
在 Linux 代理上,有头执行需要安装 Xvfb。我们的 Docker 镜像 和 GitHub Action 已预安装 Xvfb。要使用 Xvfb 在有头模式下运行浏览器,请在 Node.js 命令之前添加 xvfb-run。
xvfb-run python test.py