Playwright入門考察|Seleniumとの違いと自動待機の優位性

Playwright入門考察|Seleniumとの違いと自動待機の優位性

更新日:2025年6月28日

ブラウザ自動操作ライブラリPlaywrightについて調査・考察してみました。Seleniumとの比較や実践的なコード例を交えながら、15分で理解できる内容にまとめています。参考になれば幸いです。

1. Playwrightの基本概念とSeleniumとの比較

Playwrightは、Microsoft社が2020年に公開したNode.js向けブラウザ自動操作ライブラリである。Chrome、Firefox、Safariの3大ブラウザに対応し、単一のAPIで統一的な操作が可能となっている。

1.1 Playwrightの動作アーキテクチャ

Playwrightの動作フローを以下に示す。JavaScriptコードからPlaywright APIを介してブラウザを操作する構造となっている。

開発者コード
(JavaScript)
操作命令
Playwright
API
WebSocket
ブラウザ
(Chrome等)
HTTP
Webページ
Fig. 1: Playwrightの動作フロー

1.2 Seleniumとの機能比較

Playwrightの最大の特徴は「自動待機(Auto-waiting)」機能である。従来のSeleniumでは、ページ読み込み完了前に要素操作を試みるとエラーが発生するため、明示的な待機処理の実装が必要であった。

Table 1: SeleniumとPlaywrightの比較
観点 Selenium Playwright
公開年 2004年 2020年
開発元 ThoughtWorks → OSS Microsoft
実行速度 遅め 高速
安定性 不安定になりやすい 安定
待機処理 明示的な実装が必要 自動待機機能あり
対応ブラウザ 多数(IE含む) Chrome, Firefox, Safari
対応言語 Java, Python, C#等 JS, TS, Python, .NET, Java
自動待機の意義
Playwrightでは、要素が表示・有効化されるまで自動的に待機するため、テストコードの記述量が大幅に削減される。これにより、フレーキー(不安定)なテストの発生率が低下する。

1.3 browserとpageの関係

Playwrightのオブジェクトモデルでは、browserがブラウザ本体、pageがタブに対応する。1つのbrowserインスタンスから複数のpageを生成可能である。

Browser(ブラウザ本体)
Page 1
(タブ)
Page 2
(タブ)
Page 3
(タブ)
Fig. 2: Playwrightオブジェクトモデル(1 Browser : N Pages)

2. 実践的なコード例と操作一覧

2.1 基本的なセットアップ

Playwrightのインストールは以下のコマンドで行う。初回実行時にChrome、Firefox、Safariのブラウザバイナリが自動的にダウンロードされる。

npm install playwright

最小構成のコード例を以下に示す。非同期処理(async/await)を用いてブラウザ操作を記述する。

const { chromium } = require('playwright');

async function main() {
    const browser = await chromium.launch();  // ブラウザ起動
    const page = await browser.newPage();     // 新しいタブを開く
    await page.goto('https://example.com');   // URLにアクセス
    console.log(await page.title());          // タイトルを取得
    await browser.close();                    // ブラウザを閉じる
}

main();

2.2 セレクタと主要操作

要素の指定にはCSSセレクタまたはテキストセレクタを使用する。Playwrightではtext=構文により、表示テキストでの要素指定が可能である。

Table 2: セレクタの記法
セレクタ種別 記法 対象要素
ID #submit id="submit"
クラス .button class="button"
タグ button <button>要素
テキスト text=ログイン 「ログイン」表示要素
Table 3: 主要な操作メソッド
操作 メソッド 説明
クリック page.click(selector) 要素をクリック
文字入力 page.fill(selector, text) 入力欄に文字を入力
テキスト取得 page.textContent(selector) 要素のテキストを取得
待機 page.waitForSelector(selector) 要素の出現を待機
スクリーンショット page.screenshot({ path }) 画面を画像保存
ページ遷移 page.goto(url) 指定URLに移動

2.3 ログイン処理のシーケンス

典型的なログイン処理の流れを以下に示す。フォーム入力からページ遷移までの一連の操作を可視化した。

