Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add shennawardana23/skillme --skill e2e-testinggit clone --depth 1 https://github.com/shennawardana23/skillmeWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/shennawardana23/skillme/e2e-testing)<a href="https://agentmods.dev/skills/shennawardana23/skillme/e2e-testing"><img src="https://agentmods.dev/badge/skills/shennawardana23/skillme/e2e-testing/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/shennawardana23/skillme/e2e-testing"><img src="https://agentmods.dev/badge/skills/shennawardana23/skillme/e2e-testing.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00066 | $0.00990 |
| Opus 5.5 | $0.00026 | $0.00396 |
| Sonnet 5.5 | $0.00013 | $0.00198 |
| Haiku 4.5 | $0.00007 | $0.00099 |
Grade A, and why
e2e-testing scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 1mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 108 lines — stays where its author put it; the contents beside it link to each section on GitHub.
End-to-End Testing (Playwright)
E2E tests sit at the top of the test pyramid — expensive, slow, and the first place flakiness shows up. Most flakiness traces back to one thing: the test racing the page instead of waiting for a specific, observable condition.
Page Object Model
export class ReservationsPage {
constructor(private page: Page) {}
async goto() {
await this.page.goto("/reservations");
}
async search(query: string) {
await this.page.locator('[data-testid="search-input"]').fill(query);
await this.page.waitForResponse((r) => r.url().includes("/api/search"));
}
rows() {
return this.page.locator('[data-testid="reservation-row"]');
}
}
The single highest-value fix: stop waiting on time, wait on state
// Flaky: races the animation/network, passes locally, fails in CI
await page.waitForTimeout(2000);
await page.click('[data-testid="confirm"]');
// Stable: waits for the actual condition
await page.locator('[data-testid="confirm"]').waitFor({ state: "visible" });
await page.locator('[data-testid="confirm"]').click();
Playwright locators already auto-wait for actionability (attached,
visible, stable, enabled) before acting — page.waitForTimeout is almost
never the right tool and should be treated as a review finding, not a style
preference.
Gotchas
page.click(selector)on a raw selector string skips Playwright's auto-waiting in some older API patterns;page.locator(selector).click()is the form that gets the actionability checks. Prefer locators throughout, not selector strings passed directly to action methods.- A test that passes locally but fails in CI is frequently a timing issue
invisible on a fast local machine and a slow, resource-constrained CI
runner — reproduce with
--repeat-each=10before assuming it's an environment misconfiguration. test.skip/test.fixmeused to silence a flaky test without an attached issue reference is a one-way door — the test quietly stops providing coverage and nobody notices it never runs again. Always attach a tracking reference when quarantining a test.- CI-only flakiness is commonly a resource contention issue, not a logic
bug: setting
workers: 1for CI (serializing tests) andretries: 2is a legitimate stabilizing measure while investigating root cause, but should not be treated as the fix itself — a retried, silently-passing flaky test is still hiding a real race condition.
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 1mo ago First seen · 108 lines · 66 tokens per session scan A d9411691a4b4
e2e-testing is a skill published in the GitHub repository shennawardana23/skillme (3 stars, last pushed 9d ago), licensed Apache-2.0. It adds 66 tokens to every session and 990 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
aw-tester-chrome
Runs aw-tester UI specs in-session through the claude-in-chrome extension against an already-logged-in Chrome, emitting the same verdict block; falls back to aw-tester when the extension is absent. Triggers on "run the spec in chrome", "verify with the chrome driver", or ui-verify run --driver chrome.
ui-verify
Makes a UI PR autonomously verifiable: author writes an intent spec into the PR body; run checks it on the preview (or a local stack with --env local) with evidence, an adversarial pass, and telemetry-verify; verify (the default) does both, then posts the proof with uploaded screenshots and recordings to the PR's one…
e2e-testing-mobile
Plans, generates, runs, and heals Maestro end-to-end flows for Expo and React Native apps, spec-first, with testID locators and Maestro Cloud via EAS. Use for native flows (web flows go to e2e-testing); triggers on "add mobile e2e", "maestro flow", "expo e2e", "/e2e-testing-mobile".
playwright-trace-analyzer
Analyzes Playwright trace.zip archives (or a GitHub Actions run URL) — action timeline, network, console errors — to name the race behind a flake and rank test or app fixes by measured impact. Invoke with /playwright-trace-analyzer for "why is this test flaky" or "why did playwright time out".
e2e-testing
Plans, generates, runs, and heals Playwright end-to-end tests through a spec-first loop with Playwright Test Agents and @playwright/mcp. Use when adding E2E coverage or hardening a flaky flow; triggers on "add e2e", "test this flow", "verify the user journey", "/e2e-testing".
jev-assert
Asserts a UI expectation semantically by asking TypeSafe's Jev model whether an outcome holds in a page's captured text state, mapped to a verify-behavior receipt. Use when an exact locator or string match is brittle; triggers on "assert semantically", "does the page show", "semantic UI assertion", "/jev-assert".