WebアプリやWebサービスを開発・運用していると、「Chromeでは問題なく動いたのに、iPhoneやMacのSafari(WebKit)で画面が動かなかった」「自動テストを導入したものの、通信のタイミング次第で毎回ランダムにテストが失敗してしまい、結局メンテナンスされなくなった…」といった悩みに直面することが少なくありません。
こうした従来のブラウザ自動操作・E2E(End-to-End)テストにおける長年の課題を解消する存在として、世界中の開発現場で急速に標準ツールへと定着しているのが、Microsoft製のオープンソースフレームワーク「Playwright(プレイライト)」です。
本記事では、Playwrightが誕生した歴史的背景や従来ツール(Selenium・Puppeteer・Cypress)との違いから、最大の特長である「auto-wait(自動待機)」の仕組み、ブラウザを操作するだけでテストコードを生成できる便利機能、初期セットアップ手順まで丁寧に分かりやすく解説します。
Playwright(プレイライト)とは?一言でいうと「現代的なブラウザ自動操作・E2Eテスト基盤」
Playwright(プレイライト)とは、Microsoftが2020年1月にオープンソースとして公開した、Webアプリケーション向けのブラウザ自動操作およびE2E(End-to-End)テストフレームワークです。
ちなみに英単語の「playwright」は「劇作家・脚本家」という意味を持っています。Webブラウザという「舞台」の上で、ユーザーのクリックや文字入力・画面遷移といった一連のシナリオ(演劇)をコードとして描き、その通りに上演されるかを確かめるツールという粋なイメージが込められています。
そもそも「E2E(End-to-End)テスト」とは?
プログラムの個別の関数を検証する「単体テスト(ユニットテスト)」とは異なり、実際のユーザーと同じようにブラウザを立ち上げ、「ログイン画面でIDを入力 → 商品を検索してカートに追加 → 決済ボタンを押して完了画面が表示される」というシステムの端から端(End-to-End)までの通し動作をまるごと自動検証するテスト手法のことです。
まずはPlaywrightの基本プロフィールを一覧表で確認しておきましょう。フロントエンド開発で主流のTypeScript / JavaScriptだけでなく、PythonやJava、C#からも同じ設計思想で利用できるのが大きな魅力です。
| 項目 | Playwrightの仕様・概要 |
|---|---|
| 開発元・ライセンス | Microsoft(オープンソース / Apache-2.0 ライセンス) |
| 初回リリース | 2020年1月 |
| 対応ブラウザエンジン | Chromium(Google Chrome / Microsoft Edge)、WebKit(Apple Safari)、Firefox |
| 対応プログラミング言語 | TypeScript / JavaScript / Python / Java / C#(.NET) |
| 対応OS・実行モード | Windows / macOS / Linux(画面を表示しないヘッドレス実行・画面ありのヘッドフル実行の両対応) |
| 主な活用領域 | WebアプリのE2Eテスト、REST APIテスト、定型ブラウザ業務の自動化、AIエージェントのブラウザ操作基盤 |
なぜPlaywrightが生まれたのか?従来ツールの歴史と解決した課題
Playwrightが登場する以前にも、Webブラウザを自動操作するための優れたツールがいくつも存在していました。それぞれの歴史と抱えていた課題を知ると、「なぜPlaywrightがこれほど支持されているのか」がすっきりと理解できます。

