agentleFS
wachawowachawo/claude-skills/skills/webapp-testing/SKILL.md

webapp-testing

Skill0 starsChanged 6 months agoMITView on GitHub

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

We split this skill into the rules it gives an agent

4 rules. 1 is common, 0 are distinctive, and 3 are very specific to this project.

  • 1

    Common

    Most of the 191 edited versions we read keep these.

  • 0

    Distinctive

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Use sync_playwright() for synchronous scripts

    line 85
  2. Common:

    Always close the browser when finished

    line 86
  3. Very specific:

    Use descriptive selectors: text=, role=, CSS selectors, or IDs

    line 87
  4. Very specific:

    Add appropriate waits: page.wait_for_selector() or page.wait_for_timeout()

    line 88

“Common” is measured: kept by at least 6 in 10 of the 191 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Web Application Testing

To test local web applications, write native Python Playwright scripts.

Available helper scripts:

  • scripts/with_server.py — manages the server lifecycle (supports multiple servers)

Always run scripts with --help first to see usage. Do NOT read the source until you have tried running the script and discovered that a custom solution is absolutely necessary. These scripts can be very large and would otherwise pollute the context window. They are designed to be invoked directly as black-box scripts, not absorbed into context.

Decision tree: choosing an approach

User task → Is it static HTML?
    ├─ Yes → Read HTML file directly to identify selectors
    │         ├─ Success → Write Playwright script using selectors
    │         └─ Fails/Incomplete → Treat as dynamic (below)
    │
    └─ No (dynamic webapp) → Is the server already running?
        ├─ No → Run: python scripts/with_server.py --help
        │        Then use the helper + write simplified Playwright script
        │
        └─ Yes → Reconnaissance-then-action:
            1. Navigate and wait for networkidle
            2. Take screenshot or inspect DOM
            3. Identify selectors from rendered state
            4. Execute actions with discovered selectors

Example: using with_server.py

To launch a server, run --help first, then use the helper:

Single server:

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

Multiple servers (e.g., backend + frontend):

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

To create the automation script, include only Playwright logic (servers are managed automatically):

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True) # Always launch chromium in headless mode
    page = browser.new_page()
    page.goto('http://localhost:5173') # Server already running and ready
    page.wait_for_load_state('networkidle') # CRITICAL: Wait for JS to execute
    # ... your automation logic
    browser.close()

Reconnaissance-Then-Action pattern

  1. Inspect the rendered DOM:
    page.screenshot(path='/tmp/inspect.png', full_page=True)
    content = page.content()
    page.locator('button').all()
  2. Identify selectors from inspection results
  3. Execute actions using the discovered selectors

Common pitfall

❌ Do not inspect the DOM before waiting for networkidle on dynamic apps ✅ Do wait with page.wait_for_load_state('networkidle') before inspection

Best practices

  • Use bundled scripts as a black box — To accomplish a task, consider whether one of the scripts in scripts/ can help. These scripts reliably handle common complex workflows without polluting the context window. Use --help to see usage, then invoke directly.
  • Use sync_playwright() for synchronous scripts
  • Always close the browser when finished
  • Use descriptive selectors: text=, role=, CSS selectors, or IDs
  • Add appropriate waits: page.wait_for_selector() or page.wait_for_timeout()

Reference files

  • examples/ — Examples showing common patterns:
    • element_discovery.py — Discovering buttons, links, and input fields on a page
    • static_html_automation.py — Using a file:// URL for local HTML
    • console_logging.py — Capturing console logs during automation

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.