コード
page.fill('#username', 'testuser')
→ ブラウザ
コード
page.fill('#password', 'pass123')
→ ブラウザ
コード
page.click('#login')
→ ブラウザ
--- サーバー通信 ---
ブラウザ
POST /login → 302 Redirect
→ サーバー
ブラウザ
GET /dashboard → HTML
← サーバー
--- 完了 ---
Playwright
Promise解決 → ログイン成功
→ コード
Fig. 3: ログイン処理のシーケンス

2.4 実行モードの比較

Playwrightには画面表示の有無によって2つの実行モードが存在する。開発・デバッグ時はヘッドフルモード、本番運用時はヘッドレスモードの使用が推奨される。

Table 4: 実行モードの比較
モード 画面 用途 設定
ヘッドフル 表示される 開発・デバッグ headless: false
ヘッドレス 表示されない 本番運用・CI/CD headless: true(デフォルト)
// ヘッドフルモード(画面表示あり)
const browser = await chromium.launch({ headless: false });

// ヘッドレスモード(画面表示なし、デフォルト)
const browser = await chromium.launch({ headless: true });

3. エラーハンドリングと運用のポイント

3.1 待機処理の設計指針

待機処理の実装においては、固定時間待機(waitForTimeout)の使用を避け、条件ベースの待機を採用すべきである。固定時間待機は、待機時間が短すぎると要素未出現でエラー、長すぎると実行時間の無駄が発生するためである。

非推奨:固定時間待機
操作実行
waitForTimeout(3000)
3秒後に次の操作
問題:時間が適切か不明
短い→エラー / 長い→無駄
推奨:条件待機
操作実行
waitForSelector('#result')
要素出現後に次の操作
利点:最適な時間で完了
無駄なし・エラーなし
Fig. 4: 待機処理の推奨パターン比較
Table 5: 待機処理の比較
方式 コード例 評価
固定時間待機 await page.waitForTimeout(3000) 非推奨
セレクタ待機 await page.waitForSelector('#result') 推奨
ナビゲーション待機 await page.waitForNavigation() 推奨

3.2 エラーハンドリングパターン

堅牢な自動化スクリプトには、適切なエラーハンドリングが不可欠である。タイムアウト設定、try-catch構文、エラー時のスクリーンショット保存を組み合わせることで、問題発生時の原因特定が容易になる。

async function login(page, username, password) {
    try {
        await page.fill('#username', username);
        await page.fill('#password', password);
        await page.click('#login', { timeout: 5000 });
        await page.waitForNavigation();
        console.log('ログイン成功');
        return true;
    } catch (error) {
        console.log('ログイン失敗:', error.message);
        await page.screenshot({ path: 'error.png' });
        return false;
    }
}

実践アドバイス

  • タイムアウト設定:操作ごとに適切なタイムアウトを設定し、無限待機を防止する
  • スクリーンショット:エラー発生時に画面を保存し、デバッグに活用する
  • リトライ機構:ネットワーク不安定時に備え、一定回数のリトライを実装する
  • ログ出力:処理の進捗をログに出力し、問題箇所の特定を容易にする

3.3 ページ遷移時の待機テクニック

クリック操作とページ遷移が連動する場合、Promise.allを用いて両方のイベントを同時に待機する手法が有効である。

// クリックとページ遷移を同時に待機
await Promise.all([
    page.waitForNavigation(),
    page.click('#login')
]);

3.4 学習チェックリスト

Table 6: 理解度確認項目
項目 確認内容
基本概念 Playwrightの役割と特徴を説明できる
比較理解 Seleniumとの違い(特に自動待機)を説明できる
オブジェクトモデル browserとpageの関係を理解している
セレクタ #id、.class、text=の使い分けができる
実行モード ヘッドレス/ヘッドフルの用途を説明できる
待機処理 固定時間待機が非推奨である理由を説明できる
エラー処理 try-catchでエラーハンドリングを実装できる
Playwrightの優位性まとめ
Playwrightは、自動待機機能、高速な実行速度、安定した動作により、Seleniumの課題を解決したモダンなブラウザ自動操作ライブラリである。特にテスト自動化やWebスクレイピングにおいて、開発効率と信頼性の向上に寄与する。
参考・免責事項
本記事は2025年6月時点の情報に基づいています。Playwrightのバージョンアップにより仕様が変更される可能性があります。最新情報は公式ドキュメント(playwright.dev)をご確認ください。