E2e testing
VexJoy AI Agent with Intelligent Routing - /do routes plain-English requests to the right specialist agent and gates the work with reviews, tests, and a learning loop.
npx -y skills add notque/vexjoy-agent --skill e2e-testingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Playwright-based end-to-end testing workflow.
SKILL.md
8.5 KB, as published. Nobody here has run it
E2E Testing Skill (Playwright)
Playwright-based E2E testing across four phases: Scaffold, Build, Run, Validate. Each phase produces a saved artifact and must pass its gate before the next phase begins.
Reference Loading Table
| Signal | Load These Files | Why |
|---|---|---|
| async, Promise.all, race condition, waitForTimeout, fixture teardown | async.md | Routes to the matching deep reference |
| auth, login, storageState, OAuth, SSO, JWT, RBAC, multi-role, session expiry | auth.md | Routes to the matching deep reference |
| config, playwright.config.ts, POM, data-testid, CI/CD workflow | templates.md | Routes to the matching deep reference |
| error, timeout, tsc fail, locator, fill, missing JSON | errors.md | Routes to the matching deep reference |
| POM examples, waiting, multi-browser, shared auth session | playwright-patterns.md | Routes to the matching deep reference |
| Web3, MetaMask, wallet, addInitScript | wallet-testing.md | Routes to the matching deep reference |
| payment, financial, production skip, blockchain | financial-flows.md | Routes to the matching deep reference |
| flaky, intermittent, repeat-each, retries, quarantine | flakiness-triage.md | Routes to the matching deep reference |
Instructions
PHASE 1: SCAFFOLD
Goal: Verify Playwright is installed, create the directory structure, and generate playwright.config.ts.
Actions:
- Check if
@playwright/testis installed:npx playwright --version. If not, runnpm install -D @playwright/testandnpx playwright install. - Create directory structure:
tests/ e2e/ auth/ features/ api/ pages/ <- POM classes live here artifacts/ screenshots/ traces/ videos/ - Write
playwright.config.tsusing the template inreferences/templates.md. The config bakes in failure diagnostics by default:screenshot: 'only-on-failure',trace: 'on-first-retry', andvideo: 'retain-on-failure'so that every failure produces actionable artifacts without manual setup. CI retries (retries: process.env.CI ? 2 : 0) absorb transient infrastructure flakiness without masking real bugs. - Confirm
playwright.config.tsis valid TypeScript:npx tsc --noEmit. Run this deterministic check before any subjective assessment of the config -- compiler errors are facts, opinions are not.
Artifact: playwright.config.ts + tests/e2e/ directory structure.
Gate: playwright.config.ts exists AND tests/e2e/ directory exists. If either is missing, do not proceed to Phase 2 -- diagnose and fix.
See references/templates.md for the full playwright.config.ts template and multi-browser matrix rationale.
PHASE 2: BUILD
Goal: Write POM classes for target feature areas, then write spec files that use those POMs.
Every page or feature area gets a typed Page Object class. Spec files never contain inline locators -- all selectors live in the POM. This separation means a selector change is a one-line POM edit, not a grep-and-replace across dozens of specs.
Actions:
- Identify the feature areas under test (auth, checkout, dashboard, etc.).
- For each area, create a POM class in
pages/(see POM Pattern inreferences/templates.md). All locators must usedata-testidattributes viapage.getByTestId(). CSS selectors (page.locator('.btn-primary')) break silently when styles change. XPath breaks on DOM restructuring. Text matching (page.locator('text=Submit')) breaks on copy changes.data-testidis a testing contract that survives all three. - Write spec files in
tests/e2e/<area>/using the POMs. - Run
npx tsc --noEmitto verify all files compile. - Fix any TypeScript errors before proceeding.
Artifact: tests/e2e/**/*.spec.ts files + pages/*.ts POM classes, all compiling cleanly.
Gate: At least one .spec.ts exists under tests/e2e/ AND npx tsc --noEmit exits 0. If compile fails, fix errors -- do not proceed to Phase 3 with broken TypeScript.
See references/templates.md for the POM Pattern, data-testid convention, and waiting/timing rules.
PHASE 3: RUN
Goal: Execute the test suite, capture the results JSON, and identify any failing or flaky tests.
Actions:
- Ensure the application under test is running (or document the
BASE_URLrequired). - Run the full suite with JSON reporter configured in
playwright.config.ts:npx playwright test - If any tests fail, run them in isolation with
--repeat-each=5to distinguish flaky from consistently failing:npx playwright test tests/e2e/auth/login.spec.ts --repeat-each=5 - Quarantine confirmed flaky tests with
test.fixme(). Never delete a failing test -- deleted tests leave silent coverage gaps. Quarantined tests are visible debt with tracking references:test.fixme('flaky: login redirects intermittently', async ({ page }) => { // TODO: #123 -- investigate race condition with auth cookie ... }); - Use
test.skip()only for conditional environment guards (e.g., "skip on WebKit"), not for sweeping failures under the rug.
Artifact: playwright-results.json (presence is the gate -- pass rate is not).
Gate: playwright-results.json exists at the project root. The file must contain valid JSON. Pass rate does not block Phase 4 -- reporting on failures is Phase 4's job.
See references/templates.md for the full Flaky Test Quarantine Protocol.
PHASE 4: VALIDATE
Goal: Deterministic checks on test output, then structured report generation.
Actions:
- Deterministic checks first -- run these before any LLM summary because compiler output and JSON parsing are facts, not opinions:
playwright-results.jsonexists and parses as valid JSON.- Extract counts:
python3 -c "import json,sys; d=json.load(open('playwright-results.json')); print(d.get('stats', d))" - Identify all
unexpected(failed) andflakyresult entries.
- LLM triage (only after deterministic checks pass):
- For each failed test, identify whether it is: (a) a broken assertion, (b) a selector mismatch, (c) a timing/async issue, or (d) an application bug.
- Categorize flaky tests for quarantine vs. fix.
- Write
e2e-report.mdusing the report template inreferences/templates.md.
Artifact: e2e-report.md.
Gate: e2e-report.md exists. Skill is complete only when this file is written.
See references/templates.md for the e2e-report.md template and the GitHub Actions CI/CD workflow template.
Error Handling
See references/errors.md for the symptom/cause/fix matrix covering tsc failures, CI-only flakes, missing results JSON, locator timeouts, fill-vs-clear bugs, and DOM ordering issues.
References
| Signal / Task Type | Load This Reference |
|---|---|
| async, Promise.all, race condition, waitForTimeout, fixture teardown | async.md |
| auth, login, storageState, OAuth, SSO, JWT, RBAC, multi-role, session expiry | auth.md |
| config, playwright.config.ts, POM, data-testid, CI/CD workflow | templates.md |
| error, timeout, tsc fail, locator, fill, missing JSON | errors.md |
| POM examples, waiting, multi-browser, shared auth session | playwright-patterns.md |
| Web3, MetaMask, wallet, addInitScript | wallet-testing.md |
| payment, financial, production skip, blockchain | financial-flows.md |
| flaky, intermittent, repeat-each, retries, quarantine | flakiness-triage.md |
- ADR-107 -- Decision record for this skill
- Playwright docs -- Official API reference