Selenium(2006年〜):クロスブラウザ対応の老舗と「Flakyテスト」の悩み
長年にわたりブラウザ自動化の代名詞として使われてきた定番ツールです。多様な言語とブラウザに対応している一方、テストコードとブラウザの間に「WebDriver」という中継プログラムを挟んでHTTP通信で命令を送る構造のため、ブラウザのバージョンに合わせたドライバ管理の手間や実行速度の遅さが課題になりがちでした。また、非同期で動く現代のWebアプリではタイミングずれによって「同じテストなのに成功したり失敗したりする不安定なテスト(Flaky test)」に悩まされるケースが多くありました。
Puppeteer(2018年〜):軽快な操作性とブラウザ限定の壁
GoogleのChrome DevToolsチームが開発したNode.js向けライブラリです。ブラウザの開発者ツール用プロトコル(CDP)を通じて直接ブラウザを操るため、Seleniumよりも高速でセットアップも手軽になりました。しかし、原則としてChrome(Chromium)系に特化した設計であり(近年Firefox対応も進みましたがSafari相当のWebKitには非対応)、また単体のブラウザ操作ライブラリであるため、テストランナーやアサーション機能はJestなどを別途組み合わせる必要がありました。
Cypress(2018年〜):優れた開発者体験とアーキテクチャ上の制約
「開発者にとっての書きやすさ・デバッグのしやすさ(DX)」を重視して大きな人気を集めたE2Eテストツールです。GUI上でテスト経過を見ながら快適に開発できる反面、ブラウザ内部のJavaScriptと同じ実行ループ内で動く独自アーキテクチャを採用していたため、複数タブや複数ウィンドウをまたぐ操作、iframe内の操作、Safari(WebKit)での検証などに苦手分野がありました。
実は、Playwrightを立ち上げたMicrosoftの開発チームには、かつてGoogleでPuppeteerを設計・開発していた中心メンバーたちが参加しています。先代ツールの長所と限界を熟知していたエンジニアたちが、「マルチブラウザ対応」「壊れにくい安定性」「テストに必要な全機能が最初から揃った開発体験」をひとつに統合するためにゼロから設計したのがPlaywrightなのです。
| 従来のE2Eテストの課題 | Playwrightにおける解決策 |
|---|---|
| 検証できるブラウザが限られる | Chromium・Firefox・WebKitの3大エンジンを同一のコードで一括操作できる(WindowsやLinux上でもSafari相当のWebKit検証が可能) |
| テストが不安定で壊れやすい(Flaky) | auto-wait(自動待機)機能により、要素が表示されクリック可能になるまでフレームワーク側が自動で待機する |
| 環境構築やドライバ更新が煩雑 | npm init playwright@latest のコマンドひとつで設定ファイルから検証用ブラウザ本体まで自動導入される |
| 並列実行が遅くテスト同士が干渉する | 軽量なBrowserContext(独立したブラウザ環境)を数ミリ秒で立ち上げ、複数ワーカーによる高速な並列実行を標準サポート |
| 失敗した原因の特定(デバッグ)が困難 | Trace ViewerやUI Modeにより、全ステップの画面・通信ログ・DOM状態を録画のように巻き戻して確認できる |
技術的な裏側:Playwrightが高速に動く2つの理由
Playwrightは操作のたびにHTTP通信を繋ぎ直すのではなく、WebSocketによる1本の常時接続パイプを使ってブラウザエンジンと双方向に高速通信します。さらに、テスト1件ごとに重いブラウザアプリ自体を再起動するのではなく、1つのブラウザプロセスの中に「シークレットウィンドウ」のような独立空間(BrowserContext)を瞬時に作っては破棄するため、Cookieなどが他テストと混ざらず圧倒的なスピードで並列実行できます。
Playwright最大の強み「auto-wait(自動待機)」と壊れにくい設計
ReactやVue、Next.jsなどで作られた現代のWebアプリケーションでは、ボタンを押した後にAPI通信が走り、少し遅れて画面のDOM(Document Object Model)が書き換わったり、モーダルがふわっとアニメーション表示されたりするのが当たり前です。
従来のE2Eテストが壊れやすかった一番の原因は、「まだ画面上に準備できていない要素に対して、プログラムが先回りしてクリックや入力を実行してしまうこと」にありました。

