Get the FREE Ultimate OpenClaw Setup Guide →

webapp-testing

Scanned
npx machina-cli add skill AutumnsGrove/ClaudeSkills/webapp-testing --openclaw
Files (1)
SKILL.md
10.8 KB

Web Application Testing with Playwright

Overview

Playwright is a powerful framework for web testing and automation that supports all modern browsers (Chromium, Firefox, WebKit). It provides reliable, fast, and capable automation with auto-waiting, network control, and comprehensive testing capabilities.

Use this skill when you need to:

  • Create end-to-end tests for web applications
  • Automate browser interactions and workflows
  • Test across multiple browsers and devices
  • Verify UI/UX functionality and accessibility
  • Mock APIs and intercept network requests
  • Capture screenshots and videos for debugging

Core Capabilities

Multi-Browser Testing

  • Chromium (Chrome, Edge, Brave)
  • Firefox (Mozilla Firefox)
  • WebKit (Safari engine)
  • Cross-browser compatibility testing
  • Parallel execution across browsers

Element Interaction

  • Click, double-click, right-click
  • Type text with realistic keyboard simulation
  • Select dropdowns and checkboxes
  • Hover and focus interactions
  • Drag and drop operations
  • File uploads and downloads

Assertions & Verification

  • Element visibility and state checks
  • Text content verification
  • Attribute validation
  • URL and navigation assertions
  • Custom expect matchers
  • Soft assertions for multiple checks

Screenshot & Video Capture

  • Full page screenshots
  • Element-specific captures
  • Video recording of test sessions
  • Visual comparison testing
  • Trace files for debugging

Network Interception

  • Mock API responses
  • Intercept and modify requests
  • Monitor network traffic
  • Test offline scenarios
  • Performance monitoring

Mobile Device Emulation

  • 100+ device presets (iPhone, Pixel, iPad, etc.)
  • Custom viewport configurations
  • Touch event simulation
  • Geolocation testing
  • Orientation changes

Core Testing Workflow

1. Basic Test Setup

Create a simple test with Playwright's auto-waiting:

import pytest
from playwright.sync_api import Page, expect

def test_homepage_loads(page: Page):
    """Test that homepage loads successfully."""
    page.goto("https://example.com")
    expect(page).to_have_title("Example Domain")
    expect(page.locator("h1")).to_contain_text("Example Domain")

def test_navigation(page: Page):
    """Test navigation between pages."""
    page.goto("https://example.com")
    page.click("text=More information")
    expect(page).to_have_url("https://www.iana.org/domains/reserved")

2. Form Interactions

Test form filling, validation, and submission:

def test_login_form(page: Page):
    """Test login form submission."""
    page.goto("https://example.com/login")

    # Fill form fields
    page.fill("#username", "testuser@example.com")
    page.fill("#password", "SecurePassword123")
    page.check("#remember-me")

    # Submit and verify
    page.click("button[type='submit']")
    expect(page).to_have_url("https://example.com/dashboard")
    expect(page.locator(".welcome-message")).to_be_visible()

3. API Mocking

Mock API responses for controlled testing:

def test_with_mocked_api(page: Page):
    """Test with mocked API response."""
    # Mock API response
    page.route("**/api/user", lambda route: route.fulfill(
        status=200,
        content_type="application/json",
        body='{"name": "Test User", "premium": true}'
    ))

    page.goto("https://example.com/profile")
    expect(page.locator(".user-name")).to_contain_text("Test User")

4. Mobile Emulation

Test responsive designs on mobile devices:

@pytest.fixture
def mobile_page(playwright):
    """Create mobile browser context."""
    iphone = playwright.devices['iPhone 12']
    browser = playwright.chromium.launch()
    context = browser.new_context(**iphone)
    page = context.new_page()
    yield page
    context.close()
    browser.close()

def test_mobile_menu(mobile_page: Page):
    """Test mobile navigation."""
    mobile_page.goto("https://example.com")
    expect(mobile_page.locator(".hamburger-menu")).to_be_visible()
    mobile_page.click(".hamburger-menu")
    expect(mobile_page.locator(".mobile-menu")).to_be_visible()

5. Visual Regression

Capture screenshots for visual comparison:

def test_homepage_screenshot(page: Page):
    """Capture homepage screenshot."""
    page.goto("https://example.com")

    # Full page screenshot
    page.screenshot(path="screenshots/homepage.png", full_page=True)

    # Element screenshot
    page.locator("header").screenshot(path="screenshots/header.png")

    # Screenshot with masks for dynamic content
    page.screenshot(
        path="screenshots/dashboard.png",
        mask=[page.locator(".timestamp"), page.locator(".session-id")]
    )

Key Testing Principles

Use Reliable Selectors

# ✅ GOOD: Test IDs and semantic selectors
page.click("[data-testid='submit-button']")
page.click("button:text('Submit')")
page.click("role=button[name='Submit']")

# ❌ BAD: Fragile structural selectors
page.click("div > div > button:nth-child(3)")

Leverage Auto-Waiting

# ✅ GOOD: Playwright auto-waits
page.click("button")
expect(page.locator(".result")).to_be_visible()

# ⚠️ Avoid: Manual waits
time.sleep(2)  # Only when absolutely necessary

Ensure Test Isolation

# ✅ GOOD: Clean state between tests
@pytest.fixture(autouse=True)
def clear_state(page: Page):
    yield
    page.context.clear_cookies()
    page.evaluate("localStorage.clear()")

Handle Flaky Tests

