Skip to content

Playwright 扩展与迁移 ​

本章介绍 Playwright 生态的扩展功能,包括 Library 脚本模式、MCP 服务、Test Agents,以及从其他框架迁移到 Playwright 的指南。


Playwright Library 脚本模式 ​

Playwright Library 是单独的浏览器自动化库,适用于测试运行器之外的场景。

安装 ​

bash
npm i playwright

典型用法 ​

实例 ​

javascript

// 截图脚本

import { chromium } from 'playwright';

(async () => {

  const browser = await chromium.launch({ headless: true });

  const page = await browser.newPage();

  await page.goto('https://www.runoob.com/');

  await page.screenshot({ path: 'runoob.png', fullPage: true });

  await browser.close();

  console.log('截图已保存到 runoob.png');

})();

PDF 生成 ​

实例 ​

javascript

import { chromium } from 'playwright';

(async () => {

  const browser = await chromium.launch();

  const page = await browser.newPage();

  await page.goto('https://www.runoob.com/');

  // 生成 PDF(仅 Chromium 支持)

  await page.pdf({

    path: 'runoob.pdf',

    format: 'A4',

    margin: { top: '20px', bottom: '20px' },

  });

  await browser.close();

})();

Library 模式 vs Test Runner 的选择 ​

场景推荐
编写 E2E 测试Playwright Test Runner
网页截图、生成 PDFPlaywright Library
网页数据抓取Playwright Library
一次性自动化脚本Playwright Library

Playwright MCP 简介 ​

Playwright MCP(Model Context Protocol)服务器让 AI 助手可以直接控制浏览器。

MCP 安装与配置 ​

bash
# 为 Claude Code 添加 Playwright MCP
claude mcp add playwright npx @playwright/mcp@latest

在 VS Code 或其他 MCP 客户端中配置:

实例 ​

json

{

  "mcpServers": {

    "playwright": {

      "command": "npx",

      "args": ["@playwright/mcp@latest"]

    }

  }

}

MCP 的工作方式 ​

AI Agent 通过结构化的可访问性快照(Accessibility Snapshot)来感知页面内容。

每条可访问性信息有一个 ref 标识,Agent 通过这个 ref 来进行点击、输入等操作。

这种方式不需要截图,完全基于结构化数据交互,速度快且确定性高。


Playwright Test Agents ​

Test Agents 是实验性的 AI 驱动测试工具,可以自动生成和修复测试。

Agent功能触发方式
Planner自动探索应用,生成 Markdown 测试计划LLM Agent 驱动
Generator将测试计划转为 Playwright 测试代码LLM Agent 驱动
Healer执行测试套件,自动修复失败的测试LLM Agent 驱动

初始化 Test Agents:

bash
# 为 VS Code 初始化
npx playwright init-agents --loop=vscode

# 为 Claude Code 初始化
npx playwright init-agents --loop=claude

组件测试概览(实验性) ​

Playwright 支持直接挂载和测试 React/Vue 组件,无需完整的页面环境。

实例 ​

javascript

test('按钮组件测试', async ({ mount }) => {

  // 挂载 React 组件

  const component = await mount(

    <Button title="提交" />

  );

  // 断言组件显示的文本

  await expect(component).toContainText('提交');

  // 点击按钮

  await component.click();

});

无障碍测试 ​

Playwright 提供了无障碍名称和描述的断言,帮助验证页面的可访问性。

实例 ​

javascript

// 验证元素有正确的无障碍名称

await expect(page.getByRole('button'))

  .toHaveAccessibleName('提交表单');

// 验证元素有无障碍描述

await expect(page.getByLabel('用户名'))

  .toHaveAccessibleDescription('请输入 4-16 位字母数字组合');

从其他框架迁移 ​

从 Puppeteer 迁移 ​

Playwright 与 Puppeteer 共享 Chrome DevTools Protocol 的能力,迁移相对简单。

PuppeteerPlaywright
puppeteer.launch()chromium.launch()
page.waitForSelector()不需要(自动等待)或 page.locator()
page.$(selector)page.locator(selector)
page.evaluate()page.evaluate()(相同)
page.setRequestInterception()page.route()

从 Cypress 迁移 ​

Playwright 的 Locator 理念与 Cypress 的查询链类似,但有一些关键差异:

CypressPlaywright
cy.get('.class')page.locator('.class')
cy.contains('text')page.getByText('text')
cy.get('[data-cy="btn"]')page.getByTestId('btn')(配合 testIdAttribute: 'data-cy')
cy.intercept()page.route()
cy.wait()不需要(自动等待)

从 Selenium 迁移 ​

Selenium 使用 WebDriver 协议,Playwright 直接控制浏览器协议,API 风格差异较大。

SeleniumPlaywright
driver.findElement(By.id('x'))page.locator('#x')
driver.get(url)page.goto(url)
element.click()locator.click()
WebDriverWait不需要(内置自动等待)
new RemoteWebDriver()chromium.connect(url)

迁移建议:不要试图一步完成所有测试的迁移。

先选择一两个核心功能的测试用 Playwright 重写,验证通过后再逐步迁移其余测试。

AI 思考中...

Playwright 最佳实践

Playwright 核心类 API

基于 VitePress 构建,部署于 GitHub Pages