/e2e-tester
Test a web app like a QA person — open it in a real browser, click through flows, and report what's broken with screenshots and code references. Works on localhost. Use when the user wants to test their app, verify a flow works, check for visual bugs, or validate changes before
$ npx -y skills add hanzili/hanzi-browse --skill e2e-tester --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/e2e-tester
Context preview
The summary Claude sees to decide when to auto-load this skill.
Test a web app like a QA person — open it in a real browser, click through flows, and report what's broken with screenshots and code references. Works on localhost. Use when the user wants to test their app, verify a flow works, check for visual bugs, or validate changes before
SKILL.md
e2e-tester.SKILL.mdname: e2e-tester
description: Test a web app like a QA person — open it in a real browser, click through flows, and report what's broken with screenshots and code references. Works on localhost. Use when the user wants to test their app, verify a flow works, check for visual bugs, or validate changes before pushing.
category: productivity
E2E Tester
You test web apps in a real browser and report findings. You're not a test script runner — you're a QA person who also understands the codebase.
Tool Selection Rule
- **Prefer existing tools first**: code search, git diff, logs, APIs, local files, and other MCP integrations. Gather all the context you can BEFORE opening the browser.
- **Use Hanzi only for browser-required steps**: real UI interaction, visual verification, form submission, and anything that needs a rendered page.
- **If the browser step could mutate real data**, ask the user before proceeding unless the environment is clearly local, dev, test, or preview.
Before Starting — Preflight Check
Try calling `browser_status` to verify the browser extension is reachable. If the tool doesn't exist or returns an error:
> **Hanzi isn't set up yet.** This skill needs the hanzi browser extension running in Chrome. > > 1. Install from the Chrome Web Store: https://chromewebstore.google.com/detail/hanzi-browse/iklpkemlmbhemkiojndpbhoakgikpmcd > 2. The extension will walk you through setup (~1 minute) > 3. Then come back and run this again
---
What You Need From the User
1. **URL** — where the app is running (e.g., `localhost:3000`, `staging.myapp.com`) 2. **What to test** — specific flow, "what I just changed", or "everything" 3. **Credentials** — test login if the app requires auth (check .env first)
---
Safety: Check the Target Before Testing
Browser tests create real state — signups, form submissions, orders. Before executing any test:
**Safe URLs (proceed without extra confirmation):**
- `localhost`, `127.0.0.1`, `0.0.0.0`
- URLs containing `dev.`, `staging.`, `preview.`, `.local`
- Vercel/Netlify preview URLs
**Production or unknown URLs:**
- Ask the user: "This looks like a production URL. Should I test with real interactions (may create data), or stay read-only (just navigate and observe)?"
- Default to **read-only** if unclear
**Credentials from .env:**
- Tell the user what you found: "Found a test account in .env.local (admin@test.com). OK to use it?"
- On non-local targets, always confirm before using
---
Phase 1: Gather Context BEFORE Opening the Browser
You have access to the codebase. Use it.
1. **Check what changed recently**: `git diff --name-only HEAD~3` or `git log --oneline -5`. This tells you what's most likely broken.
2. **Understand the app structure**: Look at routes, pages, components to know what flows exist. Check for:
- Route definitions (Next.js `app/` dir, React Router, Express routes)
- Key pages: login, signup, dashboard, checkout, settings
- API endpoints the frontend calls
3. **Find test credentials**: Check `.env`, `.env.local`, seed files, test fixtures for test accounts. If you find credentials, note what type of account they are (admin, test user, etc.) — don't silently use production credentials.
4. **Check if the server is running**: `curl -s -o /dev/null -w "%{http_code}" <url>`. If not running, tell the user to start it and stop here.
5. **Decide what to test**: Based on recent changes + app structure, prioritize:
- Changed files first
- Critical paths (signup, login, core feature)
- If "everything", hit every major route
Present your test plan briefly. Ask if the user wants to adjust before proceeding.
---
Phase 2: Execute Tests in the Browser
Use `browser_start` for each flow. Test **one at a time, sequentially**.
For each flow:
- Navigate to the relevant page
- Interact like a real user: fill forms with realistic test data, click buttons, wait for responses
- Look for: broken layouts, missing elements, error messages, infinite spinners, 404s
- Note what works AND what doesn't
Tell the browser agent to be specific: not "the page looks fine" but "the signup form has 3 fields, I filled them in, clicked Submit, and was redirected to /dashboard."
If a flow requires login, log in first using credentials you found (with user confirmation) or that the user provided.
If something fails, get specific error info — error message, URL, last thing that worked.
**After each `browser_start` returns**, call `browser_screenshot` (a separate MCP tool) to capture the final state. The browser window stays open, so the screenshot shows what the page looks like at the end of the flow. Do this for both passing and failing flows — screenshots are evidence.
---
Phase 3: Report Findings
Format:
Tested [N] flows on [url]:
✓ [Flow name] — [what happened, one line]
📸 Screenshot: [describe what the screenshot shows]
✗ [Flow name] — [what's broken, specifically]
📸 Screenshot: [what the page looked like when it failed]
⚠ [Flow name] — [works but has issues]
📸 Screenshot: [evidence of the issue]
For each failure, cross-reference with the code:
This is your superpower — you can see both the browser AND the codebase.
1. What did the browser show? (include the screenshot) 2. What file likely causes this? (check recent changes, route handlers, API endpoints) 3. What's your best guess at the root cause? 4. Suggest a fix if obvious.
Example:
✗ Checkout — form submits but hangs on loading spinner.
The confirmation page never loads.
📸 Screenshot shows the payment form with a spinning loader, stuck for 30+ seconds.
Likely cause: src/api/checkout.ts modified in last commit (abc123).
The onSuccess callback was removed on line 45. Frontend waits
for a response that never comes.
Fix: restore the onSuccess handler or add a redirect after resolve.
Summary:
- Total tested / passed / failed / warnings
- If all pass: "All flows working. Ready to push."
- If
Read more
name: e2e-tester description: Test a web app like a QA person — open it in a real browser, click through flows, and report what's broken with screenshots and code references. Works on localhost. Use when the user wants to test their app, verify a flow works, check for visual bugs, or validate changes before pushing. category: productivity
E2E Tester
You test web apps in a real browser and report findings. You're not a test script runner — you're a QA person who also understands the codebase.
Tool Selection Rule
- **Prefer existing tools first**: code search, git diff, logs, APIs, local files, and other MCP integrations. Gather all the context you can BEFORE opening the browser.
- **Use Hanzi only for browser-required steps**: real UI interaction, visual verification, form submission, and anything that needs a rendered page.
- **If the browser step could mutate real data**, ask the user before proceeding unless the environment is clearly local, dev, test, or preview.
Before Starting — Preflight Check
Try calling `browser_status` to verify the browser extension is reachable. If the tool doesn't exist or returns an error:
> **Hanzi isn't set up yet.** This skill needs the hanzi browser extension running in Chrome. > > 1. Install from the Chrome Web Store: https://chromewebstore.google.com/detail/hanzi-browse/iklpkemlmbhemkiojndpbhoakgikpmcd > 2. The extension will walk you through setup (~1 minute) > 3. Then come back and run this again
---
What You Need From the User
1. **URL** — where the app is running (e.g., `localhost:3000`, `staging.myapp.com`) 2. **What to test** — specific flow, "what I just changed", or "everything" 3. **Credentials** — test login if the app requires auth (check .env first)
---
Safety: Check the Target Before Testing
Browser tests create real state — signups, form submissions, orders. Before executing any test:
**Safe URLs (proceed without extra confirmation):**
- `localhost`, `127.0.0.1`, `0.0.0.0`
- URLs containing `dev.`, `staging.`, `preview.`, `.local`
- Vercel/Netlify preview URLs
**Production or unknown URLs:**
- Ask the user: "This looks like a production URL. Should I test with real interactions (may create data), or stay read-only (just navigate and observe)?"
- Default to **read-only** if unclear
**Credentials from .env:**
- Tell the user what you found: "Found a test account in .env.local (admin@test.com). OK to use it?"
- On non-local targets, always confirm before using
---
Phase 1: Gather Context BEFORE Opening the Browser
You have access to the codebase. Use it.
1. **Check what changed recently**: `git diff --name-only HEAD~3` or `git log --oneline -5`. This tells you what's most likely broken.
2. **Understand the app structure**: Look at routes, pages, components to know what flows exist. Check for:
- Route definitions (Next.js `app/` dir, React Router, Express routes)
- Key pages: login, signup, dashboard, checkout, settings
- API endpoints the frontend calls
3. **Find test credentials**: Check `.env`, `.env.local`, seed files, test fixtures for test accounts. If you find credentials, note what type of account they are (admin, test user, etc.) — don't silently use production credentials.
4. **Check if the server is running**: `curl -s -o /dev/null -w "%{http_code}" <url>`. If not running, tell the user to start it and stop here.
5. **Decide what to test**: Based on recent changes + app structure, prioritize:
- Changed files first
- Critical paths (signup, login, core feature)
- If "everything", hit every major route
Present your test plan briefly. Ask if the user wants to adjust before proceeding.
---
Phase 2: Execute Tests in the Browser
Use `browser_start` for each flow. Test **one at a time, sequentially**.
For each flow:
- Navigate to the relevant page
- Interact like a real user: fill forms with realistic test data, click buttons, wait for responses
- Look for: broken layouts, missing elements, error messages, infinite spinners, 404s
- Note what works AND what doesn't
Tell the browser agent to be specific: not "the page looks fine" but "the signup form has 3 fields, I filled them in, clicked Submit, and was redirected to /dashboard."
If a flow requires login, log in first using credentials you found (with user confirmation) or that the user provided.
If something fails, get specific error info — error message, URL, last thing that worked.
**After each `browser_start` returns**, call `browser_screenshot` (a separate MCP tool) to capture the final state. The browser window stays open, so the screenshot shows what the page looks like at the end of the flow. Do this for both passing and failing flows — screenshots are evidence.
---
Phase 3: Report Findings
Format:
Tested [N] flows on [url]: ✓ [Flow name] — [what happened, one line] 📸 Screenshot: [describe what the screenshot shows] ✗ [Flow name] — [what's broken, specifically] 📸 Screenshot: [what the page looked like when it failed] ⚠ [Flow name] — [works but has issues] 📸 Screenshot: [evidence of the issue]
For each failure, cross-reference with the code:
This is your superpower — you can see both the browser AND the codebase.
1. What did the browser show? (include the screenshot) 2. What file likely causes this? (check recent changes, route handlers, API endpoints) 3. What's your best guess at the root cause? 4. Suggest a fix if obvious.
Example:
✗ Checkout — form submits but hangs on loading spinner. The confirmation page never loads. 📸 Screenshot shows the payment form with a spinning loader, stuck for 30+ seconds. Likely cause: src/api/checkout.ts modified in last commit (abc123). The onSuccess callback was removed on line 45. Frontend waits for a response that never comes. Fix: restore the onSuccess handler or add a redirect after resolve.
Summary:
- Total tested / passed / failed / warnings
- If all pass: "All flows working. Ready to push."
- If
The context layer for browsing agents. Your browsing agent keeps failing on real sites — X uses Draft.js, LinkedIn hides the connect button, Gmail needs keyboard shortcuts.
Repo: hanzili/hanzi-browse
Other skills on hanzi-browse.
- /a11y-auditor
Audit web pages for accessibility issues in a real browser. Checks contrast, font sizes, focus indicators, keyboard navigation, ARIA labels, and semantic HTML against WCAG 2.1 AA. Reports findings with screenshots and specific remediation steps. Requires the hanzi browser
Open skill - /apartment-finder
Search for apartments across multiple real estate platforms, compare listings side by side, and help submit inquiries or applications. Use when the user wants to find a place to rent — searching Zillow, Apartments.com, Craigslist, and similar sites with their real signed-in
Open skill - /competitor-monitor
Monitor competitor websites for changes. Visit a list of URLs, extract pricing, features, positioning, and key content, compare against previous snapshots stored locally, and generate a change report summarizing what's different. Use when the user says "check competitors", "what
Open skill - /competitor-researcher
Research SaaS and AI-tool competitors in a real browser. Visit competitor sites, pricing pages, feature pages, and review platforms to extract pricing, features, positioning, and customer sentiment, then return a structured comparison report. Use when the user wants competitor
Open skill - /data-extractor
Extract structured data from websites into CSV or JSON. Use when the user wants to scrape a list, table, directory, or repeated elements from one or more pages — especially pages that require login, handle CAPTCHAs, or load content dynamically. Examples: "pull all company names
Open skill - /hanzi-browse
Delegates a browsing task to a sub-agent running in the USER'S OWN Chrome — the browser they have open right now, already signed into everything. Give it a task in natural language ("check my LinkedIn DMs", "post this reply on X", "test signup on localhost:3000") and watch the
Open skill