旧来の書き方(固定のsleep指定)とPlaywright(auto-wait)の比較
旧来のテストコードでは、画面の切り替わりを待つために「とりあえず2秒間処理を止める(sleep)」といった記述が頻繁に差し込まれていました。
// 旧来の書き方:手動で固定の待ち時間(sleep)を入れていた例
await page.click('#submit-button');
await sleep(2000); // とりあえず2秒待つ(通信が重い日は足りずにエラーになる)
await page.fill('#result-memo', '確認完了');
このやり方には大きな弱点が2つあります。CIサーバーの負荷が高くて応答に2.5秒かかった日にはタイムアウトしてテストが失敗してしまいますし、逆に0.2秒で画面が表示されたときでも毎回きっちり2秒間待ち続けるため、テストが増えるほど実行時間が何十分にも膨れ上がってしまうのです。
一方、Playwrightには「auto-wait(自動待機)」が標準で組み込まれています。人間が sleep を書く必要は一切ありません。
// Playwrightの書き方:sleep不要!操作可能になる瞬間まで自動で待って即実行
await page.click('#submit-button');
await page.fill('#result-memo', '確認完了');
たった2行のシンプルなコードですが、Playwrightはクリックや文字入力を実行する直前に、裏側で次の5つのアクション可能条件(Actionability)を自動的にチェックして待機してくれます。
- DOMへのアタッチ(Attached):対象の要素がHTMLのDOMツリー上に存在しているか?
- 画面上の表示状態(Visible):非表示(
display: noneなど)ではなく、画面に見える大きさを持っているか? - 座標の安定・アニメ完了(Stable):スライドインなどのCSSアニメーションが終わり、要素の位置が静止したか?
- イベントの受信可否(Receives Events):ローディング画面や別のポップアップが上に被さって邪魔をしていないか?
- 有効状態(Enabled):ボタンや入力欄が
disabled(非活性)になっていないか?
デザイン変更でも壊れにくい「ユーザー目線のロケーター」と自動待機検証
さらにPlaywrightでは、要素を探す方法(ロケーター)としても、デザインの修正ですぐに変わってしまうCSSクラス名(.btn-primary-v2 など)ではなく、「実際のユーザーが画面で見ている役割(Role)やラベル名」で指定する書き方が推奨されています。また、結果を検証する expect にも自動リトライ待機が備わっています。
import { test, expect } from '@playwright/test';
test('お問い合わせフォームを送信できること', async ({ page }) => {
await page.goto('https://example.com/contact');
// ラベル名やボタンの役割(Role)で直感的に操作できる
await page.getByLabel('お名前').fill('山田 太郎');
await page.getByRole('button', { name: '送信する' }).click();
// 表示されるまで自動でリトライ待機してから文字を検証する(Web-First Assertions)
await expect(page.getByText('送信を受け付けました')).toBeVisible();
});
このように書かれたテストは、人間が日本語のテスト仕様書を読むようにスラスラと理解でき、HTMLの細かなタグ構造やCSSクラス名をリファクタリングしてもテストが壊れないという実務上の大きな恩恵をもたらします。
テスト作成とデバッグが劇的に楽になるPlaywrightの便利機能
「E2Eテストは書くのに時間がかかるし、失敗したときに原因を調べるのが大変…」というハードルを取り除くため、Playwrightには最初から強力な支援ツール群が同梱されています。特に押さえておきたい6つの機能を見ていきましょう。

