ブラウザイベント
ブラウザイベント
ブラウザイベントは、ユーザーの操作やブラウザの状態変化によって発生する「出来事」です。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タブで、イベントが正しく発生しているか確認できます:
検証ツールのConsoleタブで、イベントが正しく発生しているか確認できます:
// クリックイベントの確認
document.querySelector('#btn').addEventListener('click', () => {
console.log('clicked!');
});
まとめ
| イベント種類 | 主な用途 | Playwright |
|---|---|---|
| click | ボタン、リンク | click() |
| input | テキスト入力 | fill(), type() |
| change | セレクト、チェックボックス | selectOption(), check() |
| submit | フォーム送信 | submitボタンの click() |
| hover | ホバー効果 | hover() |
次のチャプターでは、検証ツールの開き方を学びます。