Write E2E Tests
Turns a browser UI flow into a checked-in Playwright Test spec.
Webwright is the exploration engine:
it produces plan.md and final_script.py. This skill unblocks a missing
toolchain or run after confirmation, then converts.
Scope
The output is always a Playwright Test spec — no per-project detection of another framework, no cross-framework translation. An existing Cypress or Selenium suite stays; confirm before adding Playwright beside it.
Workflow
Inventory. In the target project, mark each of these present or absent: a JS package manifest and its package manager;
@playwright/testandplaywright.config; the webwright skill; a qualifying run; another e2e stack (Cypress, Selenium); existing CI files; webwright artifact paths git still tracks. Webwright is present when~/.agents/skills/webwright/SKILL.mdor<repo>/.agents/skills/webwright/SKILL.mdexists (follow symlinks). The session's loaded-skill list is not evidence. Leave this step when every item is marked. No package manifest — stop and report.Toolchain. If Playwright, browsers, or webwright are missing, confirm once for those items and follow references/setup.md. Another e2e stack without Playwright — confirm adding Playwright beside it.
Find a qualifying run. Search
outputs/,final_runs/, and any path the user named forplan.mdplusfinal_script.pywhose Critical Points are all checked. Found — show the path and reuse it unless the user asks to re-run. Otherwise go to explore.Explore. Confirm on its own before driving the real site. If the user has not named the flow, ask. Load webwright's
SKILL.mdand run it to Done. Leave this step when webwright reports Done and a qualifying run from step 3 is on disk. Reading source is not Explore. Convert is the next step. Exploration stays in webwright.Repo — gitignore. Propose
.gitignorerules when unignored webwright artifacts exist (outputs/,final_runs/, screenshots/logs) or this run just scaffolded Playwright (test-results/,playwright-report/). Write only after confirmation. Add rules only; do notgit rm --cachedalready-tracked files.Convert. Start only when step 3's
plan.mdandfinal_script.pyexist; missing — return to Explore. How to handle a scan hit is in references/security.md.- Scan input. Run
scripts/scan-secrets.shonfinal_script.py. Non-zero exit: follow that doc. A visual read of the script is not a scan. Draft only after the scan exits 0, or after every hit has a confirmedprocess.envmapping. - Map and draft. Map each Critical Point in
plan.mdone-to-one to anexpect()assertion; that mapping is the whole of the conversion. Usefinal_script.pyfor selectors and action order only. Write credential fields asprocess.envnames; leave selectors and non-credential fixtures as literals. - Scan output. Run
scripts/scan-secrets.shon the drafted spec before writing it. Non-zero exit: follow that doc. Write only a spec the script accepts. Place the spec in the project's existing e2e test directory (its Playwright config'stestDir, or the project's established convention), named after the flow being converted.
- Scan input. Run
Validate. Run all three gates, in order:
- Run — execute the generated spec once; it passes.
- Stable — re-run it 3 consecutive times; all 3 pass.
- Discoverable — the project's test-run command finds the new spec file. A remote pipeline is not required. On failure, attempt an automatic fix and re-validate, up to 2 attempts. Still failing after that — stop and report. Hand back only a spec that has passed all three gates.
Repo — CI. After Validate, follow references/ci.md. Write only after confirmation.