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

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

ブラウザイベント

ブラウザイベント

ブラウザイベントは、ユーザーの操作やブラウザの状態変化によって発生する「出来事」です。E2Eテストでは、これらのイベントをシミュレートします。

イベントとは?

Webページでユーザーが何か操作すると、イベントが発生します。

ボタンをクリック → clickイベント発生 → JavaScriptが反応 → 処理実行

主なブラウザイベント

マウスイベント

イベント 発生タイミング
click 要素をクリック ボタンを押す
dblclick ダブルクリック ファイルを開く
mouseenter マウスが要素に入る ホバー効果
mouseleave マウスが要素から出る ツールチップを閉じる
mousedown マウスボタンを押す ドラッグ開始
mouseup マウスボタンを離す ドラッグ終了

キーボードイベント

イベント 発生タイミング
keydown キーを押す 文字入力開始
keyup キーを離す 文字入力終了
keypress キーを押して離す(非推奨) -

フォームイベント

イベント 発生タイミング
input 入力値が変わる テキストボックスに入力
change 入力が確定する セレクトボックスを選択
submit フォームを送信 送信ボタンをクリック
focus 要素にフォーカス 入力欄をクリック
blur フォーカスが外れる 別の要素に移動

ページイベント

イベント 発生タイミング
load ページの読み込み完了 画像などすべて読み込み済み
DOMContentLoaded DOM構築完了 HTMLの解析が完了
beforeunload ページを離れる前 確認ダイアログ表示
scroll スクロール ページをスクロール
resize ウィンドウサイズ変更 ブラウザをリサイズ

イベントリスナー

イベントが発生したときに実行する処理を登録します。

JavaScriptでのイベントリスナー

// ボタンをクリックしたときの処理
const button = document.querySelector('#submit-btn');
button.addEventListener('click', () => {
  console.log('ボタンがクリックされました');
});

// 入力値が変わったときの処理
const input = document.querySelector('#email');
input.addEventListener('input', (event) => {
  console.log('入力値:', event.target.value);
});

// フォーム送信時の処理
const form = document.querySelector('#login-form');
form.addEventListener('submit', (event) => {
  event.preventDefault(); // デフォルト動作を防ぐ
  console.log('フォームが送信されました');
});

HTMLでのイベント指定

<!-- onclick属性(古い方法) -->
<button onclick="handleClick()">クリック</button>

<!-- より良い方法はJavaScriptでaddEventListener -->
<button id="btn">クリック</button>
<script>
  document.querySelector('#btn').addEventListener('click', handleClick);
</script>
💡 イベントリスナーとは?
「このイベントが起きたら、この処理を実行してね」という指示をブラウザに登録することです。

主要イベントの詳細

clickイベント

ボタンやリンクをクリックしたときに発生します。

<button id="alert-btn">アラート表示</button>
document.querySelector('#alert-btn').addEventListener('click', () => {
  alert('クリックされました!');
});

inputイベント

テキストボックスなどに入力するたびに発生します。

<input type="text" id="search" placeholder="検索...">
<p id="result"></p>
document.querySelector('#search').addEventListener('input', (event) => {
  const value = event.target.value;
  document.querySelector('#result').textContent = `入力中: ${value}`;
});

submitイベント

フォームが送信されるときに発生します。

<form id="contact-form">
  <input type="text" name="name" required>
  <button type="submit">送信</button>
</form>
document.querySelector('#contact-form').addEventListener('submit', (event) => {
  event.preventDefault(); // ページリロードを防ぐ
  console.log('フォームデータを送信します');
  // ここでAjaxリクエストなどを実行
});
⚠️ event.preventDefault()
event.preventDefault() は、イベントのデフォルト動作(フォーム送信時のページリロードなど)を無効化します。

イベントバブリング

イベントは、子要素から親要素へと伝播します。

<div id="parent">
  <button id="child">クリック</button>
</div>
// 子要素のイベント
document.querySelector('#child').addEventListener('click', () => {
  console.log('子要素がクリックされた');
});

// 親要素のイベント
document.querySelector('#parent').addEventListener('click', () => {
  console.log('親要素がクリックされた');
});