# ✅ GOOD: Wait for specific conditions
page.click("button")
page.wait_for_selector(".result")
result = page.locator(".result").text_content()

# ✅ GOOD: Use soft assertions
expect.soft(page.locator(".title")).to_be_visible()
expect.soft(page.locator(".price")).to_contain_text("$")

Page Object Model

Organize tests using the Page Object pattern for maintainability:

class LoginPage:
    """Login page object."""

    def __init__(self, page: Page):
        self.page = page
        self.username_input = page.locator("#username")
        self.password_input = page.locator("#password")
        self.submit_button = page.locator("button[type='submit']")

    def login(self, username: str, password: str):
        """Perform login."""
        self.username_input.fill(username)
        self.password_input.fill(password)
        self.submit_button.click()

# Use in tests
def test_login(page: Page):
    login_page = LoginPage(page)
    login_page.login("test@example.com", "password123")
    expect(page).to_have_url("/dashboard")

Common Test Patterns

Authentication

@pytest.fixture
def authenticated_page(page: Page):
    """Provide authenticated session."""
    page.goto("https://example.com/login")
    page.fill("#username", "test@example.com")
    page.fill("#password", "password")
    page.click("button[type='submit']")
    page.wait_for_url("**/dashboard")
    yield page

File Operations

# Upload
page.set_input_files("#file-input", "path/to/file.pdf")

# Download
with page.expect_download() as download_info:
    page.click("a:text('Download')")
download = download_info.value
download.save_as("downloads/file.pdf")

Network Monitoring

requests = []
page.on("request", lambda req: requests.append(req))
page.goto("https://example.com")

# Verify API calls were made
api_requests = [r for r in requests if "/api/" in r.url]
assert len(api_requests) > 0

Running Tests

Basic Commands

# Install Playwright
pip install playwright pytest-playwright
playwright install

# Run all tests
pytest tests/

# Run specific browser
pytest --browser chromium --browser firefox

# Run in headed mode (see browser)
pytest --headed

# Debug mode
PWDEBUG=1 pytest tests/test_login.py

# Parallel execution
pytest -n auto

# Generate test code
playwright codegen https://example.com

Configuration

See references/setup-configuration.md for:

  • Complete installation instructions
  • Project structure setup
  • pytest.ini configuration
  • playwright.config.ts for TypeScript
  • CI/CD integration examples

Quality Standards

Ensure tests meet these criteria:

  • Tests are independent and can run in any order
  • Selectors are reliable (test IDs, semantic selectors)
  • Proper error handling and assertions
  • Screenshots/videos captured on failure
  • No hardcoded waits (use auto-waiting)
  • Clean state management between tests

Additional Resources

Detailed Documentation

Code Examples

Helper Scripts

External Resources

Troubleshooting

Tests are flaky:

  • Use Playwright's auto-waiting instead of manual sleeps
  • Ensure proper wait conditions (wait_for_selector, wait_for_url)
  • Use expect() assertions which auto-retry

Selectors not finding elements:

  • Verify element exists with browser DevTools
  • Use Playwright Inspector: PWDEBUG=1 pytest test.py
  • Try multiple selector strategies (text, role, test-id)

Tests slow in CI:

  • Enable parallel execution: pytest -n auto
  • Use headed mode only for debugging
  • Consider browser context reuse for related tests

For more troubleshooting tips, see Common Pitfalls.

Source

git clone https://github.com/AutumnsGrove/ClaudeSkills/blob/master/webapp-testing/SKILL.mdView on GitHub

Overview

Playwright-based web app testing automates browser interactions across Chromium, Firefox, and WebKit. It supports UI automation, E2E flows, form validation, visual regression, API mocking, and mobile emulation to ensure reliable behavior across devices and networks.

How This Skill Works

Tests drive browsers through Playwright, performing actions, assertions, and network mocks with auto-waiting for stability. They can capture full-page or element screenshots, record test videos, and emulate mobile devices, enabling end-to-end verification and visual checks across environments.

When to Use It

  • Perform end-to-end testing across Chromium, Firefox, and WebKit to validate multi-browser workflows.
  • Automate UI interactions and accessibility checks for critical user journeys.
  • Validate forms, login flows, and data submissions with robust assertions.
  • Execute visual regression tests using screenshots and image comparisons.
  • Mock APIs, intercept network requests, test offline scenarios, and verify mobile responsive behavior.

Quick Start

  1. Step 1: Install Playwright and initialize the project (e.g., npm init playwright@latest or pip install playwright; playwright install).
  2. Step 2: Create a simple test that navigates to a page and asserts title and content, demonstrating auto-waiting and basic actions.
  3. Step 3: Add a mock API route or mobile emulation to expand coverage (e.g., intercepting a request or using device presets) and run tests locally.

Best Practices

  • Organize tests with page objects and reusable fixtures to reduce duplication.
  • Leverage Playwright's auto-waiting and clear assertions to minimize flakiness.
  • Use network interception to mock APIs and simulate edge cases early.
  • Capture and compare screenshots/videos for reliable visual regression tracking.
  • Test on mobile device presets (100+ devices) and varied viewports to ensure responsive layouts.

Example Use Cases

  • End-to-end checkout flow validated across Chromium, Firefox, and WebKit.
  • User login, dashboard, and profile update with form validation checks.
  • API mocking for user profile and feed endpoints to test UI under different responses.
  • Offline and slow-network scenarios simulated to ensure graceful degradation.
  • Visual regression checks comparing new UI against baseline screenshots after updates.

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers