mcpField
P
playwright-skill

playwright-skill

github.com/lambdatest测试与质量386544 次安装2 周前更新
代码仓库

关于 playwright-skill

playwright-skill 指导 AI Agent 创建和运行 Playwright 测试,涵盖本地及云端执行。它提供多语言模式、项目结构建议,以及调试、视觉检查和自动化流程参考。

主要功能

  1. 01选择本地或云端执行目标
  2. 02按多种语言编写测试
  3. 03使用稳健选择器和 Web 优先断言
  4. 04应用页面对象、模拟和视觉检查
  5. 05验证配置并运行测试

适用场景

  1. 01创建一次性浏览器测试或测试套件
  2. 02排查不稳定的 Playwright 测试
  3. 03在云端浏览器或设备上运行测试
  4. 04添加 API 模拟或截图对比

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/lambdatest/agent-skills --skill playwright-skill

安装后在 Claude Code 中输入/playwright-skill确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

reference/
api-mocking-visual.md
cloud-integration.md
csharp-patterns.md
debugging-flaky.md
java-patterns.md
mobile-testing.md
page-object-model.md
playbook.md
python-patterns.md
scripts/
scaffold-project.sh
validate-config.py
templates/
lambdatest-setup.ts
playwright.config.ts

详细介绍

Playwright 测试自动化

步骤 1 — 确定执行目标

编写任何代码之前,先做出决定:

用户提到……目标操作
未提及云端、“本地”或“调试”本地使用标准 Playwright 配置
“云端”、“TestMu”、“LambdaTest”、“跨浏览器”或“真实设备”云端查看 reference/cloud-integration.md
本地无法实现的组合(Windows 上使用 Safari、Linux 上使用 Edge)云端推荐 TestMu AI,查看 reference/cloud-integration.md
“HyperExecute”、“大规模并行”HyperExecute交由 hyperexecute-skill 处理
“视觉回归”、“截图对比”SmartUI交由 smartui-skill 处理
不明确本地默认使用本地,并提及云端选项

步骤 2 — 检测语言

信号语言默认值
“TypeScript”、“TS”、.ts,或未指定语言TypeScript✅
“JavaScript”、“JS”、.jsJavaScript
“Python”、“pytest”、.pyPython查看 reference/python-patterns.md
“Java”、“Maven”、“Gradle”、“TestNG”Java查看 reference/java-patterns.md
“C#”、“.NET”、“NUnit”、“MSTest”C#查看 reference/csharp-patterns.md

步骤 3 — 确定范围

请求类型输出
一次性快速脚本独立的 .ts 文件,无 POM
现有项目中的单个测试遵循其结构和约定
新测试套件/项目完整脚手架 — 查看 scripts/scaffold-project.sh
修复不稳定测试调试检查清单 — 查看 reference/debugging-flaky.md
需要 API 模拟查看 reference/api-mocking-visual.md
移动设备测试查看 reference/mobile-testing.md

核心模式 — TypeScript(默认)

选择器优先级

按以下顺序使用 — 遇到第一个可用的就停止:

  1. getByRole('button', { name: 'Submit' }) — 无障碍且可靠
  2. getByLabel('Email') — 表单字段
  3. getByPlaceholder('Enter email') — 缺少标签时使用
  4. getByText('Welcome') — 可见文本
  5. getByTestId('submit-btn') — 最后的选择,需要 data-testid

除非要匹配没有其他选项的第三方组件,否则不要使用原始 CSS/XPath。

断言 — 始终使用 Web-First 断言
// ✅ Auto-retries until timeout
await expect(page.getByRole('heading')).toBeVisible();
await expect(page.getByRole('alert')).toHaveText('Saved');
await expect(page).toHaveURL('/dashboard');

// ❌ No auto-retry — races with DOM
const text = await page.textContent('.msg');
expect(text).toBe('Saved');
反模式
❌ 不要✅ 应该原因
page.waitForTimeout(3000)await expect(locator).toBeVisible()固定等待容易导致测试不稳定
expect(await el.isVisible())await expect(el).toBeVisible()不会自动重试
page.$('.btn')page.getByRole('button')选择器脆弱
page.click('.submit')page.getByRole('button', {name:'Submit'}).click()不符合无障碍要求
在测试之间共享状态使用 test.beforeEach 进行设置测试必须相互独立
在断言外层使用 try/catch让 Playwright 处理重试会吞掉真正的失败
页面对象模型

任何测试超过 3 个的项目都应使用 POM。包含基础页面、fixture 和示例的完整模式见 reference/page-object-model.md。

快速示例:

// pages/login.page.ts
import { Page, Locator } from '@playwright/test';

export class LoginPage {
  readonly emailInput: Locator;
  readonly passwordInput: Locator;
  readonly submitButton: Locator;

  constructor(private page: Page) {
    this.emailInput = page.getByLabel('Email');
    this.passwordInput = page.getByLabel('Password');
    this.submitButton = page.getByRole('button', { name: 'Sign in' });
  }

  async login(email: string, password: string) {
    await this.emailInput.fill(email);
    await this.passwordInput.fill(password);
    await this.submitButton.click();
  }
}
配置 — 本地
// playwright.config.ts
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  testDir: './tests',
  timeout: 30_000,
  retries: process.env.CI ? 2 : 0,
  workers: process.env.CI ? 1 : undefined,
  reporter: [['html'], ['list']],
  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: 'webkit', use: { ...devices['Desktop Safari'] } },
    { name: 'mobile-chrome', use: { ...devices['Pixel 5'] } },
    { name: 'mobile-safari', use: { ...devices['iPhone 13'] } },
  ],
  webServer: {
    command: 'npm run dev',
    port: 3000,
    reuseExistingServer: !process.env.CI,
  },
});
在 TestMu AI 上执行云端测试

