SeleniumとPlaywright、
本当に速いのはどっちか。
パフォーマンスを徹底解剖する
- SeleniumとPlaywrightの基本概要
- アーキテクチャの違い
- パフォーマンス比較(実測値)
- 機能比較一覧
- コード比較:同じことを書いてみる
- どちらを選ぶべきか?
SeleniumとPlaywrightの基本概要
ブラウザ自動化ツールの選択は、テスト戦略全体に影響を及ぼす重要な意思決定です。2004年に登場したSeleniumは長年のデファクトスタンダードであり、2020年にMicrosoftが公開したPlaywrightは近年急速に採用が拡大しています。
アーキテクチャの違い
パフォーマンス差を理解するには、まず通信モデルの違いを把握する必要があります。
Selenium:WebDriver経由のREST通信
SeleniumはW3C WebDriver仕様に従い、テストコードとブラウザの間にWebDriverサーバーを介します。各コマンドはHTTPリクエストとしてサーバーに送信され、サーバーがブラウザを操作します。このラウンドトリップが蓄積すると、テスト時間全体に影響します。
Playwright:CDPベースの直接通信
PlaywrightはChrome DevTools Protocol(CDP)やブラウザ独自APIをベースとしたバイナリプロトコルでブラウザと直接通信します。中間サーバーが不要なため、レイテンシが大幅に削減されます。また、単一接続でイベント駆動の非同期通信を行うため、並列処理にも最適化されています。
パフォーマンス比較(実測値)
下記は同一環境(macOS 14、Chrome 124、Python 3.12)で標準的なE2Eシナリオを10回実行した平均値です。
※ 上記はベンチマーク目的のデータです。実際の数値はアプリケーション・ネットワーク環境により異なります。
機能比較一覧
| 機能 | Selenium | Playwright | 備考 |
|---|---|---|---|
| 自動待機(Auto-wait) | ✗ 手動実装 | ✓ 標準搭載 | Playwrightは要素が操作可能になるまで自動待機 |
| ブラウザサポート | ✓ IE含む全般 | △ Chrome/FF/Safari | SeleniumはIEやEdge Legacyも対応 |
| 並列実行 | △ Grid要 | ✓ 標準搭載 | Playwright Workersは設定不要で並列化 |
| スナップショットテスト | ✗ 非対応 | ✓ 標準搭載 | VRTツール(Percy等)が不要 |
| ネットワーク傍受 | △ 拡張必要 | ✓ 標準搭載 | APIモック・レスポンス改変が容易 |
| トレース/デバッグUI | ✗ なし | ✓ Trace Viewer | 失敗時のスクショ・ネットワーク記録を確認可 |
| ヘッドレスモード | ✓ 対応 | ✓ 対応 | Playwrightは新headlessモードで更に高速 |
| 言語サポート | ✓ 多言語 | △ 4言語 | RubyやPerlはSeleniumのみ |
| エコシステム成熟度 | ✓ 非常に豊富 | △ 成長中 | Stack Overflow等の情報量はSeleniumが圧倒的 |
| コンポーネントテスト | ✗ E2Eのみ | ✓ 対応 | React/Vue/Svelteコンポーネント単体テスト可 |
コード比較:同じことを書いてみる
「ログインフォームに入力してボタンをクリックし、ダッシュボードのタイトルを検証する」という同一シナリオをPythonで実装した例です。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() try: driver.get("https://example.com/login") # 要素が表示されるまで明示的に待機(手動) wait = WebDriverWait(driver, timeout=10) email = wait.until( EC.element_to_be_clickable((By.ID, "email")) ) email.send_keys("user@example.com") password = driver.find_element(By.ID, "password") password.send_keys("secret") btn = driver.find_element(By.CSS_SELECTOR, "button[type='submit']") btn.click() # ページ遷移後の明示的待機 heading = wait.until( EC.visibility_of_element_located((By.TAG_NAME, "h1")) ) assert heading.text == "Dashboard" finally: driver.quit()
PlaywrightはロールベースのセレクターとAuto-waitにより、WebDriverWaitの手動記述が不要になり、コード量が約40%削減される傾向があります。
どちらを選ぶべきか?
結論:純粋なパフォーマンスとDX(開発者体験)ではPlaywrightが優位です。ただし既存のSeleniumスイートを一気にPlaywrightへ移行するコストと、得られる恩恵のトレードオフを必ず定量評価してください。段階的移行(新規テストのみPlaywright)も現実的な選択肢です。
プログラミング情報サイト「In-Output」" width="1280" height="905" >