「直ったと思ったら別のセレクタが壊れた」を終わらせたい

Playwrightで真面目にE2Eスイートを組んでいるチームの多くが、ある時期から テストを通すこと自体が目的化する状態に陥ります。 ボタンに data-testid を付け忘れたデザイン変更でCIが赤くなり、 原因調査の半分は「セレクタが変わっただけ」「網羅したつもりの待機処理が足りなかった」。 業界調査では テスト時間の40〜60%が既存スクリプトのメンテに使われている と報告されています。[1]

2026年に入って、この問題に対する解答は明確に1つの方向に収束しました。 「コードで操作手順を書く」のをやめて、「自然言語で意図を書き、AIエージェントが実行と修復を担う」 というモデルです。Playwright自体がこの方向に再設計され(v1.56でTest Agents搭載)、 Autify Nexus・QA Wolf・Shiplight・Vibium AI などのAIネイティブQAプラットフォームが 「自然言語をテストの第一級市民」として扱う設計で出てきました。

この記事では、(1) Playwrightが壊れやすい構造的理由、(2) AIネイティブQAの3層モデル、 (3) 主要プレイヤーの整理(Playwright Test Agents / Autify Nexus / QA Wolf / Shiplight / Vibium / Claude Computer Use)、 (4) Build vs Buyの判断軸、(5) 運用のベストプラクティス、(6) よくある落とし穴、 までを整理します。「自然言語でQAを管理したい」を出発点に、現実的に何を選び、どこにガードレールを置くかを決めるための設計図として書きました。

なぜPlaywrightは壊れやすいのか — 構造的な3つの問題

「Playwrightが壊れやすい」のは実装の品質問題ではなく、構造的な3つの問題に由来します。

問題 具体的な症状 本質
セレクタ脆弱性 CSSクラス名・data-testid・XPath が UI 変更で消える/変わる コードが「実装の表現方法」に結合している。実装が変わるとテストも変わる
待機の言語化困難 flakiness の半分は「要素はあるが操作可能でない」「アニメ中」「APIレスポンス遅延」 「ユーザーから見て準備完了」をコードで網羅的に書けない
意図のロスト PRレビューでテストを読んでも「何を検証しているのか」が分からない コードは"How"を書く言語であり、"What/Why"を書く言語ではない

3つ目が一番厄介です。テストファイルを6か月後に見返すと 「page.locator('[data-testid=\"submit-btn-v2\"]') をクリックしている」 という手順は分かっても、 「結局このテストは何を保証しているのか」が誰にも分からなくなる。 そして仕様が変わったときに、テストを修正していいのか、それとも本来テストすべきだった性質が壊れているのかが判断できなくなります。

AIネイティブQAの3層モデル

乱立する「AI Testing Tool」を1つの図に落とすと、すべてが3層の組み合わせで説明できます。 この3層を意識すると、各ツールが「3層のうちどこを置き換える/載せ替えるか」が見えてきます。

flowchart TB
    subgraph IntentLayer[Intent層 — 自然言語/YAML で意図を記述]
      I1[「ログイン後ダッシュボードに<br/>今月の請求額が表示される」]
    end
    subgraph PlannerLayer[Planner — 意図→ステップ列に分解]
      P1[LLMが探索しテスト計画を生成]
    end
    subgraph ExecutionLayer[Execution層 — ブラウザ操作の実体]
      E1[Playwright<br/>+ a11y tree]
      E2[Computer Use<br/>スクリーン操作]
      E3[Vision系<br/>ピクセル理解]
    end
    subgraph HealingLayer[Healing層 — 失敗を解釈し修復]
      H1[セレクタ自動更新]
      H2[ステップ再構成]
      H3[人手レビュー要求]
    end
    I1 --> P1
    P1 --> E1
    P1 --> E2
    P1 --> E3
    E1 -.失敗.-> H1
    E2 -.失敗.-> H2
    E3 -.失敗.-> H3
    H1 -.修復.-> E1
    H2 -.修復.-> E2
AIネイティブQAの3層モデル。Intent層を自然言語にすれば「意図のロスト」が、Healing層を入れれば「セレクタ脆弱性」が解ける

Intent層 — テスト意図を一級市民にする

