先に要点
- Playwright は Microsoft 製の クロスブラウザ E2E テストフレームワーク。「Chromium / Firefox / WebKit(Safari)」 すべてを1つの API で操作できる。
- 特徴は Auto-Wait(要素が表示・操作可能になるまで自動で待つ) Trace Viewer(失敗ステップを実画面の動画 + スクリーンショットで遡れる) codegen(ブラウザ操作を録画してコードに変換) 並列実行 / シャーディング の4本柱。
- モバイル / タブレットのエミュレーション」 「API テスト」 「視覚的回帰テスト」 `ネットワークモック も標準サポート。「E2E テストで欲しいもの一通り」 が揃う。
- 本命の使い所は 中〜大規模 Web アプリの E2E。Vitest の単体テストと棲み分け、「単体は Vitest、E2E は Playwright」 が2026年の事実上の標準構成。
E2E テストフレームワークって Cypress じゃないの? Playwright と Cypress、結局どっち使えばいいの? 「モバイル対応はどう?」 ── 2020 年に登場した Playwright は、急速に Cypress を追い抜き、「現代の E2E テスト」 のデファクトに近い位置を占めるようになりました。
ざっくり言うと、Playwright は ブラウザを自動操作してテストする フレームワークで、3 大エンジン(Chromium / Firefox / WebKit)すべてに対応している のが最大の特徴です。 「Auto-Wait」 でテストの安定性を確保し、「Trace Viewer」 で失敗時のデバッグを劇的に楽にする ── という、「E2E テストが苦手としていた領域」 を構造的に解決した道具です。
この記事では、2026 年 5 月時点の Playwright v1 系をベースに、仕組み・Cypress との違い・典型ユースケース・採用判断軸 を整理します。 仕様は活発に変化しているので、最終確認は 公式ドキュメント を見るのが安全です。
Playwright が解決する E2E の課題
「E2E テストが嫌われる理由」 を整理すると、Playwright の価値が見えます。
①Flaky(不安定)
「 要素が描画される前にクリック」 「非同期処理が完了する前にアサート」 で、テストが時々落ちる(「flaky」)。Playwright の Auto-Wait は 「要素が見える / 操作可能になるまで自動で待つ」 ので、「sleep(1000)」 を撒く必要がない。
② 失敗時のデバッグが難しい
「 CI で失敗したけど、ローカルでは再現しない」 が E2E あるある。Playwright の Trace Viewer は 失敗ステップを動画 / スクショ / DOM スナップショット / ネットワークログ付きで遡れる。「CI ログだけ見て原因が分かる」 が現実的に。
③ クロスブラウザの面倒さ
「 Chrome では動くが Safari で壊れた」 系の問題。Playwright は 3 大エンジン(Chromium / Firefox / WebKit)を1セットで実行 できるので、「OS や Safari がなくても Safari のテストが回る」。
④ テストの書き始めが面倒
codegen で 「ブラウザを開いて手で操作 → テストコードが自動生成」 が可能。「セレクタを目視で探す」 苦痛を減らせる。
「E2E が辛い」 と思っていた理由のかなりの部分が、Playwright で構造的に解消されます。
基本の書き方
最小例で雰囲気をつかみます。
// tests/login.spec.ts
import { test, expect } from '@playwright/test';
test('ユーザーがログインできる', async ({ page }) => {
await page.goto('https://example.com/login');
await page.getByLabel('メールアドレス').fill('alice@example.com');
await page.getByLabel('パスワード').fill('password');
await page.getByRole('button', { name: 'ログイン' }).click();
await expect(page).toHaveURL('https://example.com/dashboard');
await expect(page.getByRole('heading', { name: 'ようこそ' })).toBeVisible();
});
# 実行
npx playwright test
# UI モード(GUI で実行 / デバッグ)
npx playwright test --ui
# Trace を見る
npx playwright show-report
# 特定ブラウザだけ
npx playwright test --project=webkit
セレクタは 「getByRole」 「getByLabel」 中心
「 CSS / XPath」 ではなく ユーザーが見るのと同じ視点でセレクタを書く のが推奨。アクセシビリティのロールを使うので、「実装変更に強いテスト」 になる。
Auto-Wait
「click」 「fill」 「expect」 は 要素が表示 / 操作可能 / 安定するまで自動で待つ。タイムアウト前に何度もリトライ。
UI モード
「--ui」 で立ち上がる GUI。ステップを一つずつ再生 / 巻き戻し / ブラウザ操作で確認 ができる。デバッグの体験が劇的に変わる。
Project 設定
「playwright.config.ts」 で 「projects: [chromium, firefox, webkit]」 を宣言。「どのブラウザで回すか」 をフラグで切り替えられる。
「ユーザーがやることをそのまま書く」 のが、Playwright のテストの書き味を一言で表す部分です。
Trace Viewer の威力
Playwright の特徴で外せないのが Trace Viewer です。
// playwright.config.ts
export default {
use: {
trace: 'retain-on-failure', // 失敗時だけトレース保存
screenshot: 'only-on-failure',
video: 'retain-on-failure',
},
};
これだけで、テストが失敗したときに 動画・各ステップのスクショ・DOM 状態・ネットワークログ・コンソールログ」 がすべてのまとまった `Trace として保存されます。
UI で全部見える
「npx playwright show-trace」 で、「タイムライン上を行ったり来たり」 しながら 「各ステップでブラウザがどう見えていたか」 を確認できる。
CI 失敗の原因究明が速い
「 何が起きていたか分からないから取りあえずリトライ」 が消える。Trace を見れば 1 分で原因が分かる 状態になる。
本番に近いブラウザログ
「 Console エラー」 「Network 異常」 「Cookie 状態」 全部追える。「動かない時の調査」 が 「本番ログを見るのと同じ感覚」 でできる。
CI 統合
GitHub Actions / Vercel CI などに Trace アーティファクトを置けば、「PR の CI 失敗時に Trace をダウンロード → 開く」 が標準フローになる。
「E2E テスト最大の敵 = flaky の原因究明」 を、Trace Viewer は構造的に潰しに行きます。
codegen — 録画でテスト生成
Playwright を初めて触る人がまず驚くのが codegen です。
npx playwright codegen https://example.com
これを実行すると、「ブラウザが立ち上がる + 操作録画ウィンドウが開く」。 ブラウザを手で操作 すると、録画ウィンドウに自動でテストコードが書かれていく。
セレクタ提案
「 クリックした要素のベストなセレクタ」 を Playwright が自動で選んでくれる。「getByRole」 「getByLabel」 「getByText」 など、「実装変更に強いセレクタ」 を優先する。
アサーション挿入
「 この要素は表示されているはず」 をボタンクリックで追加。「expect(...).toBeVisible()」 等のコードが自動で挿入される。
手書きとの相性
「 codegen でたたき台を作って、後で手で整える」 のが現場の使い方。「ゼロから書く」 と 「セレクタ選びで止まる」 が消える。
AI との相性
「 codegen でテスト案を作る → AI に整形・拡張させる」 ループがしやすい。AI 時代の E2E テスト作成 の入り口として相性◎。
「書き始めの心理障壁が圧倒的に低い」 のが、Playwright の普及を後押しした地味だが重要な特徴です。
Cypress との比較
「Cypress と Playwright、どう違う?」 を表で並べます。
| 軸 | Cypress | Playwright |
|---|---|---|
| 登場時期 | 2017 | 2020 |
| 開発元 | Cypress.io | Microsoft |
| 対応ブラウザ | Chromium 系 + Firefox(WebKit は限定的) | Chromium / Firefox / WebKit すべて |
| マルチタブ / ウィンドウ | 制限あり | 完全対応 |
| iframe / OAuth リダイレクト | 制限あり | 標準対応 |
| 並列実行 | Cloud(有料) or 別構成 | 標準で並列・シャーディング |
| API テスト | 標準対応 | 標準対応 |
| Trace / デバッグ | タイムトラベル機能あり | Trace Viewer が高機能 |
| 言語 | JS / TS | JS / TS / Python / Java / .NET |
| 主な選び所 | 既存 Cypress 案件 / ローカル開発体験重視 | クロスブラウザ / 大規模 / 多言語チーム |
要点は クロスブラウザ重視・大規模・多言語チームなら Playwright、ローカル開発体験の手厚さで残る Cypress という棲み分けです。 2026 年現在は 新規プロジェクトのほぼ全てが Playwright を選ぶ 流れになっています。
どんな案件で効くか
「Playwright を選ぶ価値が出る案件」 を整理します。
向いている
① 中〜大規模 Web アプリ、② iOS / Safari 含むクロスブラウザ対応必須、③ E2E が flaky で困っている既存プロジェクト、④ Visual Regression と組み合わせたい、⑤ Storybook + Playwright で UI 検証を一体化したい。
慎重に
① 既に Cypress で安定運用している案件、② 完全に静的なサイトで E2E が要らない、③ 個人開発の数ページ MVP(やりすぎ)。
単体テストとの棲み分け
「 単体は Vitest、統合は Vitest or Playwright Component Test、E2E は Playwright」 という3層構成が2026年現在の標準。
「E2E を真面目にやる案件 = Playwright」 がほぼ等号で結べる状態が、2026 年の景色です。
どこで詰まりやすいか
便利な反面、現場で踏みやすい注意点も整理します。
①セレクタの設計
「 data-testid」 を雑に貼っていくと保守が辛い。「 getByRole / getByLabel / getByText」 を優先、「どうしてもなら data-testid」 という階層を守る。
② 状態のセットアップ
「 毎回ログイン処理を E2E で走らせる」 は遅い。storageState で認証済み状態を保存 / 復元 するパターンで、各テストの開始が高速化する。
③ CI でのリソース
「 3 ブラウザ × 並列」 で CI のリソースを大きく食う。`シャーディング(「--shard」)」 で複数 worker に分散、必要なら 「主要ブラウザだけメインで、Safari は週次」 のような切り分け。
④ ネットワークモック
「 本物の API を叩く E2E」 と 「モック化した E2E」 のどちらかで決め切るのが大事。「ハイブリッド」 にすると 「どこで失敗したか分からない」 状態になりやすい。
「E2E は維持コストが高い」 という前提を忘れず、「本当に E2E にすべきシナリオに絞る」 のが運用上の鉄則です。
AI 時代の Playwright
AI 連携の文脈でも Playwright の役割は強まっています。
AI でテスト生成
「 AI に E2E テストを書かせる」 ユースケースで、Playwright の API は構造化されていて出力品質が高い。「codegen + AI 整形」 が事実上の標準ワークフロー。
エージェント型 Web 操作
「 AI エージェントが Web を操作する」 用途で、Playwright が基盤として広く使われている。「Browser Use」 など AI エージェントフレームワークの土台に。
AI 駆動の Visual Regression
` スクリーンショットを AI に投げて、「意味のある変化かどうか」 を判定する」 ような VR が現実的になりつつある。Playwright のスクショ機能が入り口。
「AI と Web 自動化の交差点」 にいる道具として、Playwright の重要性はテスト用途を超えて拡大しています。
Playwright に関するよくある質問
Q. Cypress から Playwright に移行する価値はありますか?
A. クロスブラウザが必要、flaky に困っている、並列実行をオープンソースで使いたい ならアリ。「既存 Cypress が安定運用できているなら無理に移行しない」 のも合理的です。「新規 / 大規模 / 移行コストが許容できる」 案件ほど Playwright のメリットが効きます。
Q. ブラウザ3つ全部で回すべきですか?
A. プロダクトのユーザー分布次第です。「Chromium だけで日常的に回し、Firefox / WebKit は週次 / リリース前」 のような運用が現実的なケースが多いです。「全部毎回回す」 は CI 時間を3倍に増やすので、目的と相談です。
Q. モバイルテストはできますか?
A. モバイルデバイスのエミュレーションが標準サポートされています。「--project='Mobile Safari'」 や 「devices['iPhone 15']」 のような設定で、「iPhone Safari っぽい挙動」 を再現できます。本物の実機テストには BrowserStack / Sauce Labs」 のサービスを併用。
Q. Playwright と Storybook はどう組み合わせますか?
A. Playwright Component Testを使うと、Storybook の Story をそのまま E2E として走らせることができます。「Story をテストデータとして共有」 する流れで、「Vitest + Storybook + Playwright」 の3点セットがハマる案件で強力です。
Q. CI(GitHub Actions など)でどう設定する?
A. Playwright 公式のセットアップ Actionを使うのが定石です。「browsers をキャッシュ」 「Trace アーティファクトを保存」 「失敗時の動画をアップロード」 などのテンプレが公式に揃っています。
Q. ローカルで遅いです、どうしたらいい?
A. ① 「--project=chromium」 で1ブラウザに絞る、② 「--ui」 で対象テストだけ実行、③ 「storageState」 で認証セットアップを使い回す、④ 「expect(page).toHaveURL(...)」 で正規表現マッチを使う。「どこで時間を食っているか」 を Trace Viewer で確認するのが王道です。
Q. Playwright の学習コストは?
A. 数時間で書き始められるレベルです。「codegen」 でたたき台を作り、「UI モード」 で実行しながら、「公式ドキュメントの API リファレンス」 を辞書として使えば十分。「E2E の本質的な難しさ」 のほうがフレームワーク学習より大きい点も覚えておく価値があります。