Plans, generates, runs, and heals end-to-end tests using Playwright Test Agents (Planner, Generator, Healer) and the official `@playwright/mcp` server. Drives a spec-first feature-flow loop, proposes `data-testid` source diffs only when accessibility-tree locators fail, and stays token-aware via snapshot mode and `--last-failed` reruns. Use when adding E2E coverage, verifying a user journey, hardening a flaky flow, or wiring Playwright MCP into a repo. Triggers on "test this flow", "add e2e",...
Scanned 9/3/2026
Install to Claude Code
npx -y skills add mthines/agent-skills --skill e2e-testing --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of E2e Testing?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/mthines-e2e-testing)More formats (shields.io, HTML) on the badges page.
---
name: e2e-testing
description: >
Plans, generates, runs, and heals end-to-end tests using Playwright Test
Agents (Planner, Generator, Healer) and the official `@playwright/mcp`
server. Drives a spec-first feature-flow loop, proposes `data-testid`
source diffs only when accessibility-tree locators fail, and stays
token-aware via snapshot mode and `--last-failed` reruns. Use when adding
E2E coverage, verifying a user journey, hardening a flaky flow, or wiring
Playwright MCP into a repo. Triggers on "test this flow", "add e2e",
"verify the user journey", "write e2e test", "feature test", "playwright
agents", "/e2e-testing".
disable-model-invocation: false
license: MIT
metadata:
author: mthines
version: '1.0.0'
workflow_type: slash-command
tags:
- e2e
- playwright
- playwright-mcp
- test-agents
- spec-first
- locators
- token-economy
- browser-automation
---
# E2E Testing
Drive end-to-end tests through Playwright's MCP-backed Test Agents — Planner,
Generator, Healer — released in Playwright 1.56 (Oct 2025).
The user writes (or approves) a Markdown feature spec; agents generate the
test, run it against a real browser via the accessibility tree, and self-heal
when locators drift.
> **This `SKILL.md` is a thin index.**
> Decision rules live in [`rules/*.md`](./rules) and load on demand.
> Worked references (agent reference, MCP tool catalog, pyramid math) live
> in [`references/*.md`](./references).
> Literal boilerplate the skill emits lives in [`templates/*.md`](./templates).
> Do not preload everything — load only what the current phase asks for.
---
## When to use
Reach for this skill when any of the following is true:
- A feature has user-facing flow that integration tests cannot fully cover.
- A bug repros only through real navigation (multi-page, auth, real network).
- A flake needs a Healer pass instead of a manual locator hunt.
- The repo has no `@playwright/mcp` wiring yet and needs Phase 0 setup.
Do **not** reach for this skill when:
- A unit or component test would catch the same bug — defer to
[`tdd`](../../quality/tdd/SKILL.md) and the layer rule in
[`rules/layer-decision.md`](./rules/layer-decision.md).
- The change is a pure refactor with no behavioural surface.
- You are adding test infrastructure unrelated to a real flow.
---
## Phase 0 — Preflight (mandatory gate)
Before any agent loop, verify the repo is wired for Playwright Test Agents.
Halt and ask the user before installing anything.
Run these checks (read-only):
```bash
# 1. Playwright + MCP server installed?
jq '.devDependencies | keys[]' package.json | grep -E '@playwright/(test|mcp)'
# 2. Test-agent artefacts present?
ls specs/ tests/seed.spec.ts playwright.config.ts 2>/dev/null
```
Decision table:
| State | Action |
| ------------------------------------------- | ----------------------------------------------------------------------- |
| Both deps present + artefacts exist | Proceed to Phase 1. |
| Deps missing | **Halt.** Print install plan, ask permission before running. |
| Deps present, artefacts missing | **Halt.** Print `npx playwright init-agents --loop=claude`, ask first. |
| Playwright present but version `< 1.56` | **Halt.** Test Agents require 1.56+. Ask permission to upgrade. |
Print the exact commands; do not run them silently.
The install plan template is in [`templates/install-plan.md`](./templates/install-plan.md).
---
## Phase 1 — Spec-first feature flow
The agent loop is **spec → generate → run → heal**.
The spec is human-readable Markdown, not code.
Full rules: [`rules/spec-first-flow.md`](./rules/spec-first-flow.md).
```
specs/<flow>.md ─┐
├─→ Generator ─→ tests/<flow>.spec.ts ─→ run ─→ pass?
│ │ no
│ ▼
└──────────────────── Healer ←────────────── failing test
│
▼
patched test or `data-testid` proposal
```
Two entry points:
1. **Spec already drafted by the user.**
Skip the Planner.
Run the Generator on `specs/<flow>.md`.
2. **App exists, no spec yet.**
Run the Planner against the live app to draft `specs/<flow>.md`.
User reviews the Markdown plan before generation.
Use the Markdown template in [`templates/spec.md`](./templates/spec.md).
### Locator ladder (when generating or healing)
The Generator and the Healer both walk the accessibility tree.
Pick locators in this order — never skip a rung:
1. `getByRole('button', { name: 'Save' })` — accessibility-tree native.
2. `getByLabel`, `getByPlaceholder`, `getByText` — user-facing strings.
3. `getByTestId('save-draft')` — escape hatch only.
`data-testid` is a source change, not a test workaround.
When the Healer cannot find a stable locator at rungs 1–2, propose a source
diff that adds `data-testid` to the component, and offer the diff for user
approval before patching the test.
Full rules and decision criteria: [`rules/locator-strategy.md`](./rules/locator-strategy.md).
---
## Phase 2 — Token-aware execution
Playwright MCP defaults to **snapshot mode** (accessibility tree, text-only).
Do not enable `--caps=vision` unless an explicit pixel-level concern exists.
Full rules: [`rules/token-budget.md`](./rules/token-budget.md).
Defaults the skill prescribes:
- Snapshot mode (no vision) for all agent calls.
- Run only the changed spec on iteration: `npx playwright test --last-failed`.
- Run the Healer **only on failure**, not on every save.
- Reuse `storageState` from `tests/seed.spec.ts` to skip auth on every run.
- Cap the heal loop at three attempts per failing test before escalating.
---
## Phase 3 — Verification
After the Generator produces a test:
1. Run the test once against the live app.
It must pass on first run, or the Healer must converge in ≤ 3 attempts.
2. Invoke [`test-provenance-guard`](../../quality/test-provenance-guard/SKILL.md) on
the generated file to ensure the test imports production code instead
of a private re-implementation.
3. Open `playwright.config.ts` and confirm `trace: 'on-first-retry'` is set
so a future failure produces a trace bundle.
If the heal loop fails to converge:
- Invoke `confidence(analysis)` on the test failure.
- If confidence is below 90%, escalate to the user with the trace, the spec,
and the proposed locator changes — do **not** keep healing blindly.
---
## Decision flow at a glance
| Signal | Do |
| ------------------------------------------------------------ | ------------------------------------------------------------- |
| Bug fixable by a unit or component test | Use [`tdd`](../../quality/tdd/SKILL.md), not this skill. |
| Multi-page user flow, auth, or real network involved | Spec-first feature flow (Phase 1). |
| Flaky existing test | Healer pass only; do not rewrite without spec context. |
| Locator unstable, no stable role / label | Propose `data-testid` diff (rule: locator-strategy). |
| Repo missing Playwright or MCP | Phase 0 halt + ask permission. |
| Heal loop > 3 attempts | Stop, run `confidence(analysis)`, escalate. |
| Test passes on first run, never seen failing | Run `test-provenance-guard` before declaring done. |
---
## Composes with
- [`tdd`](../../quality/tdd/SKILL.md) — owns the unit and component layers.
This skill defers to it for anything below E2E.
- [`test-provenance-guard`](../../quality/test-provenance-guard/SKILL.md) — runs after
Generator output to catch tests-by-construction.
- [`confidence`](../../quality/confidence/SKILL.md) — gate when the heal loop fails.
- [`holistic-analysis`](../../analysis/holistic-analysis/SKILL.md) — if a flow is failing
for reasons no test rewrite can fix, step back instead of patching.
- [`playwright-trace-analyzer`](../../analysis/playwright-trace-analyzer/SKILL.md) —
consume the trace produced by a failed test on retry.
---
## References
- [`references/playwright-agents.md`](./references/playwright-agents.md) —
Planner / Generator / Healer reference, inputs, outputs, invocation.
- [`references/mcp-tool-catalog.md`](./references/mcp-tool-catalog.md) —
the `@playwright/mcp` tool surface, grouped by category.
- [`references/pyramid-2026.md`](./references/pyramid-2026.md) — testing
pyramid math in 2026, with the AI-generation caveat.
## Templates
- [`templates/spec.md`](./templates/spec.md) — feature-flow Markdown spec.
- [`templates/seed.spec.ts`](./templates/seed.spec.ts) — auth and storage
bootstrap, produces `storageState`.
- [`templates/playwright.config.ts`](./templates/playwright.config.ts) —
opinionated config: snapshot mode, traces on first retry, projects per
browser, parallel CI defaults.
- [`templates/install-plan.md`](./templates/install-plan.md) — Phase 0 halt
message with the exact commands to install Playwright + MCP.
---
## Anti-patterns (one-liner — full list in [`rules/anti-patterns.md`](./rules/anti-patterns.md))
- Writing E2E for logic a unit test catches.
- Running the Healer on every save.
- Patching the test with brittle CSS selectors instead of proposing a
`data-testid` diff.
- Enabling `--caps=vision` without a pixel-level requirement.
- Ignoring Healer suggestions and keeping a `.skip()` in CI.
- Generating tests against a stub server, not the real app.
---
## Definition of done
- [ ] Phase 0 preflight passed or installs were user-approved.
- [ ] `specs/<flow>.md` exists and the user reviewed it.
- [ ] `tests/<flow>.spec.ts` passes against the live app.
- [ ] `test-provenance-guard` reports no violations on the new test.
- [ ] `playwright.config.ts` has `trace: 'on-first-retry'`.
- [ ] If a `data-testid` was added, it is in the source diff and committed.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!