| name | browser-qa |
| description | Browser-based QA and autonomous verification — Playwright, Chrome DevTools MCP, Computer Use for visual testing, pixel verification, funnel walkthroughs, and overcoming web UI blockers |
Browser QA & Autonomous Verification
This skill enables the GTM agent to see, interact with, and verify real browser experiences. The agent uses browser tools to QA its own work, verify tracking fires correctly, test signup flows end-to-end, and overcome blockers that have no CLI/API path.
Tool Hierarchy (Pick the Right Tool)
Always use the most efficient tool for the job:
| Task | Tool | Why |
|---|
| Verify pixel fires, check network requests | Playwright (headless) | Fast, scriptable, can inspect network layer |
| Visual screenshot comparison | Playwright screenshot + Read | Headless, pixel-perfect, no setup overhead |
| Test full signup/checkout flow | Playwright end-to-end | Automated form filling, navigation, assertions |
| Interact with web UIs that block API access | Computer Use (mcp__computer-use__*) | Click real buttons, fill real forms, handle OAuth popups |
| Inspect live DOM, console errors, performance | Playwright evaluate + console | Access to browser APIs, performance metrics |
| Verify mobile responsiveness | Playwright with viewport override | Test at 375px, 390px, 768px |
| Read what's on screen when other tools fail | Computer Use screenshot | Last resort visual inspection |
Playwright Patterns
Verify Meta Pixel Fires
const pixelRequests = [];
page.on('request', req => {
if (req.url().includes('facebook.com/tr')) pixelRequests.push(req);
});
await page.goto(landingUrl);
const pageViewFired = pixelRequests.some(r => r.url().includes('ev=PageView'));
await page.fill('[data-testid="email-input"]', 'test@example.com');
await page.click('[data-testid="signup-button"]');
const regFired = pixelRequests.some(r => r.url().includes('ev=CompleteRegistration'));
Verify PostHog Events
const posthogEvents = [];
page.on('request', req => {
if (req.url().includes('/e/') || req.url().includes('/capture')) {
try {
const body = JSON.parse(req.postData());
posthogEvents.push(...(body.batch || [body]));
} catch {}
}
});
await page.goto(url);
const hasEvent = posthogEvents.some(e => e.event === '$pageview');
Test Landing Page Performance
const metrics = await page.evaluate(() => {
return new Promise(resolve => {
new PerformanceObserver(list => {
const entries = {};
list.getEntries().forEach(e => entries[e.name] = e.value || e.startTime);
resolve(entries);
}).observe({ type: 'largest-contentful-paint', buffered: true });
});
});
Screenshot Mobile Viewports
const viewports = [
{ width: 375, height: 812, name: 'iPhone SE' },
{ width: 390, height: 844, name: 'iPhone 14' },
{ width: 768, height: 1024, name: 'iPad' },
{ width: 1440, height: 900, name: 'Desktop' }
];
for (const vp of viewports) {
await page.setViewportSize({ width: vp.width, height: vp.height });
await page.goto(url);
await page.screenshot({ path: `.gtm/qa/${vp.name}.png`, fullPage: true });
}
Verify UTM Parameters Persist Through Signup
await page.goto(url + '?utm_source=meta&utm_medium=paid&utm_campaign=test');
await page.click('[data-testid="signup-cta"]');
const storedUtm = await page.evaluate(() => {
return localStorage.getItem('utm_params') || sessionStorage.getItem('utm_params');
});
Computer Use Patterns
Use Computer Use (mcp__computer-use__*) when you need to interact with native apps or web UIs that resist automation:
When to Use Computer Use
- Meta Business Manager — OAuth flows, app mode toggles, account settings that have no API
- Google Ads Manager — Manual campaign review, settings that require UI interaction
- Vercel Dashboard — Redeploy, check env vars, review deployment logs
- Email provider dashboards — Check deliverability reports, domain verification
- Any web UI that blocks programmatic access — OAuth popups, CAPTCHA flows, 2FA
Computer Use Workflow
1. request_access — List applications needed (Chrome, Safari, etc.)
2. screenshot — See current state before acting
3. left_click / type / key — Interact with UI elements
4. screenshot — Verify action completed
5. Repeat until goal achieved
Important Computer Use Rules
- Chrome is read-only tier — can screenshot but not click/type. Use Playwright for Chrome interaction.
- For web forms: prefer Playwright. Use Computer Use only for native app UIs or OAuth flows.
- Always screenshot BEFORE and AFTER actions to verify state.
- If a browser shows a CAPTCHA or 2FA prompt, ask the user to complete it — don't try to bypass.
QA Verification Checklist
After any GTM asset deployment (landing page, email, ad), run this verification:
Landing Page QA
Email QA
Ad Creative QA
Tracking QA (Cross-Channel)
Overcoming Blockers
The QA agent should NEVER report "I can't do this because there's no API." Instead:
- Try the API/CLI first — fastest path
- Try Playwright — headless browser automation
- Try Chrome DevTools MCP — if available, for DOM inspection
- Try Computer Use — for native UI interaction
- Try web scraping — WebFetch for read-only data
- Only then ask the user — as absolute last resort, with a specific ask (not vague "help me")
The agent should always exhaust all available tools before asking for human help.