プログラミング ソフトウェア 公開日 2026.05.15 更新日 2026.05.20

Playwright とは何か?クロスブラウザ E2E テストの定番と Cypress との使い分け

Playwright は Microsoft 製のクロスブラウザ E2E テストフレームワークで、Chromium / Firefox / WebKit のすべてを1つのコードで自動操作できます。Auto-Wait による安定性、trace / video / codegen のデバッグ支援、並列実行などが特徴で、Cypress に対する有力な選択肢として2026年現在は事実上のデファクトです。

先に要点

  • Playwright は Microsoft 製の クロスブラウザ E2E テストフレームワーク。「Chromium / Firefox / WebKit(Safari)」 すべてを1つの API で操作できる。
  • 特徴は Auto-Wait(要素が表示・操作可能になるまで自動で待つ) Trace Viewer(失敗ステップを実画面の動画 + スクリーンショットで遡れる) codegen(ブラウザ操作を録画してコードに変換) 並列実行 / シャーディング の4本柱。
  • モバイル / タブレットのエミュレーション」 「API テスト」 「視覚的回帰テスト」 `ネットワークモック も標準サポート。「E2E テストで欲しいもの一通り」 が揃う。
  • 本命の使い所は 中〜大規模 Web アプリの E2EVitest の単体テストと棲み分け、「単体は 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年現在の標準。

Visual Regression

「expect(page).toHaveScreenshot()」 だけで 「スクリーンショット差分テスト」 ができる。Chromatic ほどリッチではないが、「自前で VR 基盤を作る」 入り口として有力。

「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 のスクショ機能が入り口。

本番 / プロダクション監視

「 本番サイトを定期的に Playwright で巡回 → 異常検知 → AI で要約」 という監視パターン。Synthetic Monitoring の DIY 構築。

「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 の本質的な難しさ」 のほうがフレームワーク学習より大きい点も覚えておく価値があります。

参考リンク

あとで見返すならここで保存

読み終わったあとに残しておきたい記事は、お気に入りからまとめて辿れます。