コードジェネレーター(codegen):ブラウザを手動操作するだけでコード自動生成
初めてPlaywrightを触る方が一番驚く機能がコードジェネレーター(codegen)です。以下のコマンドを実行すると、操作用のブラウザとインスペクター画面が同時に立ち上がります。
npx playwright codegen https://example.com
あとは普段通りにマウスでリンクをクリックしたりフォームに文字を入力したりするだけで、横のウィンドウに推奨ロケーター(getByRole など)を使ったTypeScript / Python等のテストコードがリアルタイムで自動出力されます。ゼロからセレクタを調べる手間がなくなり、テスト作成スピードが何倍にも跳ね上がります。
Trace Viewer(トレースビューア):失敗した全過程を録画タイムラインで振り返り
自分のPCでは通ったテストが、夜間のCI(GitHub Actionsなど)で失敗したとき、「画面が見えないサーバー上で何が起きたのか分からない」と困った経験はないでしょうか。PlaywrightのTrace Viewerを使えば、テスト実行中の全過程を記録したトレースファイルをブラウザ上で開いて調査できます。
npx playwright show-report
- 各クリックや入力の「直前・直後」の画面状態と、どこをクリックしたかを示す赤いポインター
- その瞬間の実際のDOMスナップショット(単なる静止画ではなく、開発者ツールで要素検証が可能!)
- 裏側で通信されたネットワークリクエスト(APIのステータスコードやJSONの中身)とコンソールエラーログ
これらが動画編集ソフトのようなタイムライン上に並ぶため、「ボタンが押せなかったのではなく、直前のAPIが500エラーを返していたんだ!」とひと目で原因を特定できます。
UI Mode(UIモード):GUI画面でステップ確認もホットリロードも自在
バージョン1.32で追加されたUI Modeは、手元でテストを書きながら動作確認するときにおすすめの対話型実行画面です。
npx playwright test --ui
左側にテスト一覧、右側にタイムトラベル可能なブラウザプレビューが表示され、特定の1件だけを再生したり、ウォッチモード(目のアイコン)をオンにしてエディタでコードを保存するたびに即座に自動再実行(ホットリロード)させたりと、軽快なリズムで開発を進められます。
スクリーンショット・操作動画・トレースの自動保存
設定ファイル(playwright.config.ts)に数行書いておくだけで、「普段はディスク容量を節約し、テストが失敗したときだけ証拠のスクリーンショットや動画を自動で残す」という運用が簡単に組めます。
// playwright.config.ts の設定例
import { defineConfig } from '@playwright/test';
export default defineConfig({
retries: 1, // 失敗時に1回リトライする
use: {
screenshot: 'only-on-failure', // 失敗時のみスクリーンショットを自動保存
video: 'retain-on-failure', // 失敗時のみ操作動画を保持
trace: 'on-first-retry', // 初回リトライ時に詳細トレースを記録
},
});
REST APIテストも同じフレームワークで一元管理できる
Playwrightは画面操作だけでなく、組み込みの request コンテキストを使ってバックエンドのREST APIテストも同じテストファイル内に記述できます。「先にAPIを叩いてテスト用の商品データを素早く登録し、その直後にブラウザ画面を開いて表示を確認する」といったハイブリッドなテストもスムーズに書けます。
import { test, expect } from '@playwright/test';
test('ユーザー取得APIが正しいJSONデータを返すこと', async ({ request }) => {
const response = await request.get('/api/users/1');
expect(response.status()).toBe(200);
const body = await response.json();
expect(body.name).toBe('Alice');
});
複数タブ操作やログイン認証状態の保存・使い回し(storageState)
別タブで開く外部決済画面やポップアップウィンドウの操作に強いのはもちろん、実務で絶大な威力を発揮するのがログイン状態のファイル保存(storageState)です。
100件のテストがあるとき、毎回ログイン画面でIDとパスワードを入力していると膨大な時間がかかります。最初に1回だけログインしてCookieやLocalStorageの状態をJSONファイルに書き出しておけば、残りのテストはすべて「最初からログイン済みの状態」で一瞬でスタートできます。
// 保存しておいた認証情報(Cookie / LocalStorage)を読み込む
test.use({ storageState: 'playwright/.auth/user.json' });
test('ログイン後のマイページが表示されること', async ({ page }) => {
await page.goto('/dashboard');
// ログイン画面の入力ステップを省略して、すぐ本題の検証に入れる!
await expect(page.getByRole('heading', { name: 'マイページ' })).toBeVisible();
});
Playwrightの導入手順とよく使う基本コマンド早見表
ここからは、実際に自分のパソコンへPlaywrightを導入して動かすまでの流れを見ていきましょう。Node.js(LTS版推奨)が入っていれば、驚くほどあっさりと準備が整います。

