如果你正在寻找一个能同时覆盖Chromium、WebKit和Firefox三大引擎的测试方案,Playwright绝对是当下最值得投入学习的工具。我去年接手一个跨国电商项目时,就深刻体会到它的价值——客户要求确保网站在Safari、Chrome和Firefox上的表现完全一致,而Playwright只用一套脚本就解决了这个难题。
与传统Selenium相比,Playwright有几个杀手级特性:
最近帮团队迁移从Selenium到Playwright后,测试用例执行时间从45分钟缩短到8分钟,这就是现代工具带来的效率革命。
在开始之前,请确保你的MacOS版本不低于Monterey(12.x)。我遇到过有同事在Big Sur上折腾半天,最后发现是系统版本太老的问题。
第一步:安装Homebrew
这个MacOS的包管理器能帮我们省去很多麻烦。如果你还没安装,执行以下命令:
bash复制/bin/bash -c "$(curl -fsSL https://cdn.jsdelivr.net/gh/Homebrew/install/HEAD/install.sh)"
安装完成后记得把brew添加到PATH环境变量:
bash复制echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc
source ~/.zshrc
第二步:安装Node.js环境
Playwright需要Node.js 16+版本,推荐使用LTS版本:
bash复制brew install node@18
验证安装是否成功:
bash复制node -v # 应该显示v18.x.x
npm -v # 应该显示9.x.x
我强烈推荐使用pnpm而不是npm,它的磁盘空间占用只有npm的1/3,安装速度却能快2倍。安装命令很简单:
bash复制brew install pnpm
国内开发者一定要配置镜像源,否则下载Playwright的浏览器引擎时会非常慢:
bash复制pnpm config set registry https://registry.npmmirror.com
pnpm config set @playwright:registry https://registry.npmmirror.com
这个配置会同时加速npm包和Playwright专用二进制文件的下载。
创建一个专门的测试目录是个好习惯,避免污染其他项目:
bash复制mkdir e2e-tests && cd e2e-tests
pnpm init -y
现在执行关键安装命令:
bash复制pnpm create playwright
这个命令会:
第一次执行可能会耗时较久(约5-15分钟,取决于网络),因为要下载三大浏览器引擎。我在公司内网环境实测,配置镜像源后下载速度能从50KB/s提升到8MB/s。
安装完成后,运行以下命令检查环境:
bash复制pnpm exec playwright --version
# 应该输出类似 1.42.0 的版本号
pnpm exec playwright install
# 确保所有依赖浏览器完整安装
建议运行示例测试验证整套环境:
bash复制pnpm exec playwright test
如果看到类似"10 passed"的输出,恭喜你的环境已经就绪!
作为微软的亲儿子,Playwright在VSCode中有官方插件支持。安装"Playwright Test for VSCode"插件后,你会获得:
我特别推荐开启这些配置(在.vscode/settings.json中):
json复制{
"playwright.traceViewer.webServer": {
"enabled": true,
"port": 9323
},
"playwright.showBrowser": true
}
遇到诡异的问题时,这些调试命令能救你的命:
bash复制# 以可视化模式运行测试(能看到浏览器操作过程)
pnpm exec playwright test --headed
# 启动调试模式(配合VSCode断点使用)
pnpm exec playwright test --debug
# 生成操作轨迹报告(超强排查工具)
pnpm exec playwright test --trace on
我最爱的是codegen功能,它能通过录制操作生成测试代码:
bash复制pnpm exec playwright codegen https://example.com
这个命令会启动浏览器和代码生成器,你的每个操作都会实时转换为测试代码,对新手特别友好。
在实际项目中,我们通常需要区分本地开发和CI环境。这是我的playwright.config.js配置模板:
javascript复制const { defineConfig, devices } = require('@playwright/test');
module.exports = defineConfig({
timeout: 30000,
retries: process.env.CI ? 2 : 0,
workers: process.env.CI ? 1 : 3,
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
}
],
webServer: {
command: 'npm run start',
url: 'http://localhost:3000',
reuseExistingServer: !process.env.CI
}
});
问题1:Chromium启动时报错"Failed to launch"
解决:删除缓存重新安装:
bash复制rm -rf ~/.cache/ms-playwright
pnpm exec playwright install
问题2:Safari测试失败率高
解决:在beforeEach中添加稳定化代码:
javascript复制await page.setViewportSize({ width: 1920, height: 1080 });
await page.waitForTimeout(1000); // Safari需要更多稳定时间
问题3:CI环境下截图不一致
解决:配置统一的视窗和字体:
javascript复制context = await browser.newContext({
viewport: { width: 1280, height: 720 },
locale: 'en-US'
});
这是我团队使用的目录结构规范:
code复制e2e/
├── config/
│ └── playwright.config.js
├── fixtures/
│ └── test-data.json
├── pages/
│ ├── home.page.js
│ └── login.page.js
├── tests/
│ ├── auth/
│ │ ├── login.spec.js
│ │ └── logout.spec.js
│ └── checkout/
│ └── flow.spec.js
└── utils/
└── helpers.js
关键设计原则:
一个完整的测试用例应该包含这三个阶段:
javascript复制test('用户登录流程', async ({ page }) => {
// 准备阶段
await page.goto('/login');
const testUser = loadTestData('validUser');
// 执行阶段
await loginPage.fillCredentials(testUser);
await loginPage.submit();
// 验证阶段
await expect(page).toHaveURL(/dashboard/);
await expect(profileMenu).toBeVisible();
});
记住这个黄金法则:一个测试只验证一个业务场景。我见过最糟糕的测试是200行的超级用例,维护起来简直是噩梦。
这是我正在生产环境使用的workflow配置:
yaml复制name: E2E Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
browser: [chromium, webkit]
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
- run: pnpm install
- run: pnpm exec playwright install --with-deps
- run: pnpm exec playwright test --project=${{ matrix.browser }}
- uses: actions/upload-artifact@v3
if: failure()
with:
name: playwright-report
path: playwright-report/
在CI环境中这些配置能显著提升速度:
yaml复制- name: Cache pnpm modules
uses: actions/cache@v3
with:
path: |
~/.pnpm-store
node_modules
key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
javascript复制// playwright.config.js
workers: 4 // 根据CI机器配置调整
bash复制pnpm exec playwright install chromium
最近在优化一个客户项目时,通过这些调整把CI时间从23分钟降到了6分钟。关键是要在parallelization和resource usage之间找到平衡点。