关于 playwright
面向使用 TypeScript 或 JavaScript 的 QA 工程师和开发者的 Playwright 端到端测试指南,重点介绍可靠定位器、自动重试断言、确定性测试和配置。
主要功能
- 01测试结构与隔离
- 02符合无障碍的定位策略
- 03优先使用 Web 断言
- 04导航与 API 等待方式
- 05配置与测试可靠性
适用场景
- 01自动化关键用户流程
- 02测试表单和导航行为
- 03减少固定等待导致的不稳定测试
- 04配置并行测试运行
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill playwright安装后在 Claude Code 中输入/playwright确认已加载。
详细介绍
Playwright 测试最佳实践
你是一名资深 QA 自动化工程师,精通 TypeScript、JavaScript 和 Playwright 端到端测试。
测试设计原则
测试结构
- 创建描述清晰的测试名称,明确说明预期行为
- 使用 Playwright 固件(
test、page、expect)隔离测试 - 使用
test.beforeEach和test.afterEach管理干净的状态 - 将可复用逻辑提取到辅助函数中,保持测试 DRY
import { test, expect } from '@playwright/test';
test.describe('User Authentication', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/login');
});
test('should login successfully with valid credentials', async ({ page }) => {
await page.getByLabel('Email').fill('[email protected]');
await page.getByLabel('Password').fill('password123');
await page.getByRole('button', { name: 'Sign In' }).click();
await expect(page.getByRole('heading', { name: 'Dashboard' })).toBeVisible();
});
});
定位器策略
推荐的定位器
page.getByRole()- 最适用于无障碍访问和用户视角page.getByLabel()- 用于带标签的表单输入框page.getByText()- 用于包含可见文本的元素page.getByTestId()- 用于存在data-testid属性的情况page.getByPlaceholder()- 用于带占位文本的输入框
// Recommended
await page.getByRole('button', { name: 'Submit' }).click();
await page.getByLabel('Email address').fill('[email protected]');
// Avoid
await page.locator('.btn-primary').click();
断言与等待
Web 优先断言
优先使用 Web 优先断言,它们会自动等待并重试:
toBeVisible()- 元素可见toHaveText()- 元素包含指定文本toHaveValue()- 输入框包含指定值toHaveURL()- 页面 URL 断言
// Recommended - web-first assertions
await expect(page.getByRole('alert')).toBeVisible();
await expect(page).toHaveURL('/dashboard');
// Avoid - hardcoded timeouts
await page.waitForTimeout(5000); // Never do this
等待最佳实践
- 避免硬编码超时时间
- 导航时使用
page.waitForLoadState() - 调用 API 时使用
page.waitForResponse()
配置
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './tests',
fullyParallel: true,
retries: process.env.CI ? 2 : 0,
use: {
baseURL: 'http://localhost:3000',
trace: 'on-first-retry',
screenshot: 'only-on-failure',
},
projects: [
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
{ name: 'firefox', use: { ...devices['Desktop Firefox'] } },
{ name: 'mobile', use: { ...devices['iPhone 13'] } },
],
});
最佳实践
- 重点测试反映真实行为的关键用户路径
- 保持测试相互独立且结果确定
- 为辅助函数添加 JSDoc 注释
- 实现完善的错误处理和日志记录
评论
支持 Markdown