// ボタンをクリックすると両方のイベントが発生:
// 1. 子要素がクリックされた
// 2. 親要素がクリックされた

イベントの伝播を止める

document.querySelector('#child').addEventListener('click', (event) => {
  event.stopPropagation(); // 親への伝播を止める
  console.log('子要素だけ');
});

Playwrightでのイベントシミュレート

Playwrightは、実際のユーザー操作をシミュレートしてイベントを発生させます。

クリックイベント

// ボタンをクリック
await page.click('button#submit');

// または
await page.locator('button#submit').click();

// ダブルクリック
await page.dblclick('button#submit');

// 右クリック
await page.locator('button#submit').click({ button: 'right' });

入力イベント

// テキスト入力(inputイベントが発生)
await page.fill('#email', 'user@example.com');

// 一文字ずつ入力(keydown/keyupイベントも発生)
await page.type('#email', 'user@example.com');

// Enter キーを押す
await page.press('#search', 'Enter');

フォーム送信イベント

// submitイベントを発生させる方法1: ボタンをクリック
await page.click('button[type="submit"]');

// 方法2: Enterキーを押す
await page.press('#email', 'Enter');

// フォームに直接submit
await page.locator('form').evaluate(form => form.submit());

その他のイベント

// ホバー(mouseenterイベント)
await page.hover('button#submit');

// フォーカス(focusイベント)
await page.focus('#email');

// スクロール
await page.locator('#bottom').scrollIntoViewIfNeeded();

// チェックボックス/ラジオボタン(changeイベント)
await page.check('input[type="checkbox"]');

// セレクトボックス(changeイベント)
await page.selectOption('select#country', 'jp');

イベント待機

動的なページでは、イベントの結果を待つ必要があります。

// ナビゲーション(loadイベント)を待つ
await page.click('a#next');
await page.waitForLoadState('load');

// DOM変更を待つ
await page.click('button#load-more');
await page.waitForSelector('.new-content');

// レスポンスを待つ
await page.click('button#submit');
await page.waitForResponse('**/api/submit');

// URLが変わるのを待つ
await page.click('a#dashboard');
await page.waitForURL('**/dashboard');

実践例

クリックとアラート確認

test('アラート表示', async ({ page }) => {
  await page.goto('/');

  // ダイアログイベントをリスナーで捕捉
  page.on('dialog', async dialog => {
    console.log(dialog.message()); // アラートのメッセージ
    await dialog.accept(); // OKボタンを押す
  });

  // ボタンをクリック(clickイベント → alertが表示される)
  await page.click('button#show-alert');
});

フォーム入力と送信

test('お問い合わせフォーム', async ({ page }) => {
  await page.goto('/contact');

  // inputイベント発生
  await page.fill('#name', '山田太郎');
  await page.fill('#email', 'yamada@example.com');
  await page.fill('#message', 'お問い合わせ内容');

  // changeイベント発生
  await page.selectOption('#category', 'support');

  // submitイベント発生
  await page.click('button[type="submit"]');

  // 送信後の確認
  await expect(page.locator('.success-message')).toBeVisible();
});

ホバーでツールチップ表示

test('ツールチップ表示', async ({ page }) => {
  await page.goto('/');

  // mouseenterイベント発生
  await page.hover('.info-icon');

  // ツールチップが表示される
  await expect(page.locator('.tooltip')).toBeVisible();

  // mouseleaveイベント発生(別の要素にホバー)
  await page.hover('body');

  // ツールチップが消える
  await expect(page.locator('.tooltip')).not.toBeVisible();
});
🎯 デバッグのコツ
検証ツールのConsoleタブで、イベントが正しく発生しているか確認できます:
// クリックイベントの確認
document.querySelector('#btn').addEventListener('click', () => {
  console.log('clicked!');
});

まとめ

イベント種類 主な用途 Playwright
click ボタン、リンク click()
input テキスト入力 fill(), type()
change セレクト、チェックボックス selectOption(), check()
submit フォーム送信 submitボタンの click()
hover ホバー効果 hover()

次のチャプターでは、検証ツールの開き方を学びます。