Files
claude-agents-skills/skills/browser-testing/SKILL.md
T
clawd 8cc0dcb167 migrate: consolidate all skills and agents from ~/clawd
- Moved 4 skills: browser-testing, claude-multimedia, exa-search, gravl-research
- Moved 14 agents: architect, backend-dev, browser-tester, coach, data, flight, frontend-dev, gravl-pm, gravl-researcher, nutritionist, research, reviewer, staging, update
- Created symlinks from ~/clawd/skills and ~/clawd/agents back to hub
- Single source of truth in claude-agents-skills repo
2026-03-01 09:56:30 +01:00

6.8 KiB

Browser Testing Skill

Automatisk webbtestning med headless Chrome för Gravl och andra projekt.

Installation

# Installera Playwright (enklast)
npm install -g playwright
npx playwright install chromium

# Eller Puppeteer
npm install -g puppeteer

# Eller direkt Chrome
which chromium-browser || which google-chrome || which chromium

Snabbstart

1. Skärmdump för visuell regression

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({ headless: true });
  const page = await browser.newPage();
  
  await page.goto('https://03-design-polish.gravl.homelab.local');
  await page.screenshot({ path: 'gravl-landing.png', fullPage: true });
  
  await browser.close();
})();

2. Interaktivt test (login-flöde)

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch({ headless: true });
  const context = await browser.newContext();
  const page = await context.newPage();
  
  // Gå till login
  await page.goto('https://03-design-polish.gravl.homelab.local/login');
  
  // Fyll i formulär
  await page.fill('[data-testid="email"]', 'test@example.com');
  await page.fill('[data-testid="password"]', 'test123');
  
  // Klicka login
  await page.click('[data-testid="login-button"]');
  
  // Vänta på redirect
  await page.waitForURL('**/dashboard');
  
  // Verifiera
  const welcomeText = await page.textContent('[data-testid="welcome-message"]');
  console.log('Login test:', welcomeText.includes('Välkommen') ? '✅ PASS' : '❌ FAIL');
  
  await browser.close();
})();

Gravl-specifika tester

Test Suite: Login/Onboarding (Phase 3)

// tests/gravl-phase3.spec.js
const { test, expect } = require('@playwright/test');

test.describe('Gravl Phase 3 - Login/Onboarding', () => {
  const BASE_URL = process.env.STAGING_URL || 'https://03-design-polish.gravl.homelab.local';
  
  test.beforeEach(async ({ page }) => {
    await page.goto(BASE_URL);
  });
  
  test('visar logotyp', async ({ page }) => {
    const logo = await page.locator('[data-testid="logo"]').isVisible();
    expect(logo).toBeTruthy();
  });
  
  test('login-form finns', async ({ page }) => {
    await expect(page.locator('form')).toBeVisible();
    await expect(page.locator('input[type="email"]')).toBeVisible();
    await expect(page.locator('input[type="password"]')).toBeVisible();
  });
  
  test('gradient animationer', async ({ page }) => {
    const body = await page.locator('body');
    const bg = await body.evaluate(el => 
      getComputedStyle(el).background
    );
    expect(bg).toContain('gradient');
  });
});

Test Suite: Dashboard (Phase 3)

test.describe('Gravl Phase 3 - Dashboard', () => {
  test('stat cards visas', async ({ page }) => {
    await page.goto(process.env.STAGING_URL + '/dashboard');
    const cards = await page.locator('[data-testid="stat-card"]').count();
    expect(cards).toBeGreaterThan(0);
  });
  
  test('kalender komponent', async ({ page }) => {
    const calendar = await page.locator('[data-testid="calendar"]').isVisible();
    expect(calendar).toBeTruthy();
  });
});

Test Suite: Workout Page (Phase 3)

test.describe('Gravl Phase 3 - Workout', () => {
  test('exercise cards med animationer', async ({ page }) => {
    await page.goto(process.env.STAGING_URL + '/workout');
    const cards = await page.locator('.exercise-card');
    await expect(cards.first()).toHaveClass(/animate/);
  });
  
  test('rest timer finns', async ({ page }) => {
    const timer = await page.locator('[data-testid="rest-timer"]').isVisible();
    expect(timer).toBeTruthy();
  });
  
  test('KLART button styling', async ({ page }) => {
    const button = page.locator('[data-testid="complete-workout"]');
    await expect(button).toHaveCSS('background-color', 'rgb(255, 107, 53)');
  });
});

Automatisk staging-test

Skript för PM

#!/bin/bash
# /workspace/gravl/scripts/test-staging.sh

BRANCH_NAME=$1
echo "🧪 Testar staging för $BRANCH_NAME"

export STAGING_URL="https://$BRANCH_NAME.gravl.homelab.local"

# Kör Playwright-tester
cd /workspace/gravl/frontend
npx playwright test tests/gravl-phase3.spec.js --reporter=json

# Om tester failar → rapportera till PM
if [ $? -ne 0 ]; then
  echo "❌ Tester failade"
  exit 1
fi

echo "✅ Alla tester passerade"

PM Workflow med browser-test

Steg 1: Efter staging skapats

# PM spawnar test-agent
sessions_spawn:
  agentId: browser-tester
  task: "Testa https://03-design-polish.gravl.homelab.local. 
         Använd Playwright. 
         Kolla: login-form, logotyp, animationer, rest-timer.
         Rapportera pass/fail för varje test."

Steg 2: Test-agenten kör

exec pty:true workdir:/workspace/gravl \
  command:"npx playwright test --reporter=html"

Steg 3: Rapportera resultat

🧪 Browser Test Results

✅ Login page (3/3)
   - Logotyp visible
   - Form validation
   - Gradient animations

✅ Dashboard (2/2)
   - Stat cards
   - Calendar component

✅ Workout (3/3)
   - Exercise cards
   - Rest timer
   - KLART button

📊 Screenshot: test-results/screenshots/
📄 Report: test-results/report.html

Alla Phase 3-tester passerade! ✅

Headless Chrome direkt

Utan Playwright (bara Chrome)

# Skärmdump
chromium --headless --disable-gpu --screenshot=gravl.png \
  --window-size=1920,1080 \
  https://03-design-polish.gravl.homelab.local

# PDF-export
chromium --headless --disable-gpu --print-to-pdf=gravl.pdf \
  https://03-design-polish.gravl.homelab.local

# HTML-innehåll
chromium --headless --disable-gpu --dump-dom \
  https://03-design-polish.gravl.homelab.local > gravl.html

Skill-definition (för OpenClaw)

name: browser-testing
version: 1.0.0
commands:
  capture:
    exec: "chromium --headless --screenshot={output} {url}"
  test:  
    exec: "npx playwright test {spec} --reporter={format}"
  interactive:
    exec: "npx playwright open {url}"
env:
  CHROME_BIN: /usr/bin/chromium
  PLAYWRIGHT_BROWSERS_PATH: 0

Installation i Gravl

cd /workspace/gravl
npm init -y
npm install --save-dev @playwright/test
npx playwright install chromium

# Skapa test-mapp
mkdir -p tests
mkdir -p test-results/screenshots

Integrering med PM

// I gravl-pm/SOUL.md

## Browser Testing

Efter varje staging-creation:

1. Skärmdump för visuell validering
2. Kärnflödestest (login -> dashboard)
3. Rapportera till Josef med screenshots

Använd alltid:
- exec pty:true för Playwright
- Spara screenshots i .staging/{branch}/screenshots/
- Vid fail  rapportera med screenshot

Resurser