playwright について
TypeScript または JavaScript を使う QA エンジニアや開発者向けの、Playwright による E2E テストガイドです。堅牢なロケーター、自動再試行するアサーション、決定的なテスト、設定を扱います。
主な機能
- 01テスト構成と分離
- 02アクセシビリティを考慮したロケーター
- 03Web ファーストのアサーション
- 04ナビゲーションと API の待機方法
- 05設定とテストの信頼性
活用シーン
- 01重要なユーザーフローの自動化
- 02フォームとナビゲーション動作のテスト
- 03固定待機による不安定なテストの低減
- 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 コメントを追加します
- 適切なエラー処理とログ記録を実装します
コメント
Markdown 対応