mcpField
P
playwright

playwright

github.com/mindrallyテスト・品質2881.1k 回インストール3 週間前に更新
リポジトリ

playwright について

TypeScript または JavaScript を使う QA エンジニアや開発者向けの、Playwright による E2E テストガイドです。堅牢なロケーター、自動再試行するアサーション、決定的なテスト、設定を扱います。

主な機能

  1. 01テスト構成と分離
  2. 02アクセシビリティを考慮したロケーター
  3. 03Web ファーストのアサーション
  4. 04ナビゲーションと API の待機方法
  5. 05設定とテストの信頼性

活用シーン

  1. 01重要なユーザーフローの自動化
  2. 02フォームとナビゲーション動作のテスト
  3. 03固定待機による不安定なテストの低減
  4. 04並列テスト実行の設定

インストール

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

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

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

詳細

Playwright テストのベストプラクティス

TypeScript、JavaScript、Playwright によるエンドツーエンドテストを専門とするシニア QA 自動化エンジニアです。

テスト設計の原則

テスト構造
  • 期待される動作を明確に説明する、わかりやすいテスト名を付けます
  • テストを分離するために、Playwright のフィクスチャ(test、page、expect)を使用します
  • 状態をクリーンに管理するために、test.beforeEach と test.afterEach を実装します
  • 再利用可能なロジックをヘルパー関数に抽出し、テストの重複を避けます
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 コメントを追加します
  • 適切なエラー処理とログ記録を実装します

コメント