doing-a-simple-two-sta…
Use when analyzing a large corpus of text, code, or data that exceeds a single agent's effective context - orchestrates parallel…
Use when Playwright scripts fail, tests are flaky, selectors stop working, or timeouts occur - provides systematic debugging approach for browser automation issues
Claude Code
$ npx -y skills add ed3dai/ed3d-plugins --skill playwright-debugging --agent claude-code
Codex
$ npx skills add ed3dai/ed3d-plugins --skill playwright-debugging -a codex -y
Cursor
$ npx skills add ed3dai/ed3d-plugins --skill playwright-debugging -a cursor -y
Gemini CLI
$ npx skills add ed3dai/ed3d-plugins --skill playwright-debugging -a gemini-cli -y
GitHub Copilot
$ npx skills add ed3dai/ed3d-plugins --skill playwright-debugging -a github-copilot -y
OpenCode
$ npx skills add ed3dai/ed3d-plugins --skill playwright-debugging -a opencode -y
Windsurf
$ npx skills add ed3dai/ed3d-plugins --skill playwright-debugging -a windsurf -y
name: playwright-debugging description: Use when Playwright scripts fail, tests are flaky, selectors stop working, or timeouts occur - provides systematic debugging approach for browser automation issues user-invocable: false
Browser automation failures fall into predictable categories. This skill provides a systematic approach to diagnose and fix issues quickly.
**When NOT to use:**
| Problem | First Action | |---------|-------------| | Timeout on locator | Run with `--ui` mode, check element state with `.count()`, `.isVisible()` | | Flaky test (passes sometimes) | Replace `waitForTimeout()` with condition-based waits | | "Element not visible" | Check computed styles, wait for overlays to disappear | | Works locally, fails CI | Use `waitForLoadState('networkidle')`, increase timeout | | Element not clickable | Check if covered by overlay, wait for animations to complete | | Stale element | Re-query after navigation instead of storing locator |
**First step: Can you reproduce it?**
// Run single test to isolate issue npx playwright test path/to/test.spec.js // Run with headed mode to observe npx playwright test --headed // Run with slow motion npx playwright test --headed --slow-mo=1000
**Questions to answer:**
**Use UI Mode for interactive debugging:**
# Best for local development - provides time-travel debugging npx playwright test --ui
UI Mode gives you:
**Use Inspector to step through tests:**
# Step through test execution with live browser npx playwright test --debug
Inspector allows:
**Take screenshots at failure point:**
// Before failing action
await page.screenshot({ path: 'before-action.png', fullPage: true });
// Try action
try {
await page.click('.button');
} catch (error) {
await page.screenshot({ path: 'after-error.png', fullPage: true });
throw error;
}**Enable verbose logging:**
# API-level debugging DEBUG=pw:api npx playwright test # Browser DevTools with playwright object PWDEBUG=console npx playwright test
With `PWDEBUG=console`, you get DevTools access to:
// In browser console
playwright.$('.selector') // Query with Playwright engine
playwright.$$('selector') // Get all matches
playwright.inspect('selector') // Highlight in Elements panel
playwright.locator('selector') // Create locator**Use trace viewer:**
// Record trace
await context.tracing.start({ screenshots: true, snapshots: true });
// ... your test code
await context.tracing.stop({ path: 'trace.zip' });
// View trace
npx playwright show-trace trace.zip**Organize traces with test steps:**
// Group actions in trace viewer
await test.step('Login', async () => {
await page.fill('input[name="username"]', 'user');
await page.click('button[type="submit"]');
});
await test.step('Navigate to dashboard', async () => {
await page.click('a[href="/dashboard"]');
});**Add descriptions to locators for clarity:**
// Descriptions appear in trace viewer and reports
const submitButton = page.locator('#submit').describe('Submit button');
await submitButton.click();**VS Code debugging:**
Install the Playwright VS Code extension for:
This integrates debugging directly into your editor workflow.
**Check if element exists:**
const element = page.locator('.button');
// Does it exist in DOM?
const count = await element.count();
console.log(`Found ${count} elements`);
// Is it visible?
const isVisible = await element.isVisible();
console.log(`Visible: ${isVisible}`);
// Is it enabled?
const isEnabled = await element.isEnabled();
console.log(`Enabled: ${isEnabled}`);
// Get all attributes
const attrs = await element.evaluate(el => ({
classes: el.className,
id: el.id,
display: window.getComputedStyle(el).display,
visibility: window.getComputedStyle(el).visibility,
opacity: window.getComputedStyle(el).opacity
}));
console.log(attrs);**Test selector in browser console:**
// Use page.evaluate to test selector
const found = await page.evaluate(() => {
const el = document.querySelector('.button');
return el ? {
text: el.textContent,
visible: el.offsetParent !== null,
enabled: !el.disabled
} : null;
});
console.log('Selector test:', found);**Check for multiple matches:**
// Are there multiple elements?
const all = await page.locator('.button').all();
console.log(`Found ${all.length} matching elements`);
// Get text of all matches
const texts = await page.locator('.button').allTextContents();
console.log('All matching texts:', texts);**Causes:**
**Deb
Ed's repo of Claude Code plugins, centered around a research-plan-implement workflow. Only a tiny bit cursed. If you're lucky.
Use when analyzing a large corpus of text, code, or data that exceeds a single agent's effective context - orchestrates parallel…
Use when creating a new Claude Code plugin or setting up plugin structure - provides complete file organization, manifest format,…
Use when creating specialized subagents for Claude Code plugins or the Task tool - covers description writing for…
Use when creating, releasing, or maintaining a Claude Code Plugin Marketplace - covers marketplace.json schema, version…
Use when completing development phases or branches to identify and update CLAUDE.md or AGENTS.md files that may have become stale…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.