Playwright ページ操作の基本
この章では、Playwright がウェブページと実際に対話する方法と、最もよく使うページ操作 API について学びます。
ページナビゲーション
ページナビゲーションは最も一般的な操作です。Playwright はページを開く、リフレッシュする、ページ遷移を制御するための複数の API を提供しています。
1. ページを開く(page.goto)
await page.goto('https://example.com');
よく使うパラメータ:
url: アクセスするURLtimeout: タイムアウト時間、デフォルト30秒-
waitUntil: ページ読み込みを待つ条件'load': 待機loadイベント(ページとリソースが全て読み込まれる)'domcontentloaded': DOMコンテンツの読み込み完了を待つ'networkidle': ネットワークがアイドルになるのを待つ
例
await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
2. ページのリフレッシュ(page.reload)
現在のページをリフレッシュします。
await page.reload({ waitUntil: 'networkidle' });
3. 進む / 戻る(page.goBack / page.goForward)
ブラウザーの進む・戻るボタンをシミュレートします。
await page.goto('https://example.com');
await page.goto('https://playwright.dev');
await page.goBack(); // 返回 example.com
await page.goForward(); // 前进到 playwright.dev
4. ページの読み込み待機
特定の要素の読み込みを明示的に待つ必要がある場合があります。Playwright はスマート待機メカニズムを提供しています。
await page.waitForLoadState('networkidle'); // 等待网络空闲
await page.waitForSelector('#main-content'); // 等待元素出现
要素の特定
ページと対話するには、まず対象の要素を特定する必要があります。Playwright はさまざまなセレクターを提供しています。
1. CSSセレクター
最もよく使われる特定方法で、フロントエンド開発と同じです。
await page.click('#login-button'); // 通过 id
await page.click('.btn-primary'); // 通过 class
await page.click('form > button'); // 通过层级关系
2. XPathセレクター
XPath 式を使用して要素を特定します。
await page.click('//button[text()="登录"]');
await page.click('//input[@name="username"]');
XPath はより柔軟ですが、可読性が低いため、最初の選択肢としては推奨されません。
3. テキスト内容による特定
要素の表示テキストを使用して特定します。
await page.click('text=登录');
await page.click('button:has-text("提交")');
4. 属性による特定
属性を直接使用して選択します。
await page.fill('input[name="email"]', '[email protected]');
await page.click('[data-test="submit-button"]');
5. ロケーター戦略のベストプラクティス
- 一意で安定したセレクターを優先的に使用する(例:
data-testid、data-test属性) - 動的な id や class 名に依存しないようにする
- 使用する
page.getByRole、page.getByTextなどの読みやすさに優れた方法(Playwright 5.x 推奨)
例
await page.getByRole('button', { name: '送信' }).click();
await page.getByPlaceholder('ユーザー名を入力してください').fill('admin');
基本操作
Playwright はクリック、入力、キーボード、マウス操作を含むさまざまな要素との対話方法をサポートしています。
1. クリック操作(page.click)
await page.click('#submit');
オプションパラメータ:
button:'left' | 'right' | 'middle'(デフォルトは左クリック)clickCount: クリック回数(ダブルクリック時は2に設定)modifiers: キーボードのコンビネーションキー(例:['Control'])
例
await page.click('#submit', { button: 'right' }); // 右クリック
await page.dblclick('#submit'); // ダブルクリック
await page.dblclick('#submit'); // ダブルクリック
2. テキスト入力(fill vs type)
fill(selector, value): 入力欄をクリアして新しい値を入力(推奨、ほとんどの場合に使用)type(selector, text): 一文字ずつの入力をシミュレート(遅延付きで、実際のユーザーに近い)
例
await page.fill('input[name="username"]', 'test_user');
await page.type('input[name="search"]', 'playwright', { delay: 200 });
await page.type('input[name="search"]', 'playwright', { delay: 200 });
3. キーボード操作
press: キーの入力をシミュレートkeyboard.type: テキストを連続入力keyboard.press: 特定のキーを押す(コンビネーションキー可)
例
await page.press('input[name="username"]', 'Enter');
await page.keyboard.type('Hello World!');
await page.keyboard.press('Control+A'); // 全選択
await page.keyboard.press('Backspace'); // 削除
await page.keyboard.type('Hello World!');
await page.keyboard.press('Control+A'); // 全選択
await page.keyboard.press('Backspace'); // 削除
4. マウス操作
Playwright は完全なマウス制御を提供します:
hover: マウスホバーmouse.move(x, y): 座標に移動mouse.click(x, y): 座標をクリックmouse.down / mouse.up: マウスボタンを押す/離すdragAndDrop: 要素のドラッグ(Playwright 1.18+)
例
await page.hover('#menu'); // ホバー
await page.mouse.move(100, 200); // 座標に移動
await page.mouse.click(120, 220); // 座標をクリック
await page.dragAndDrop('#item1', '#dropzone'); // ターゲット領域にドラッグ
await page.mouse.move(100, 200); // 座標に移動
await page.mouse.click(120, 220); // 座標をクリック
await page.dragAndDrop('#item1', '#dropzone'); // ターゲット領域にドラッグ
完全な例:ログインをシミュレートしてスクリーンショットを撮る
以下は、ナビゲーション、要素の特定、入力、クリックなどの基本操作を示す完全な Playwright スクリプトです。
例
const { chromium } = require('playwright');
(async () => {
// 1. ブラウザーを起動し、新しいページを作成する
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
// 2. ログインページに移動する
await page.goto('https://github.com/login');
console.log(`現在のページタイトル:${await page.title()}`);
// 3. 要素の特定と入力
// ユーザー名の入力欄を特定し、ユーザー名を入力する
await page.locator('#login_field').fill('your_username');
// パスワードの入力欄を特定し、パスワードを入力する
await page.locator('#password').fill('your_password');
// 4. ログインボタンをクリックする
// .getByRole() を使用する方がより堅牢なロケーター方法です
await page.getByRole('button', { name: 'Sign in' }).click();
// 5. ページのナビゲーション完了を待ち、ログイン成功を確認する
await page.waitForURL('https://github.com/');
// 6. スクリーンショットを保存して、ログイン状態を確認する
await page.screenshot({ path: 'github_homepage.png' });
console.log('ログイン成功、スクリーンショットを保存しました');
// 7. ブラウザーを閉じる
await browser.close();
})();
(async () => {
// 1. ブラウザーを起動し、新しいページを作成する
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
// 2. ログインページに移動する
await page.goto('https://github.com/login');
console.log(`現在のページタイトル:${await page.title()}`);
// 3. 要素の特定と入力
// ユーザー名の入力欄を特定し、ユーザー名を入力する
await page.locator('#login_field').fill('your_username');
// パスワードの入力欄を特定し、パスワードを入力する
await page.locator('#password').fill('your_password');
// 4. ログインボタンをクリックする
// .getByRole() を使用する方がより堅牢なロケーター方法です
await page.getByRole('button', { name: 'Sign in' }).click();
// 5. ページのナビゲーション完了を待ち、ログイン成功を確認する
await page.waitForURL('https://github.com/');
// 6. スクリーンショットを保存して、ログイン状態を確認する
await page.screenshot({ path: 'github_homepage.png' });
console.log('ログイン成功、スクリーンショットを保存しました');
// 7. ブラウザーを閉じる
await browser.close();
})();
実行方法:
- プロジェクトディレクトリにコードを保存します(ファイル名:github_login.js。
- ターミナルで実行しますnode github_login.js。
よく使うAPI一覧表
| カテゴリ | メソッド / プロパティ | 説明 |
|---|---|---|
| ページナビゲーション | page.goto(url[, options]) |
ページを開く |
page.reload([options]) |
ページをリフレッシュ | |
page.goBack([options]) |
戻る | |
page.goForward([options]) |
進む | |
page.waitForLoadState([state]) |
ページの読み込み状態を待つ | |
| 要素の特定 | page.locator(selector) |
汎用ロケーター |
page.getByRole(role, options) |
ロールによる特定 | |
page.getByText(text) |
テキストによる特定 | |
page.getByPlaceholder(text) |
プレースホルダーによる特定 | |
page.getByLabel(text) |
ラベルによる特定 | |
| 基本操作 | page.click(selector[, options]) |
要素をクリック |
page.dblclick(selector) |
ダブルクリック | |
page.fill(selector, value) |
テキスト入力(クリアして入力) | |
page.type(selector, text[, options]) |
一文字ずつの入力をシミュレート | |
page.press(selector, key) |
要素上でキーを押す | |
page.keyboard.type(text) |
キーボード入力 | |
page.keyboard.press(key) |
キーボードのキー押下(コンビネーションキー含む) | |
page.hover(selector) |
ホバー | |
page.mouse.move(x, y) |
マウスを移動 | |
page.mouse.click(x, y[, options]) |
座標クリック | |
page.dragAndDrop(src, dest) |
要素のドラッグ |