何を検証したいか」を自然言語またはYAMLで書く層。コードではない、というのが本質です。 ここを充実させた上で実行コードを生成・破棄するアーキテクチャを取ると、UIが変わってもIntentは生き続けます。

# 例: Shiplight風のYAML Intent
test: 月次請求額がダッシュボードに表示される
preconditions:
  - 認証済みユーザーで /dashboard を開いた状態
steps:
  - description: 「請求」セクションを探し、今月の請求金額が3桁区切りの数値で表示されていること
  - description: 数値の右側に通貨記号(¥または$)が付いていること
expectations:
  - 金額は0円以上であること
  - 「請求書PDF」リンクが押下可能であること
tags: [billing, smoke]

Execution層 — Playwrightは消えない、エージェントの下に潜る

「Playwrightは終わるのか」の答えはNoです。AIネイティブQAの大半は、 Playwrightを実行ランタイムとして内部で使い、ユーザーには見せない構造を取ります。 Autify NexusもPlaywrightベース、QA WolfもPlaywrightベース、Shiplightも同様。 違いは「Playwrightのコードを人が書くか、エージェントが書いて捨てるか」だけ。[2]

もう一つの方向が Computer Use / Vision系。 Anthropic Claudeのcomputer_useツールやChrome拡張のClaude for Chromeは、 DOMではなくスクリーンショットを見て操作します。 これは 「セレクタが存在しない世界(Canvas/WebGL/モバイル)」「人間と同じ視覚的バグの検知」 に強みを持ちます。[3]

Healing層 — 失敗を即修復するか、人を呼ぶか

テストが落ちたとき、LLMがDOM差分を読んで「#submit-v1 は消えたが、 同じテキストのbutton[data-action=\"submit\"] がある」と判断し、自動でセレクタを差し替える層。 業界レポートではセルフヒーリングで セレクタメンテのPRが60〜80%減 という数字が出ています。[4]

2026年の主要プレイヤー — どの層を担うかで整理する

各ツールは「3層のうちどこを担うか」「Build寄りかBuy寄りか」で位置が決まります。

ツール Intent記述方法 実行ランタイム セルフヒーリング 形態
Playwright Test Agents (v1.56+) 対話的プロンプト → Markdownテストプラン Playwright本体 Healerエージェント OSS / 自前運用
Autify Nexus 自然言語ステップ + ノーコード Playwright内蔵 Fix with AI(locator自動再生成) SaaS
QA Wolf 英語/自然言語の依頼 Playwright + 自社マネージド マネージド(自社チームが修復) マネージドサービス
Shiplight YAML Playwrightブラウザエンジン AIによる自動メンテ SaaS / セルフサーブ
Vibium AI 対話 + LLM計画 Vision + LLM操作(DOM非依存) 視覚的再認識 SaaS
Claude Computer Use 自然言語 スクリーン操作(OS/ブラウザ問わず) プロンプトで再試行制御 API / 自前統合

Playwright Test Agents — 「OSSのまま」AIネイティブ化した本命

Microsoft Playwright チームが v1.56 で正式投入した3エージェント構成。 Planner(探索→Markdown計画)Generator(計画→Playwrightコード生成)Healer(失敗→修復)のループを公式に提供します。[5]

# Playwright 1.56+ の Agents 起動例
npx playwright agent planner --target http://localhost:3000
# → tests/specs/checkout.md が生成される(Markdown計画)

npx playwright agent generator --spec tests/specs/checkout.md
# → tests/e2e/checkout.spec.ts が生成される

npx playwright agent healer --run last-failed
# → 失敗テストのセレクタを修復して再実行

決定的なのは 「テストコード自体は捨てずに人がレビューできる」こと。 AIが書いたPlaywrightのspecをGit管理し、PRレビューで通す。 「ブラックボックスのSaaSに依存したくない」「コードレビュー文化を維持したい」チームには最適解。 プラットフォーム費用ゼロ、ただしLLM API代と運用工数は自社負担。

Autify Nexus — 自然言語ステップ + Playwright実体

日本発のテスト自動化プラットフォームが2025年4月に大幅刷新し、 「Natural Language Recorder」 で会話的にステップを記述、 「Genesis AI」 でPRDからテストケース自動生成、 「Fix with AI」 でlocator変更時にAIが代替候補を提示、という3点セット。 内部はPlaywrightベース。[6]