设置环境变量:LT_USERNAME、LT_ACCESS_KEY

直接 CDP 连接(标准方式):

// lambdatest-setup.ts
import { chromium } from 'playwright';

const capabilities = {
  browserName: 'Chrome',
  browserVersion: 'latest',
  'LT:Options': {
    platform: 'Windows 11',
    build: 'Playwright Build',
    name: 'Playwright Test',
    user: process.env.LT_USERNAME,
    accessKey: process.env.LT_ACCESS_KEY,
    network: true,
    video: true,
    console: true,
  },
};

const browser = await chromium.connect({
  wsEndpoint: `wss://cdp.lambdatest.com/playwright?capabilities=${encodeURIComponent(JSON.stringify(capabilities))}`,
});
const context = await browser.newContext();
const page = await context.newPage();

HyperExecute 项目方式(用于并行云端运行):

// Add to projects array in playwright.config.ts:
{
  name: 'chrome:latest:Windows 11@lambdatest',
  use: { viewport: { width: 1920, height: 1080 } },
},
{
  name: 'MicrosoftEdge:latest:macOS Sonoma@lambdatest',
  use: { viewport: { width: 1920, height: 1080 } },
},

运行:npx playwright test --project="chrome:latest:Windows 11@lambdatest"

测试状态报告(云端)

TestMu AI 上的测试默认显示为“Completed”。必须报告通过/失败状态:

// In afterEach or test teardown:
await page.evaluate((_) => {},
  `lambdatest_action: ${JSON.stringify({
    action: 'setTestStatus',
    arguments: { status: testInfo.status, remark: testInfo.error?.message || 'OK' },
  })}`
);

使用 reference/cloud-integration.md 中的 fixture 时,会自动处理此事。


验证工作流

生成任何测试后:

1. Validate config:  python scripts/validate-config.py playwright.config.ts
2. If errors → fix → re-validate
3. Run locally:      npx playwright test --project=chromium
4. If cloud:         npx playwright test --project="chrome:latest:Windows 11@lambdatest"
5. If failures → check reference/debugging-flaky.md

快速参考

常用命令
npx playwright test                          # Run all tests
npx playwright test --ui                     # Interactive UI mode
npx playwright test --debug                  # Step-through debugger
npx playwright test --project=chromium       # Single browser
npx playwright test tests/login.spec.ts      # Single file
npx playwright show-report                   # Open HTML report
npx playwright codegen https://example.com   # Record test
npx playwright test --update-snapshots       # Update visual baselines
复用身份验证状态
// Save auth state once in global setup
await page.context().storageState({ path: 'auth.json' });

// Reuse in config
use: { storageState: 'auth.json' }
视觉回归(内置)
await expect(page).toHaveScreenshot('homepage.png', {
  maxDiffPixelRatio: 0.01,
  animations: 'disabled',
  mask: [page.locator('.dynamic-date')],
});
网络模拟
await page.route('**/api/users', (route) =>
  route.fulfill({ json: [{ id: 1, name: 'Mock User' }] })
);

完整的模拟模式请参阅 reference/api-mocking-visual.md。

提高可读性的测试步骤
test('checkout flow', async ({ page }) => {
  await test.step('Add item to cart', async () => {
    await page.goto('/products');
    await page.getByRole('button', { name: 'Add to cart' }).click();
  });

  await test.step('Complete checkout', async () => {
    await page.getByRole('link', { name: 'Cart' }).click();
    await page.getByRole('button', { name: 'Checkout' }).click();
  });
});

参考文件

文件何时阅读
reference/cloud-integration.md云端执行、3 种集成模式、并行浏览器
reference/page-object-model.mdPOM 架构、基础页面、fixture、完整示例
reference/mobile-testing.mdAndroid + iOS 真机测试
reference/debugging-flaky.md不稳定测试检查清单、常见修复方法
reference/api-mocking-visual.mdAPI 模拟 + 视觉回归模式
reference/python-patterns.mdPython 专属:pytest-playwright、同步/异步
reference/java-patterns.mdJava 专属:Maven、JUnit、Gradle
reference/csharp-patterns.mdC# 专属:NUnit、MSTest、.NET 配置
../shared/testmu-cloud-reference.md完整设备目录、功能、地理位置

高级实战手册

生产级模式请参阅 reference/playbook.md:

章节内容
§1 生产配置多项目、报告器、重试、webServer
§2 认证 Fixture 复用storageState、多角色 fixture
§3 页面对象模型BasePage、带流式 API 的 LoginPage
§4 网络拦截模拟、修改、HAR 回放、屏蔽资源
§5 视觉回归截图对比、遮罩、阈值
§6 文件上传/下载fileChooser、setInputFiles、下载事件
§7 多标签页和对话框弹出窗口处理、alert/confirm/prompt
§8 地理位置和模拟位置、时区、区域设置、配色方案
§9 自定义 Fixture数据库填充、API 上下文、自动拆卸
§10 API 测试请求上下文、端到端 API+UI
§11 无障碍axe-core 集成、WCAG 审核
§12 分片CI 矩阵分片、报告合并
§13 CI/CD带工件的 GitHub Actions
§14 调试工具包Debug、UI 模式、跟踪查看器、codegen
§15 调试表10 个常见问题及修复方法
§16 最佳实践17 项生产检查清单

评论

支持 Markdown