コマンドひとつで完了する初期セットアップ手順とフォルダ構成
新しいフォルダ(または既存のWebアプリプロジェクトのルートディレクトリ)でターミナルを開き、次の初期化コマンドを実行します。
# プロジェクトへPlaywrightを導入する初期化コマンド
npm init playwright@latest
コマンドを実行すると、対話形式で3〜4つの質問が表示されます(基本的にはEnterキーで初期値のまま進めて問題ありません)。
- TypeScript or JavaScript?:特別な理由がなければ型補完が効いて書きやすい
TypeScriptがおすすめです。 - Where to put your end-to-end tests?:テストファイルを置くフォルダ名(標準は
testsまたはe2e)。 - Add a GitHub Actions workflow?:
trueを選ぶと、GitHubへプッシュした際に自動テストを回す設定ファイル(YAML)まで一緒に作ってくれます。 - Install Playwright browsers?:
trueを選ぶと、Chromium・Firefox・WebKitの検証用ブラウザバイナリが自動的にダウンロードされます。
完了すると、プロジェクト内に以下のようなシンプルで分かりやすいファイル構成が自動生成されます。なお、VS Codeをお使いの方は公式拡張機能の「Playwright Test for VSCode」も入れておくと、エディタの行番号横にある再生ボタンからワンクリックでテストを実行できてさらに快適です。
your-project/
├── tests/
│ └── example.spec.ts # すぐに動かして試せるサンプルテストコード
├── playwright.config.ts # 対象ブラウザ・並列数・タイムアウト等の設定ファイル
└── package.json
Pythonユーザー向け:PythonでPlaywrightを導入する場合
業務自動化やスクレイピング、Django / FastAPIアプリのテストなどでPythonからPlaywrightを使いたい場合も、わずか2ステップで導入できます(playwright codegen もそのまま利用可能です)。
pip install pytest-playwright
playwright install
実務でよく使うテスト実行・デバッグコマンド一覧
日々の開発やデバッグで頻繁に使う代表的なCLIコマンドを目的別に整理しました。ブックマーク代わりに活用してください。
| 実行コマンド | 動作内容・使うタイミング |
|---|---|
npx playwright test |
設定された全ブラウザで、すべてのテストをヘッドレス(画面非表示)で一斉並列実行する |
npx playwright test tests/login.spec.ts |
指定したテストファイルだけを実行する(修正中の素早い確認に便利) |
npx playwright test --ui |
UIモードを起動し、GUI画面上でステップごとの状態を見ながら実行する(開発時イチオシ) |
npx playwright test --headed |
実際にブラウザウィンドウを画面に表示しながら動きを目視確認する |
npx playwright test --project=webkit |
特定のブラウザ(例:Safari相当のWebKitのみ)に絞ってテストを実行する |
npx playwright show-report |
直近のテスト結果HTMLレポートとTrace Viewerをブラウザで開く |
npx playwright codegen https://example.com |
対象URLをブラウザで開き、手動操作からテストコードを自動生成する |
Playwrightが活躍する場面と他ツールとの適切な使い分け
多機能で頼もしいPlaywrightですが、「すべてのテストをPlaywrightだけで書くべき」というわけではありません。向いている領域と他ツールに任せるべき領域を切り分けることで、保守性の高い快適な開発体制を作ることができます。
Playwrightの導入効果が特に大きい場面
- ビジネスに直結する重要導線の通しテスト:「会員登録 → 商品購入 → 決済完了 → マイページ履歴反映」のように複数ページや外部連携をまたぐシナリオ。
- ログイン認証や権限管理が絡む画面:一般ユーザーと管理者アカウントの切り替え、複数タブでの同時操作検証。
- クロスブラウザ・スマホ表示の自動検証:Chrome・Firefox・Safari(WebKit)やモバイル画面サイズでの崩れ・動作不良の早期検知。
- CI/CDパイプラインでのリリース前ゲート:GitHub Actions等と連携し、プルリクエスト時に主要機能が壊れていないかを毎回自動チェックする仕組み。
- ブラウザ業務のRPA化やAIエージェント連携:管理画面への定型データ入力・記事入稿の自動化や、近年注目されているブラウザ操作を自動化するAIエージェント(Playwright MCPサーバーなど)の実行エンジンとしての活用。
他のテストツールに任せた方がよい場面
- 単一の計算関数やバリデーションの細かい分岐テスト:消費税計算や入力文字数チェックの全パターンなどを毎回ブラウザ起動で検証すると非効率です。これらは Vitest や Jest などの高速な単体テスト(ユニットテスト)でミリ秒単位で検証しましょう。
- バックエンド内部のビジネスロジック単体検証:データベース計算やクラス単体のロジックは、各言語の標準テスティングフレームワーク(pytest・JUnit・RSpecなど)で細かく守り、Playwrightは「システム全体を通したユーザー体験の保証」に集中させるのが理想的なバランスです。
まとめ
本記事のポイント
- Playwright(プレイライト)は、Microsoftが開発したオープンソースのブラウザ自動操作・E2Eテストフレームワーク。
- Chromium・Firefox・WebKit(Safari相当)の主要3大ブラウザエンジンを1つのコードで操作でき、TypeScript / JavaScript / Python / Java / C# に対応している。
- 最大の特長である「auto-wait(自動待機)」により、手動の
sleep記述をなくして高速かつ壊れにくい安定したテストを実現できる。 - ブラウザ操作からコードを自動生成する codegen、失敗原因を録画のように追える Trace Viewer、対話型の UI Mode、さらにAPIテストや認証状態の保存(
storageState)まで標準搭載されている。
「書きやすく・安定していて・原因調査もしやすい」という三拍子が揃ったPlaywrightは、Web開発の品質保証だけでなく、日々の繰り返しブラウザ作業を自動化する頼もしい相棒にもなってくれます。
まだ触れたことがない方は、ぜひ npm init playwright@latest で環境を作り、npx playwright codegen で自分のマウス操作がそのままコードに変わっていく心地よい体験から始めてみてください。
