/supergraph:webapp-testing

SkillWeb & browsing

Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the /supergraph:webapp-testing skill

What this skill tells your AI

The instructions your AI receives, as published by datit309/supergraph in plugins/supergraph/skills/webapp-testing/SKILL.md and read by ahel’s review.

Test and verify local web application UI behavior using Playwright.

Announce: "🌐 /supergraph:webapp-testing — testing web application..."

When to Use

  • Verifying a frontend change works correctly in the browser
  • Debugging UI behavior or unexpected rendering
  • Capturing screenshots for visual verification
  • Checking browser console logs for errors
  • After /supergraph:frontend-design to confirm feature works end-to-end

Steps

0. Announce

"🌐 /supergraph:webapp-testing — testing [feature/page]..."

1. Understand what changed (graph context)

Before writing tests, use graph context to prioritize coverage: Use CBM_PROJECT: call detect_changes, search_graph for changed routes/pages, then trace_path for inbound/outbound call and data-flow paths. Run validated test-gaps. Empty results are unavailable; use Serena/filesystem evidence.

Serena (optional): For changed component symbols:

mcp__serena__find_referencing_symbols(symbol=<changed_component>)

If a Playwright test fails on a renamed component/route, find_referencing_symbols surfaces all import sites. Skip if Serena unavailable.

2. Choose approach

Is it static HTML?
├─ Yes → Read HTML file directly to identify selectors
│         Then write Playwright script using those selectors
│
└─ No (dynamic webapp) → Is server already running?
    ├─ No → Run: python scripts/with_server.py --help
    │        Then start server + write Playwright script
    │
    └─ Yes → Reconnaissance-then-action:
        1. Navigate and wait for networkidle
        2. Screenshot or inspect DOM
        3. Identify selectors from rendered state
        4. Execute actions with discovered selectors

MCP Playwright option: If mcp__plugin_playwright_playwright__* tools are available, prefer them over writing Python scripts — no script file needed:

mcp__plugin_playwright_playwright__browser_navigate(url="http://localhost:3000")
mcp__plugin_playwright_playwright__browser_snapshot()
mcp__plugin_playwright_playwright__browser_click(selector="...")
mcp__plugin_playwright_playwright__browser_take_screenshot()
mcp__plugin_playwright_playwright__browser_console_messages()

3. Recon before action (dynamic apps)

page.wait_for_load_state('networkidle')  # CRITICAL: wait before inspecting
page.screenshot(path='/tmp/inspect.png', full_page=True)
content = page.content()
page.locator('button').all()

Never inspect DOM before networkidle on dynamic apps — selectors may not exist yet.

4. Execute test actions

Use discovered selectors from step 3. Write targeted Playwright assertions.

5. Verify flows covered

After tests pass, re-run: Re-run search_graph then trace_path(project=CBM_PROJECT, mode="data_flow"). All impacted flows tested? Any gaps → add tests.

6. Report

✅ /supergraph:webapp-testing
- Flows tested: N/M | Console errors: [list/none]
- Screenshots: [paths] | Selectors verified: [list]
- Next: /supergraph:verify → /supergraph:review

Using with_server.py

Helper script scripts/with_server.py manages server lifecycle. Always run --help first — do NOT read the source unless absolutely necessary (large file, pollutes context window).

Single server:

python scripts/with_server.py --server "npm run dev" --port 5173 -- python your_test.py

Multiple servers:

python scripts/with_server.py \
  --server "cd backend && python server.py" --port 3000 \
  --server "cd frontend && npm run dev" --port 5173 \
  -- python your_test.py

Automation script template (server managed externally by with_server.py):

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto('http://localhost:5173')
    page.wait_for_load_state('networkidle')  # CRITICAL
    # ... test logic
    browser.close()

Reference Examples

If examples/ directory exists in project:

  • examples/element_discovery.py — discovering buttons, links, inputs
  • examples/static_html_automation.py — file:// URLs for local HTML
  • examples/console_logging.py — capturing console logs

Rules

  • ALWAYS wait for networkidle before inspecting DOM on dynamic apps
  • NEVER read scripts/with_server.py source — use --help and invoke as black box
  • Prefer MCP Playwright tools (mcp__plugin_playwright_playwright__*) over writing Python scripts when available
  • Identify selectors from rendered state (recon-first), not from guessing
  • Use descriptive selectors: text=, role=, CSS, or IDs — never positional selectors like nth-child
  • Always close browser when done in Python scripts
  • Re-check trace_path after tests pass to confirm full coverage

Signals

GitHub stars
22
Forks
5
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
webapp-testing-datit309
Source
github.com/datit309/supergraph