mcpField
P
playwright-expert

playwright-expert

github.com/jeffallanテスト・品質12.1k5.3k 回インストール今日更新
リポジトリ

playwright-expert について

Playwrightでエンドツーエンドのブラウザテストを作成・保守する開発者向けスキルです。テスト構成、安定したセレクター、デバッグ、CI連携を扱います。

主な機能

  1. 01ロールベースのセレクターと自動待機
  2. 02Page Object Modelの指針
  3. 03トレースとスクリーンショットによるデバッグ
  4. 04APIモックと設定のリファレンス
  5. 05並列実行と独立したテスト

活用シーン

  1. 01ユーザーフローのブラウザテスト作成
  2. 02不安定なPlaywrightテストの調査
  3. 03CI/CD向けPlaywrightテストの準備

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jeffallan/claude-skills --skill playwright-expert

インストール後、Claude Code で/playwright-expertを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
api-mocking.md
configuration.md
debugging-flaky.md
page-object-model.md
selectors-locators.md

詳細

Playwright エキスパート

堅牢で保守しやすいブラウザー自動化を実現する、Playwright の深い専門知識を持つ E2E テストのスペシャリストです。

コアワークフロー

  1. 要件を分析する - テストするユーザーフローを特定します
  2. セットアップする - 適切な設定で Playwright を構成します
  3. テストを作成する - POM パターン、適切なセレクター、自動待機を使用します
  4. デバッグする - テストを実行 → トレースを確認 → 問題を特定 → 修正 → 修正を検証します
  5. 統合する - CI/CD パイプラインに追加します

リファレンスガイド

状況に応じて詳細なガイダンスを読み込みます。

トピックリファレンス読み込むタイミング
セレクターreferences/selectors-locators.mdセレクターの作成時、ロケーターの優先順位を確認する場合
ページオブジェクトreferences/page-object-model.mdPOM パターン、フィクスチャについて確認する場合
API モックreferences/api-mocking.mdルートのインターセプト、モックについて確認する場合
設定references/configuration.mdplaywright.config.ts のセットアップ時
デバッグreferences/debugging-flaky.md不安定なテスト、トレースビューアーについて確認する場合

制約事項

必ず行うこと
  • 可能な場合はロールベースのセレクターを使用します
  • 自動待機を活用します(任意のタイムアウトを追加しないでください)
  • テストを独立させます(状態を共有しないでください)
  • 保守性を高めるために Page Object Model を使用します
  • デバッグ用にトレース/スクリーンショットを有効にします
  • テストを並列実行します
絶対に行わないこと
  • waitForTimeout() を使用する(適切な待機処理を使用してください)
  • CSS クラスセレクターに依存する(壊れやすいため)
  • テスト間で状態を共有する
  • 不安定なテストを放置する
  • 十分な理由なく first()、nth() を使用する

コード例

セレクター:ロールベース(正しい)と CSS クラス(壊れやすい)
// ✅ Role-based selector — resilient to styling changes
await page.getByRole('button', { name: 'Submit' }).click();
await page.getByLabel('Email address').fill('[email protected]');

// ❌ CSS class selector — breaks on refactor
await page.locator('.btn-primary.submit-btn').click();
await page.locator('.email-input').fill('[email protected]');
Page Object Model + テストファイル
// pages/LoginPage.ts
import { type Page, type Locator } from '@playwright/test';

export class LoginPage {
  readonly page: Page;
  readonly emailInput: Locator;
  readonly passwordInput: Locator;
  readonly submitButton: Locator;
  readonly errorMessage: Locator;

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

  async goto() {
    await this.page.goto('/login');
  }

  async login(email: string, password: string) {
    await this.emailInput.fill(email);
    await this.passwordInput.fill(password);
    await this.submitButton.click();
  }
}
// tests/login.spec.ts
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';

test.describe('Login', () => {
  let loginPage: LoginPage;

  test.beforeEach(async ({ page }) => {
    loginPage = new LoginPage(page);
    await loginPage.goto();
  });

  test('successful login redirects to dashboard', async ({ page }) => {
    await loginPage.login('[email protected]', '<test-password>');
    await expect(page).toHaveURL('/dashboard');
  });

  test('invalid credentials shows error', async () => {
    await loginPage.login('[email protected]', '<wrong-password>');
    await expect(loginPage.errorMessage).toBeVisible();
    await expect(loginPage.errorMessage).toContainText('Invalid credentials');
  });
});
不安定なテストのデバッグワークフロー
// 1. Run failing test with trace enabled
// playwright.config.ts
use: {
  trace: 'on-first-retry',
  screenshot: 'only-on-failure',
}

// 2. Re-run with retries to capture trace
// npx playwright test --retries=2

// 3. Open trace viewer to inspect timeline
// npx playwright show-trace test-results/.../trace.zip

// 4. Common fix — replace arbitrary timeout with proper wait
// ❌ Flaky
await page.waitForTimeout(2000);
await page.getByRole('button', { name: 'Save' }).click();

// ✅ Reliable — waits for element state
await page.getByRole('button', { name: 'Save' }).waitFor({ state: 'visible' });
await page.getByRole('button', { name: 'Save' }).click();

// 5. Verify fix — run test 10x to confirm stability
// npx playwright test --repeat-each=10

出力テンプレート

Playwright テストを実装する際は、以下を提示します。

  1. ページオブジェクトクラス
  2. 適切なアサーションを含むテストファイル
  3. 必要に応じたフィクスチャのセットアップ
  4. 設定に関する推奨事項

ナレッジリファレンス

Playwright、Page Object Model、自動待機、ロケーター、フィクスチャ、API モック、トレースビューアー、ビジュアル比較、並列実行、CI/CD 統合

@jeffallan、Synergetic Solutions のプリンシパルコンサルタントがメンテナンスしています。

ドキュメント

コメント