install
source · Clone the upstream repo
git clone https://github.com/plurigrid/asi
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/plurigrid/asi "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/asi/skills/webapp-testing" ~/.claude/skills/plurigrid-asi-webapp-testing && rm -rf "$T"
manifest:
plugins/asi/skills/webapp-testing/SKILL.mdsource content
Web App Testing with Playwright
Setup
npm init playwright@latest
Basic Test Structure
import { test, expect } from '@playwright/test'; test('homepage has title', async ({ page }) => { await page.goto('http://localhost:3000'); await expect(page).toHaveTitle(/My App/); }); test('can navigate to about page', async ({ page }) => { await page.goto('http://localhost:3000'); await page.click('text=About'); await expect(page).toHaveURL(/.*about/); });
Common Actions
Navigation
await page.goto('http://localhost:3000'); await page.goBack(); await page.reload();
Clicking
await page.click('button'); await page.click('text=Submit'); await page.click('#submit-btn'); await page.click('[data-testid="submit"]');
Form Input
await page.fill('input[name="email"]', 'test@example.com'); await page.fill('#password', 'secret123'); await page.selectOption('select#country', 'USA'); await page.check('input[type="checkbox"]');
Waiting
await page.waitForSelector('.loaded'); await page.waitForURL('**/dashboard'); await page.waitForResponse('**/api/data'); await page.waitForTimeout(1000); // Avoid if possible
Assertions
await expect(page.locator('h1')).toHaveText('Welcome'); await expect(page.locator('.items')).toHaveCount(5); await expect(page.locator('button')).toBeEnabled(); await expect(page.locator('.modal')).toBeVisible(); await expect(page.locator('input')).toHaveValue('test');
Screenshots
// Full page await page.screenshot({ path: 'screenshot.png', fullPage: true }); // Element only await page.locator('.chart').screenshot({ path: 'chart.png' });
Console Logs
page.on('console', msg => console.log(msg.text())); page.on('pageerror', err => console.error(err.message));
Network Interception
await page.route('**/api/data', route => { route.fulfill({ status: 200, body: JSON.stringify({ items: [] }) }); });
Running Tests
# Run all tests npx playwright test # Run specific file npx playwright test tests/login.spec.ts # Run in headed mode npx playwright test --headed # Run with UI npx playwright test --ui
Scientific Skill Interleaving
This skill connects to the K-Dense-AI/claude-scientific-skills ecosystem:
Graph Theory
- networkx [○] via bicomodule
- Universal graph hub
Bibliography References
: 734 citations in bib.duckdbgeneral
Cat# Integration
This skill maps to Cat# = Comod(P) as a bicomodule in the equipment structure:
Trit: 0 (ERGODIC) Home: Prof Poly Op: ⊗ Kan Role: Adj Color: #26D826
GF(3) Naturality
The skill participates in triads satisfying:
(-1) + (0) + (+1) ≡ 0 (mod 3)
This ensures compositional coherence in the Cat# equipment structure.