HOOOS

Playwright自动化测试实战:从零编写可靠测试用例的技巧

0 13 凌晨敲代码的喵 Playwright自动化测试Web开发
Apple

当你的Web应用每周迭代3次时——手工点击测试每个按钮的成本会指数级增长。Playwright的独特之处在于它能真实模拟用户操作:在Chromium、Firefox和WebKit三大引擎上并行执行测试,甚至能捕捉到Selenium难以发现的渲染层bug。

环境配置的生死时速

别被官方文档骗了!直接用npm init playwright@latest确实能快速起步,但真实项目需要定制化配置:

// playwright.config.js关键配置
const { devices } = require('@playwright/test');

module.exports = {
  timeout: 30000, // 移动设备需要更长时间
  retries: process.env.CI ? 2 : 0, // CI环境自动重试
  use: {
    trace: 'on-first-retry', // 故障时生成追踪文件
    video: 'retain-on-failure' // 失败的测试保留录像
  },
  projects: [
    {
      name: 'Mobile Chrome',
      use: { ...devices['Pixel 5'] }
    },
    {
      name: 'Desktop Safari',
      use: { ...devices['iPhone 12'] }
    }
  ]
};

遇到npm镜像问题?试试用--registry=https://registry.npmmirror.com加速安装。

测试用例设计的三个段位

青铜段位:基础DOM操作

// 反模式:用class选择器定位动态元素
test('错误的登录测试', async ({ page }) => {
  await page.goto('https://demo.app/login');
  await page.click('.btn-login'); // 明天前端改个class名就挂
});

// 正确姿势:用语义化定位
const loginButton = page.getByRole('button', { name: /登录/i });
await expect(loginButton).toBeVisible();

黄金段位:网络 mocking

模拟API异常情况比测正常流程更重要:

// 拦截特定API返回500错误
test('支付失败场景', async ({ page }) => {
  await page.route('**/api/payment', route => {
    route.fulfill({
      status: 500,
      contentType: 'application/json',
      body: JSON.stringify({ error: '余额不足' })
    });
  });
  // 验证前端是否正确处理错误
  await expect(page.getByText('支付异常')).toBeVisible();
});

王者段位:视觉回归测试

const { test, expect } = require('@playwright/test');

test('首页布局比对', async ({ page }) => {
  await page.goto('https://demo.app');
  await expect(page).toHaveScreenshot({
    maxDiffPixels: 100, // 允许100像素差异
    threshold: 0.2,     // 差异阈值20%
    animations: 'disabled' // 禁用动画
  });
});

调试的超能力

  1. 时间旅行调试
npx playwright test --debug

会启动带VSCode调试器的浏览器,每步操作都能回放

  1. 追踪查看器
npx playwright show-trace trace.zip

三维时间轴显示网络请求、DOM快照和console日志

  1. 智能等待策略
// 传统苦等
await page.waitForTimeout(5000); // ❌浪费生命

// 高级等待
await page.locator('.loading').waitFor({ state: 'hidden' });
await expect(page).toHaveURL(/success/);

CI集成暗坑指南

GitHub Actions配置示例:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
      - run: npm ci
      - run: npx playwright install --with-deps
      - run: npx playwright test
        env:
          CI: true
      - name: Upload traces
        if: failure()
        uses: actions/upload-artifact@v3
        with:
          name: playwright-traces
          path: test-results/

坑1:Linux服务器必须加--with-deps安装浏览器
坑2:并行测试时要用worker隔离数据
坑3:Docker镜像要带xvfb虚拟帧缓冲

效率提升200%的插件

  1. 代码生成器
npx playwright codegen demo.app

边操作页面边生成测试代码

  1. 测试报告
npx playwright show-report

交互式HTML报告含截图、耗时分析

  1. VS Code扩展
    直接运行和调试单个测试文件

凌晨3点的紧急发版前,好的自动化测试能让你安心睡觉。但记住:测试不是追求100%覆盖率,而是要覆盖那20%核心业务路径。当你发现Playwright能捕获到产品经理都没想到的边界情况时,那种成就感比咖啡因更提神。

点评评价

captcha
健康