QA Wolf vs Shiplight — マネージド vs セルフサーブ

どちらもPlaywrightベースのAIネイティブQAだが、運用モデルが対極。

QA Wolf Shiplight
提供形態 マネージドサービス(彼らのチームが書く・維持する) セルフサーブSaaS(自分でYAMLを書く)
初期スピード 数週で80%+カバレッジに到達(人海戦術) YAMLが書ければ即座に開始可
コード所有権 Playwrightコードが納品されGitに入る YAML(intent)がGitに入る、コードは内部生成
価格モデル カバレッジ単位の高単価サブスク テスト数 / 実行数ベース
向く組織 QAヘッドカウントがないスタートアップ AIコーディングエージェント中心の開発組織

Vibium AI / Claude Computer Use — DOM非依存の異端児

Vibium AIとClaude Computer Useは DOMを見ない。 画面のピクセル/スクリーンショットからLLMが「これは送信ボタンだ」と推論して操作するため、 Canvasアプリ、WebGL、ネイティブアプリ、Flutter Web のような 「DOMセレクタが意味を持たない世界」でも動きます。 代償はコストとレイテンシ — 1テスト8〜15ステップ、1ステップあたり~15Kトークン消費で 100テスト/日なら月$2,250〜$3,300。[7]

Build vs Buy — どこから自前で書くか

どのツールにも当てはまる判断軸を、5つに分けて整理します。

Build(Playwright Test Agents自前) Buy(Autify/QA Wolf/Shiplight)
初期コスト 低(OSS) 中〜高(SaaSサブスク)
立ち上げ速度 1〜2か月 数日〜数週
カスタマイズ 完全自由(CIフロー・レポート・通知) プラットフォームの範囲内
コードレビュー適合 ◎ PR上で議論可能 △ Intentレビューが主、コードはブラックボックス
QAヘッドカウント 必要(運用0.5〜1FTE) 不要 or 縮小可

業界レポート(自己ベンチマーク含むが参考値として)では、 Playwright + 自家製ヒーリングを本番運用レベルまで仕上げるのに エンジニア1〜2名で6〜12か月、初期$100K〜$200K、年間運用$100K〜$200K と試算されています。[4] SaaS導入の月額数千〜数万ドルと比較し、QA組織の規模・既存スタック・コンプライアンス要件で判断するのが定石。

ベストプラクティス — 自然言語QA運用の4本柱

ツールを問わず、AIネイティブQAを健全に運用するための原則を4つに抽出しました。

1. Intent(意図)をリポジトリの第一級市民にする

