自動テストチュートリアル

Playwright、Seleniumなどの自動テストツールを学ぼう


title: 演習: ログインページのPOM化

演習: ログインページのPOM化

実際にログインページのPage Objectを作成してみましょう。

対象ページ

以下のような構成のログインページを想定します:

  • ユーザー名入力フィールド
  • パスワード入力フィールド
  • ログインボタン
  • 「パスワードを忘れた」リンク
  • エラーメッセージ表示エリア

演習1: 基本的なPage Objectを作成

以下のコードを完成させてください。

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

export class LoginPage {
  readonly page: Page;
  // TODO: 要素を定義してください
  // - usernameInput
  // - passwordInput
  // - loginButton
  // - forgotPasswordLink
  // - errorMessage

  constructor(page: Page) {
    this.page = page;
    // TODO: 各要素にロケーターを設定してください
  }

  // TODO: 以下のメソッドを実装してください
  // - goto(): ログインページに移動
  // - login(username, password): ログイン操作
  // - clickForgotPassword(): パスワード忘れリンクをクリック
  // - getErrorMessage(): エラーメッセージを取得
}

解答例

クリックして解答を表示
// pages/LoginPage.ts
import { Page, Locator } from '@playwright/test';

export class LoginPage {
  readonly page: Page;
  readonly usernameInput: Locator;
  readonly passwordInput: Locator;
  readonly loginButton: Locator;
  readonly forgotPasswordLink: Locator;
  readonly errorMessage: Locator;

  constructor(page: Page) {
    this.page = page;
    this.usernameInput = page.getByRole('textbox', { name: 'ユーザー名' });
    this.passwordInput = page.getByRole('textbox', { name: 'パスワード' });
    this.loginButton = page.getByRole('button', { name: 'ログイン' });
    this.forgotPasswordLink = page.getByRole('link', { name: 'パスワードを忘れた' });
    this.errorMessage = page.locator('.error-message');
  }

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

  async login(username: string, password: string) {
    await this.usernameInput.fill(username);
    await this.passwordInput.fill(password);
    await this.loginButton.click();
  }

  async clickForgotPassword() {
    await this.forgotPasswordLink.click();
  }

  async getErrorMessage(): Promise<string> {
    return await this.errorMessage.textContent() ?? '';
  }
}

演習2: テストを作成

作成したPage Objectを使って、以下のテストを書いてください。

  1. ログインフォームが表示されることを確認
  2. 正しい認証情報でログインできることを確認
  3. 間違った認証情報でエラーが表示されることを確認

解答例

クリックして解答を表示
// tests/login.spec.ts
import { test, expect } from '@playwright/test';
import { LoginPage } from '../pages/LoginPage';

test.describe('ログインページ', () => {
  let loginPage: LoginPage;

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

  test('ログインフォームが表示される', async () => {
    await expect(loginPage.usernameInput).toBeVisible();
    await expect(loginPage.passwordInput).toBeVisible();
    await expect(loginPage.loginButton).toBeVisible();
  });

  test('正しい認証情報でログインできる', async ({ page }) => {
    await loginPage.login('testuser', 'password123');
    await expect(page).toHaveURL('/dashboard');
  });

  test('間違った認証情報でエラーが表示される', async () => {
    await loginPage.login('wronguser', 'wrongpass');
    await expect(loginPage.errorMessage).toBeVisible();
    const message = await loginPage.getErrorMessage();
    expect(message).toContain('認証に失敗');
  });
});
🎯 チェックポイント
  • Page Objectにページの要素が正しく定義されているか
  • メソッドが適切に分割されているか
  • テストがPage Objectを使って書かれているか