AgentSkillsCN

webapp-testing

提供一套基于 Playwright 的工具集,用于与本地 Web 应用程序交互并进行测试。支持验证前端功能、调试 UI 行为、截取浏览器屏幕截图以及查看浏览器日志。

SKILL.md
--- frontmatter
name: webapp-testing
description: 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.

Web Application Testing

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

Decision Tree: Choosing Your Approach

code
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 -> Start the server first, then proceed
        |-- 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

Reconnaissance-Then-Action Pattern

  1. Inspect rendered DOM:

    python
    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 discovered selectors

Example Script

python
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: Wait for JS to execute
    # ... your automation logic
    browser.close()

Best Practices

  • Use sync_playwright() for synchronous scripts
  • Always close the browser when done
  • Use descriptive selectors: text=, role=, CSS selectors, or IDs
  • Add appropriate waits: page.wait_for_selector() or page.wait_for_timeout()
  • Always wait for networkidle before inspecting dynamic apps