テストコードは「捨てて再生成できる成果物」、Intentは「再生成のための仕様」として扱う。 YAMLでもMarkdownでもいいので、意図を必ずGit管理し、PRレビューはIntentに対して行う。 生成コードは差分が大きくなりがちなので、PRレビュー対象は tests/intents/**、 生成物は tests/generated/** に置いて .gitignore 寄りに扱うのが運用しやすい。

2. a11yツリー or DOMスナップショットで回帰検知

「セレクタが変わっても通る」はAIネイティブQAの強みですが、 逆に「壊れているのに通ってしまう」リスクも増えます。 対策は、テスト実行時に a11yツリーまたはDOMのスナップショット を保存し、 前回との差分を別レイヤーで監視すること。Playwright 1.56+ はa11yツリー優先のExecution層を備えており、 これをそのまま差分監視に使えます。[5]

3. Healing層に「明示的な許可ポリシー」を置く

セルフヒーリングは「何でも自動で直してOK」では運用が崩壊します。 以下のような 許可ポリシー をHealing層に渡す:

# .qa-healing.yml — Healing許可ポリシー例
auto_heal:
  allow:
    - selector_attribute_change   # data-testid → id みたいな属性違いのみ
    - text_match_alternative      # 同じテキストの別ノードへ
  require_review:
    - tag_type_change             # button → a への変更は人手
    - depth_change_over_2         # 親子関係が2階層以上ずれたら人手
  ban:
    - assertion_modification      # アサーション側の自動書き換えは禁止
notify_on_heal:
  webhook: https://hooks.slack.com/services/...
auto_create_issue:
  threshold_consecutive_heals: 2  # 同じテストで2連続ヒーリングが起きたらissue化

4. 「QAエージェント自身の品質」を評価する仕組みを持つ

AIネイティブQAは「テスト対象アプリ」だけでなく 「QAエージェント自身」も評価対象になります。 既知のバグを意図的にデプロイして「ちゃんと落ちるか」を測る mutation testing の発想を、QAエージェントの精度評価にも取り入れる。 「直近30日でhallucinationによる偽合格が何件発生したか」を計測する仕組みを作っておかないと、 気付かないうちにテストが壁紙化します。

導入ロードマップ — 既存Playwrightスイートから移行する場合

すでにPlaywrightで50〜200本のテストを運用している組織が、AIネイティブQAに段階的に移行する現実的な手順:

メンテ実態の計測

直近3か月のPRから「テスト修正のみのPR」を抽出。flaky率・修正工数・修正種別(セレクタ/待機/assertion)を可視化。これが移行効果のベースラインになる。

Healing層から導入

既存Playwrightコードはそのまま、失敗時のみAIヒーリングを噛ます。Playwright Test Agentsのhealerモード or サードパーティのhealer SaaSを5〜10本のテストでパイロット。最も改善効果が見える順序。

Intent層を新規テストから導入

新規追加するテストはコードを書かず、自然言語/YAMLのIntentで書き始める。Playwright Test Agentsのplanner→generator、または採用ツールのIntent記法。既存テストは無理に書き換えない。

スナップショット監視を並走

a11yツリー or DOMのスナップショットを毎日CIで取り、差分を別チャンネルに通知。「テストは通っているが画面構造は変わっている」を検知する第二の目を持つ。

Healing許可ポリシーの明文化

2か月運用してヒーリングのパターンが見えてきたら、auto_heal / require_review / ban の3区分を.qa-healing.ymlとしてリポジトリにコミット。組織として何を自動修復し何を人手にするかの境界を確定。

モデル評価セットの整備

既知バグを混ぜたmutation setで、QAエージェントの再現率・偽陽性率を四半期ごとに計測。スイートのROIを定量化し、Build/Buyの選択を見直す材料にする。

よくある落とし穴 — 「AIネイティブにしたのに壊れる」典型パターン

落とし穴 なぜ起きる 対策
Intentが曖昧で実行毎に違うステップになる 「ログインする」だけだと、SSO選択画面の有無で挙動が変わる 前提条件(preconditions)と期待結果(expectations)を分離して書く。テスト名に何を検証するかを残す
セルフヒーリングが本物のバグを隠す 「ボタンが消えた = 似たボタンに繋ぎ替える」をデフォルト許可している tag種別変更・depth変更は人手レビュー必須に。連続ヒーリングはissue自動起票
LLMコストが想定の3倍 Healerが毎テスト発動 + 全テストでPlanner再実行 Plannerは新規テストだけ、Healerは失敗時だけ。キャッシュ戦略と「変更されたページのみ再生成」を組み合わせる
QAエージェントの精度が誰も追っていない 「AIが書いてくれた」で安心してしまい、偽合格を検知する仕組みがない 既知バグを混ぜたmutation setを四半期ごとに流し、再現率を計測。70%を切ったらモデル/プロンプト見直し
Intentレビューが形骸化する YAML/Markdownが大量に流れてきて、PRレビューがゴム判化 「Intentレビュー = 仕様レビュー」と位置づけ、PdM/PMが必須レビュアーに入る運用に変える
視覚的バグを見逃す a11yツリーは通っているが、CSSが崩れている / 文字が見切れている Visual regression(Percy / Chromatic / Playwright snapshot)を別ジョブで並走させる

具体例 — Playwright Test Agents で自然言語QAを立ち上げる最小構成

「まず自分で動かしてみたい」向けに、Playwright Test Agentsを使った最小構成を載せます。 OSSのみで完結し、サブスク不要。LLM APIキーだけが必要です。

// playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
  testDir: './tests/e2e',
  use: {
    baseURL: 'http://localhost:3000',
    trace: 'on-first-retry',
  },
  // Test Agents 用設定
  agents: {
    llm: {
      provider: 'anthropic',
      model: 'claude-opus-4-7',
      apiKey: process.env.ANTHROPIC_API_KEY,
    },
    planner: {
      // 探索の深さ・除外パス
      maxDepth: 4,
      excludePaths: ['/admin/billing'],
    },
    healer: {
      // セレクタ修復ポリシー
      allowedStrategies: ['text', 'role', 'attribute'],
      requireReviewOn: ['tagChange', 'depthChange'],
      maxConsecutiveHeals: 1,
    },
  },
});
<!-- tests/intents/checkout.md — 自然言語Intentの例 -->
# Checkout 正常系

## 目的
カート→決済完了までの一連の流れが、ログイン済みユーザーで完走することを保証する。

## 前提
- テスト用ユーザー qa-user@example.com がログイン済み
- カートに商品ID SKU-1234 が1点入っている

## 検証ステップ
1. /cart を開き、合計金額が「¥1,980」と表示されていること
2. 「レジに進む」を押し、決済方法選択画面に遷移すること
3. 「クレジットカード」を選び、テスト用カード番号 4242 4242 4242 4242 を入力
4. 「注文を確定する」を押し、注文完了画面に遷移すること
5. 注文番号が ORD- で始まる文字列で表示されていること

## 副作用検証
- 注文確定後、カートが空になっていること(再度 /cart を開いて検証)

この checkout.mdplanner に食わせるとPlaywrightコードが生成され、 実行時に失敗したら healer がセレクタを直す。 人間がレビューするのは Markdownの方 で、生成されたTSコードは原則触りません。 「仕様変更 = Markdown更新 = コード再生成」が基本フローになります。

まとめ — 「コードを書くQA」から「意図を書くQA」へ

2026年のAIネイティブQAの本質は、QAエンジニアの仕事のレイヤーが上がることです。 「ボタンのdata-testidを追いかける」「waitForSelectorのタイムアウトを微調整する」は、 Playwrightが内部で動き続ける限り存在しますが、もう人間がやる仕事ではありません。 代わりにQA人員がやるべきことは:

  • Intent(意図)の設計 — 何を検証すべきかを、6か月後の自分や同僚が読んでも分かる粒度で書く
  • Healing許可ポリシーの設計 — 自動修復していい変更と、人手レビューが必要な変更の境界を定義する
  • QAエージェント自体の評価 — mutation setで偽合格率を計測し、AIが壁紙化していないかを定期検証する
  • Build/Buyの再評価 — 半年に一度、自前運用とSaaSの実コストを比較し、組織規模に合わせて選び直す

「Playwrightが壊れやすくメンテコストが高い」は、ツールの問題ではなく 「QAをコードで書いていた」設計の限界でした。 Intent層を一級市民にし、Healing層を許可ポリシーで縛れば、Playwrightは強力な下層ランタイムとして これからも10年は使えるはずです。乗り換えるのではなく、上に層を足す。 これがAIネイティブQAへの現実的な移行戦略です。

参考文献

  1. QA Wolf, "The 12 Best AI Testing Tools in 2026"(テストメンテ工数 40〜60% の業界指摘)
  2. Bug0, "Playwright MCP Changes the Build vs. Buy Equation for AI Testing in 2026"(Playwrightが下層ランタイムとして残る構造)
  3. Medium / DevAssure, "How to Build an E2E Web Testing Agent with Claude"(Computer UseでDOM非依存テスト)
  4. aitestingintelligence.substack, "Cost Comparison: Playwright with Agents vs Other Test Automation Tools"(セルフヒーリングPR削減60〜80%、初期/年間運用コスト試算)
  5. Playwright公式ドキュメント, "Test Agents"(v1.56でPlanner/Generator/Healerが公式機能化)
  6. Autify公式, "Autify Nexus Is Live"(Genesis AI / Natural Language Recorder / Fix with AI)
  7. DevAssure, "Using Claude to Build a Testing Agent is Brilliant - Until It Isn't"(Computer Use 8〜15ステップ・~15Kトークン/ステップのコスト試算)

理解度チェック

問題 0 / 50%
Q1

本記事で定義する「AIネイティブQA」の3層モデルにおいて、Intent層・Execution層・Healing層のうち、Playwright本体が主に担う層はどれか。

キーボード: 1〜4 で選択、Enter で回答