E2E Testing for Web & Electron Apps
Two modes: Batch testing (CI/test suites) and Interactive debugging (persistent browser sessions for iterative QA). Both share the same QA methodology.
Stack: Next.js 16 + Playwright + Supabase Auth + agent-native vision
Architecture
┌──────────────────────────────────────────────────────────────────────────┐
│ E2E TESTING ARCHITECTURE │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ MODE 1: BATCH (CI / Test Suites) │
│ ═══════════════════════════════ │
│ Playwright Test runner → auth setup → test specs → reports │
│ ✓ Headless CI ✓ Parallel workers ✓ Retries ✓ Artifacts │
│ │
│ MODE 2: INTERACTIVE (Debugging / Iterative QA) │
│ ═══════════════════════════════════════════════ │
│ Persistent browser session → live reload → functional QA → visual QA │
│ ✓ Desktop/Mobile/Electron ✓ Session reuse ✓ Screenshot analysis │
│ │
│ SHARED INFRASTRUCTURE │
│ ═════════════════════ │
│ 1. Auth bypass: Supabase test users with email/password (no OAuth) │
│ 2. Console monitoring: capture runtime, network, hydration errors │
│ 3. Page Objects: BasePage → DashboardPage, SettingsPage, etc. │
│ 4. AI visual analysis: Screenshots → agent-native vision → QA │
│ 5. Diagnostic tools: DOM health check, layout snapshot diff, styles │
│ 6. Failure injection: network, input stress, state corruption │
│ 7. QA methodology: inventory → functional QA → visual QA → signoff │
│ │
└──────────────────────────────────────────────────────────────────────────┘
Quick Start: Batch Testing
# 1. Install Playwright
bun add -D @playwright/test && bunx playwright install chromium
# 2. Create test user in Supabase (bypasses Google OAuth)
bun scripts/provision-e2e-test-users.ts --user=primary
# 3. Run tests against production
E2E_TEST_EMAIL=test@app.test E2E_TEST_PASSWORD=xxx bun run test:e2e:prod
Quick Start: Interactive Debugging
# 1. Install Playwright (npm for js_repl compat, bun for everything else)
test -f package.json || npm init -y
npm install playwright
npx playwright install chromium
# 2. Bootstrap persistent session (js_repl, Node REPL, or script)
node -e "import('playwright').then(() => console.log('ready'))"
Then launch a browser and start testing — see INTERACTIVE-SESSIONS.md.
The Google OAuth Bypass
Problem: Google blocks automated logins (CAPTCHA, headless detection).
Solution: Create test users with email/password auth in Supabase — same app, different auth method.
// Sign in via Supabase (NOT Google OAuth)
const { data, error } = await supabase.auth.signInWithPassword({
email: process.env.E2E_TEST_EMAIL, // e2e-test@app.test
password: process.env.E2E_TEST_PASSWORD,
});
// Inject session cookies into browser context
await context.addCookies([
{ name: 'sb-access-token', value: data.session.access_token, domain: '...', ... },
]);
Why .test TLD? IANA-reserved, never resolves — test emails can't leak to real inboxes.
Deep dive: AUTHENTICATION.md
QA Inventory Methodology
Before testing, build a coverage list from three sources:
- User's requested requirements — what was asked for
- Implemented features/behaviors — what you actually built
- Claims in the final response — what you intend to sign off on
Everything in any of those three sources must map to at least one QA check.
For each item, note:
- The intended functional check (user input → expected result)
- The specific state where visual check must happen
- The evidence to capture (screenshot, assertion)
Add at least 2 exploratory/off-happy-path scenarios that could expose fragile behavior.
Update the inventory during testing if exploration reveals additional controls, states, or claims.
Workflow
Batch Mode Phases
| Phase |
Steps |
| 1. Setup |
Install Playwright, create test users, configure storage state |
| 2. Implementation |
Build Page Objects, add console monitoring, capture screenshots |
| 3. Enhancement |
Add visual analysis, screenshot capture, HTML/JSON reports |
| 4. CI Integration |
Add test:e2e script, GitHub Actions workflow, artifact upload |
Interactive Mode Loop
- Build QA inventory from the three sources above
- Bootstrap persistent browser session (once)
- Start/confirm dev server
- Launch runtime (web or Electron), keep handles alive
- Edit-Reload-Verify micro-loop for each component:
- Make one change → reload → snapshot diff → DOM health check → fix issues → screenshot → verify
- Run functional QA with real user input (use
.click(), not page.evaluate())
- Run separate visual QA pass
- Run breakpoint sweep for responsive verification
- Run failure injection pass (network failures, input stress, state corruption)
- Verify viewport fit, capture evidence screenshots
- Update inventory if exploration reveals new items
- Repeat 5-11 until signoff criteria met
- Clean up session when task is finished
Deep dive: Edit-Reload-Verify loop → SYSTEMATIC-TESTING.md, DOM health check → DIAGNOSTIC-TOOLS.md
Deep dive: INTERACTIVE-SESSIONS.md
Functional QA
- Use real user controls for signoff:
.click(), .fill(), .press() — NOT page.evaluate()
- Interact via Playwright action methods which simulate real mouse/keyboard and respect visibility, overlapping elements, and event bubbling —
page.evaluate() bypasses all of this
- Verify visible results, not just internal state
- Cover every control in the QA inventory at least once
- For stateful toggles: test the full cycle (initial → changed → returned to initial)
- Test interactive states (hover, focus, disabled, error, empty, overflow) — see DIAGNOSTIC-TOOLS.md
- Exploratory pass (30-90 seconds) using normal input, not only the happy path
- If exploratory pass reveals new states/controls, add to inventory
Visual QA (Separate Pass)
- Each user-visible claim needs a matching visual check + reviewed screenshot
- Inspect initial viewport before scrolling
- Check all required regions, not just the main interaction surface
- Look for: clipping, overflow, distortion, weak contrast, broken layering, alignment problems
- Judge aesthetic quality as well as correctness
- For dynamic visuals, inspect long enough to judge stability — don't rely on a single screenshot
- Before signoff, ask: "What visible defect would most embarrass this result?"
Deep dive: VISUAL-QA.md
Signoff Criteria
All three must pass independently — one does not imply the others:
- Functional correctness — user input paths work, QA inventory covered
- Viewport fit — intended initial view visible without unintended clipping/scrolling
- Visual quality — UI is coherent, not aesthetically weak for the task
- Failure resilience (optional, recommended) — app handles network errors, input stress, and state corruption gracefully — see FAILURE-INJECTION.md
Include brief negative confirmation of defect classes checked and not found.
Test User Tiers
| Type |
Email |
Tier |
Purpose |
primary |
e2e-test@app.test |
Pro |
Main tests, full features |
free |
e2e-free@app.test |
Free |
Paywall, limitations |
premium |
e2e-premium@app.test |
Premium |
All features unlocked |
fresh |
e2e-new@app.test |
None |
Onboarding, empty states |
admin |
e2e-admin@app.test |
Admin |
Admin panel tests |
Key Configuration
// playwright.production.config.ts
export default defineConfig({
testDir: './e2e',
timeout: 60000,
retries: 2,
use: {
baseURL: 'https://your-app.com',
trace: 'retain-on-failure',
screenshot: 'on',
video: 'retain-on-failure',
actionTimeout: 30000,
navigationTimeout: 60000,
},
projects: [
{ name: 'auth-setup', testMatch: /auth\.global-setup\.ts/ },
{
name: 'authenticated',
dependencies: ['auth-setup'],
use: { storageState: '.auth/user.json', ...devices['Desktop Chrome'] },
},
],
});
Console Error Categories
| Category |
Patterns |
Action |
hydration |
hydrat, server.*different.*client |
Fix SSR mismatch |
runtime |
TypeError, ReferenceError |
Fix JS error |
network |
net::ERR, fetch.*failed |
Check API/CORS |
react |
Warning:, useEffect |
Fix hook issue |
security |
CSP, Refused to |
Fix CSP policy |
Deep dive: CONSOLE-MONITORING.md
Page Object Pattern
export class DashboardPage extends BasePage {
static readonly PATH = '/portfolio';
readonly healthScoreWidget = this.page.locator('[data-testid="health-score"]');
async goto() { await super.goto(DashboardPage.PATH); }
async getHealthScore(): Promise<number | null> {
const text = await this.healthScoreWidget.textContent();
return text ? parseInt(text.match(/(\d+)/)?.[1] ?? '', 10) : null;
}
}
Deep dive: PAGE-OBJECTS.md
AI Visual Analysis
The agent IS the vision model. Capture screenshots with Playwright, emit or save them, and the agent analyzes them directly using its built-in multimodal capabilities. No external API calls needed.
// Codex: emit for agent to see
await codex.emitImage({ bytes: await page.screenshot({ type: "jpeg", quality: 85, scale: "css" }), mimeType: "image/jpeg" });
// Claude Code / Gemini CLI: save to file, agent reads it natively
await page.screenshot({ path: '/tmp/visual-check.png' });
Deep dive: AI-VISUAL-ANALYSIS.md
Running Tests
# Batch mode
bun run test:e2e # Local (headless)
bun run test:e2e:prod --headed # Production (visible browser)
bun run test:e2e e2e/tests/dashboard.spec.ts # Specific file
bun run test:e2e:prod # Production (headless)
# Interactive mode (inside persistent session)
await page.goto('http://127.0.0.1:3000'); # Navigate
await page.reload({ waitUntil: 'domcontentloaded' }); # Reload after changes
await page.screenshot({ type: 'jpeg', quality: 85 }); # Capture
Validation Checklist
Reference Index
By Task
| I need to... |
Read |
| Set up test user auth bypass |
AUTHENTICATION.md |
| Debug interactively with persistent browser |
INTERACTIVE-SESSIONS.md |
| Run systematic visual QA and signoff |
VISUAL-QA.md |
| Capture and normalize screenshots |
SCREENSHOTS.md |
| Implement Page Objects |
PAGE-OBJECTS.md |
| Monitor console errors |
CONSOLE-MONITORING.md |
| Add AI visual analysis |
AI-VISUAL-ANALYSIS.md |
| Generate reports and CI artifacts |
REPORTING.md |
| Quick commands & troubleshooting |
QUICK-REFERENCE.md |
| Three-image LLM diff, SoM overlays, stabilization |
ADVANCED-TECHNIQUES.md |
| Playwright Test Agents, agent-driven CI QA |
ADVANCED-TECHNIQUES.md |
| Run DOM health check, extract computed styles |
DIAGNOSTIC-TOOLS.md |
| Layout snapshot diff, render intent declaration |
DIAGNOSTIC-TOOLS.md |
| Responsive breakpoint sweep, state triggers |
DIAGNOSTIC-TOOLS.md |
| Human-like interaction (avoid evaluate() trap) |
SYSTEMATIC-TESTING.md |
| Edit-Reload-Verify loop, state matrix sweep |
SYSTEMATIC-TESTING.md |
| Interactive state catalog, peripheral checks |
SYSTEMATIC-TESTING.md |
| Inject network failures, test error handling |
FAILURE-INJECTION.md |
| Input stress testing, rapid interaction, state corruption |
FAILURE-INJECTION.md |
| Failure resilience audit and scorecard |
FAILURE-INJECTION.md |
By Topic
| Topic |
Reference |
| Google OAuth bypass, Supabase test users, provisioning |
AUTHENTICATION.md |
| Persistent sessions, Electron, mobile, reload/relaunch |
INTERACTIVE-SESSIONS.md |
| QA inventory, functional/visual QA, viewport fit, signoff |
VISUAL-QA.md |
| CSS normalization, model-bound screenshots, click helpers |
SCREENSHOTS.md |
| Page Object Model, BasePage, locator strategies, fixtures |
PAGE-OBJECTS.md |
| Browser console capture, error categorization, filtering |
CONSOLE-MONITORING.md |
| Agent-native visual analysis, structured QA, severity thresholds |
AI-VISUAL-ANALYSIS.md |
| HTML/JSON reports, CI artifacts, screenshot management |
REPORTING.md |
| LLM diff, SoM overlays, ARIA, stabilization, Test Agents, CI QA |
ADVANCED-TECHNIQUES.md |
| CLI commands, config snippets, failure modes |
QUICK-REFERENCE.md |
| DOM health check, layout snapshot diff, computed styles, breakpoint sweep, state triggers |
DIAGNOSTIC-TOOLS.md |
| Human-like interaction, Edit-Reload-Verify loop, state matrix, state catalog |
SYSTEMATIC-TESTING.md |
| Network failure injection, input stress, state corruption, resilience scorecard |
FAILURE-INJECTION.md |
Tools & Scripts
| Tool |
Purpose |
scripts/provision-e2e-test-users.ts |
Create test users in Supabase |
scripts/reset-e2e-test-user.ts |
Reset user to known seed state |
scripts/validate-e2e.sh |
Validate E2E setup |
1---2name: e2e-testing-for-webapps3description: >-4 E2E testing for Next.js + Playwright + Supabase. OAuth bypass via test users, interactive5 debugging, visual QA. Use when: E2E, Playwright, visual regression, Electron testing.6---78# E2E Testing for Web & Electron Apps910> **Two modes:** Batch testing (CI/test suites) and Interactive debugging (persistent browser sessions for iterative QA). Both share the same QA methodology.1112> **Stack:** Next.js 16 + Playwright + Supabase Auth + agent-native vision1314## Architecture1516```17┌──────────────────────────────────────────────────────────────────────────┐18│ E2E TESTING ARCHITECTURE │19├──────────────────────────────────────────────────────────────────────────┤20│ │21│ MODE 1: BATCH (CI / Test Suites) │22│ ═══════════════════════════════ │23│ Playwright Test runner → auth setup → test specs → reports │24│ ✓ Headless CI ✓ Parallel workers ✓ Retries ✓ Artifacts │25│ │26│ MODE 2: INTERACTIVE (Debugging / Iterative QA) │27│ ═══════════════════════════════════════════════ │28│ Persistent browser session → live reload → functional QA → visual QA │29│ ✓ Desktop/Mobile/Electron ✓ Session reuse ✓ Screenshot analysis │30│ │31│ SHARED INFRASTRUCTURE │32│ ═════════════════════ │33│ 1. Auth bypass: Supabase test users with email/password (no OAuth) │34│ 2. Console monitoring: capture runtime, network, hydration errors │35│ 3. Page Objects: BasePage → DashboardPage, SettingsPage, etc. │36│ 4. AI visual analysis: Screenshots → agent-native vision → QA │37│ 5. Diagnostic tools: DOM health check, layout snapshot diff, styles │38│ 6. Failure injection: network, input stress, state corruption │39│ 7. QA methodology: inventory → functional QA → visual QA → signoff │40│ │41└──────────────────────────────────────────────────────────────────────────┘42```4344---4546## Quick Start: Batch Testing4748```bash49# 1. Install Playwright50bun add -D @playwright/test && bunx playwright install chromium5152# 2. Create test user in Supabase (bypasses Google OAuth)53bun scripts/provision-e2e-test-users.ts --user=primary5455# 3. Run tests against production56E2E_TEST_EMAIL=test@app.test E2E_TEST_PASSWORD=xxx bun run test:e2e:prod57```5859## Quick Start: Interactive Debugging6061```bash62# 1. Install Playwright (npm for js_repl compat, bun for everything else)63test -f package.json || npm init -y64npm install playwright65npx playwright install chromium6667# 2. Bootstrap persistent session (js_repl, Node REPL, or script)68node -e "import('playwright').then(() => console.log('ready'))"69```7071Then launch a browser and start testing — see [INTERACTIVE-SESSIONS.md](references/INTERACTIVE-SESSIONS.md).7273---7475## The Google OAuth Bypass7677**Problem:** Google blocks automated logins (CAPTCHA, headless detection).7879**Solution:** Create test users with email/password auth in Supabase — same app, different auth method.8081```typescript82// Sign in via Supabase (NOT Google OAuth)83const { data, error } = await supabase.auth.signInWithPassword({84 email: process.env.E2E_TEST_EMAIL, // e2e-test@app.test85 password: process.env.E2E_TEST_PASSWORD,86});87// Inject session cookies into browser context88await context.addCookies([89 { name: 'sb-access-token', value: data.session.access_token, domain: '...', ... },90]);91```9293**Why `.test` TLD?** IANA-reserved, never resolves — test emails can't leak to real inboxes.9495**Deep dive:** [AUTHENTICATION.md](references/AUTHENTICATION.md)9697---9899## QA Inventory Methodology100101Before testing, build a coverage list from **three sources:**1021031. **User's requested requirements** — what was asked for1042. **Implemented features/behaviors** — what you actually built1053. **Claims in the final response** — what you intend to sign off on106107Everything in any of those three sources must map to at least one QA check.108109For each item, note:110- The intended functional check (user input → expected result)111- The specific state where visual check must happen112- The evidence to capture (screenshot, assertion)113114Add at least **2 exploratory/off-happy-path scenarios** that could expose fragile behavior.115116Update the inventory during testing if exploration reveals additional controls, states, or claims.117118---119120## Workflow121122### Batch Mode Phases123124| Phase | Steps |125|-------|-------|126| **1. Setup** | Install Playwright, create test users, configure storage state |127| **2. Implementation** | Build Page Objects, add console monitoring, capture screenshots |128| **3. Enhancement** | Add visual analysis, screenshot capture, HTML/JSON reports |129| **4. CI Integration** | Add test:e2e script, GitHub Actions workflow, artifact upload |130131### Interactive Mode Loop1321331. Build QA inventory from the three sources above1342. Bootstrap persistent browser session (once)1353. Start/confirm dev server1364. Launch runtime (web or Electron), keep handles alive1375. **Edit-Reload-Verify micro-loop** for each component:138 - Make one change → reload → snapshot diff → DOM health check → fix issues → screenshot → verify1396. Run functional QA with real user input (use `.click()`, not `page.evaluate()`)1407. Run separate visual QA pass1418. Run breakpoint sweep for responsive verification1429. Run failure injection pass (network failures, input stress, state corruption)14310. Verify viewport fit, capture evidence screenshots14411. Update inventory if exploration reveals new items14512. Repeat 5-11 until signoff criteria met14613. Clean up session when task is finished147148**Deep dive:** Edit-Reload-Verify loop → [SYSTEMATIC-TESTING.md](references/SYSTEMATIC-TESTING.md), DOM health check → [DIAGNOSTIC-TOOLS.md](references/DIAGNOSTIC-TOOLS.md)149150**Deep dive:** [INTERACTIVE-SESSIONS.md](references/INTERACTIVE-SESSIONS.md)151152---153154## Functional QA155156- Use **real user controls** for signoff: `.click()`, `.fill()`, `.press()` — NOT `page.evaluate()`157- Interact via **Playwright action methods** which simulate real mouse/keyboard and respect visibility, overlapping elements, and event bubbling — `page.evaluate()` bypasses all of this158- Verify **visible results**, not just internal state159- Cover **every control** in the QA inventory at least once160- For stateful toggles: test the full cycle (initial → changed → returned to initial)161- Test **interactive states** (hover, focus, disabled, error, empty, overflow) — see [DIAGNOSTIC-TOOLS.md](references/DIAGNOSTIC-TOOLS.md)162- **Exploratory pass** (30-90 seconds) using normal input, not only the happy path163- If exploratory pass reveals new states/controls, add to inventory164165## Visual QA (Separate Pass)166167- Each user-visible claim needs a matching visual check + reviewed screenshot168- Inspect initial viewport **before scrolling**169- Check **all required regions**, not just the main interaction surface170- Look for: clipping, overflow, distortion, weak contrast, broken layering, alignment problems171- Judge **aesthetic quality** as well as correctness172- For dynamic visuals, inspect long enough to judge stability — don't rely on a single screenshot173- Before signoff, ask: "What visible defect would most embarrass this result?"174175**Deep dive:** [VISUAL-QA.md](references/VISUAL-QA.md)176177## Signoff Criteria178179All three must pass independently — one does not imply the others:1801811. **Functional correctness** — user input paths work, QA inventory covered1822. **Viewport fit** — intended initial view visible without unintended clipping/scrolling1833. **Visual quality** — UI is coherent, not aesthetically weak for the task1844. **Failure resilience** (optional, recommended) — app handles network errors, input stress, and state corruption gracefully — see [FAILURE-INJECTION.md](references/FAILURE-INJECTION.md)185186Include brief negative confirmation of defect classes checked and not found.187188---189190## Test User Tiers191192| Type | Email | Tier | Purpose |193|------|-------|------|---------|194| `primary` | `e2e-test@app.test` | Pro | Main tests, full features |195| `free` | `e2e-free@app.test` | Free | Paywall, limitations |196| `premium` | `e2e-premium@app.test` | Premium | All features unlocked |197| `fresh` | `e2e-new@app.test` | None | Onboarding, empty states |198| `admin` | `e2e-admin@app.test` | Admin | Admin panel tests |199200---201202## Key Configuration203204```typescript205// playwright.production.config.ts206export default defineConfig({207 testDir: './e2e',208 timeout: 60000,209 retries: 2,210 use: {211 baseURL: 'https://your-app.com',212 trace: 'retain-on-failure',213 screenshot: 'on',214 video: 'retain-on-failure',215 actionTimeout: 30000,216 navigationTimeout: 60000,217 },218 projects: [219 { name: 'auth-setup', testMatch: /auth\.global-setup\.ts/ },220 {221 name: 'authenticated',222 dependencies: ['auth-setup'],223 use: { storageState: '.auth/user.json', ...devices['Desktop Chrome'] },224 },225 ],226});227```228229---230231## Console Error Categories232233| Category | Patterns | Action |234|----------|----------|--------|235| `hydration` | `hydrat`, `server.*different.*client` | Fix SSR mismatch |236| `runtime` | `TypeError`, `ReferenceError` | Fix JS error |237| `network` | `net::ERR`, `fetch.*failed` | Check API/CORS |238| `react` | `Warning:`, `useEffect` | Fix hook issue |239| `security` | `CSP`, `Refused to` | Fix CSP policy |240241**Deep dive:** [CONSOLE-MONITORING.md](references/CONSOLE-MONITORING.md)242243---244245## Page Object Pattern246247```typescript248export class DashboardPage extends BasePage {249 static readonly PATH = '/portfolio';250 readonly healthScoreWidget = this.page.locator('[data-testid="health-score"]');251 async goto() { await super.goto(DashboardPage.PATH); }252 async getHealthScore(): Promise<number | null> {253 const text = await this.healthScoreWidget.textContent();254 return text ? parseInt(text.match(/(\d+)/)?.[1] ?? '', 10) : null;255 }256}257```258259**Deep dive:** [PAGE-OBJECTS.md](references/PAGE-OBJECTS.md)260261---262263## AI Visual Analysis264265The agent IS the vision model. Capture screenshots with Playwright, emit or save them, and the agent analyzes them directly using its built-in multimodal capabilities. No external API calls needed.266267```javascript268// Codex: emit for agent to see269await codex.emitImage({ bytes: await page.screenshot({ type: "jpeg", quality: 85, scale: "css" }), mimeType: "image/jpeg" });270271// Claude Code / Gemini CLI: save to file, agent reads it natively272await page.screenshot({ path: '/tmp/visual-check.png' });273```274275**Deep dive:** [AI-VISUAL-ANALYSIS.md](references/AI-VISUAL-ANALYSIS.md)276277---278279## Running Tests280281```bash282# Batch mode283bun run test:e2e # Local (headless)284bun run test:e2e:prod --headed # Production (visible browser)285bun run test:e2e e2e/tests/dashboard.spec.ts # Specific file286bun run test:e2e:prod # Production (headless)287288# Interactive mode (inside persistent session)289await page.goto('http://127.0.0.1:3000'); # Navigate290await page.reload({ waitUntil: 'domcontentloaded' }); # Reload after changes291await page.screenshot({ type: 'jpeg', quality: 85 }); # Capture292```293294---295296## Validation Checklist297298- [ ] Test users exist in Supabase with email/password auth299- [ ] Test users have `is_test_user: true` metadata300- [ ] `.auth/user.json` generated on first run301- [ ] Tests pass in headless CI (no Google OAuth prompts)302- [ ] Console errors captured and categorized303- [ ] Screenshots captured at key test steps304- [ ] DOM health check passes (no critical/major issues)305- [ ] Layout snapshot diff shows no unexpected structural changes306- [ ] QA inventory built and all items covered307- [ ] Functional QA pass completed with real user input (`.click()`, not `evaluate()`)308- [ ] Visual QA pass completed with screenshot evidence309- [ ] Breakpoint sweep completed (mobile through desktop)310- [ ] Interactive states tested (hover, focus, error, empty, overflow)311- [ ] Failure injection pass: no blank pages on API errors, no duplicate submissions312- [ ] Signoff criteria met (functional + viewport fit + visual quality + resilience)313- [ ] No flaky tests from timing issues (use proper waits)314315---316317## Reference Index318319### By Task320321| I need to... | Read |322|--------------|------|323| **Set up test user auth bypass** | [AUTHENTICATION.md](references/AUTHENTICATION.md) |324| **Debug interactively with persistent browser** | [INTERACTIVE-SESSIONS.md](references/INTERACTIVE-SESSIONS.md) |325| **Run systematic visual QA and signoff** | [VISUAL-QA.md](references/VISUAL-QA.md) |326| **Capture and normalize screenshots** | [SCREENSHOTS.md](references/SCREENSHOTS.md) |327| **Implement Page Objects** | [PAGE-OBJECTS.md](references/PAGE-OBJECTS.md) |328| **Monitor console errors** | [CONSOLE-MONITORING.md](references/CONSOLE-MONITORING.md) |329| **Add AI visual analysis** | [AI-VISUAL-ANALYSIS.md](references/AI-VISUAL-ANALYSIS.md) |330| **Generate reports and CI artifacts** | [REPORTING.md](references/REPORTING.md) |331| **Quick commands & troubleshooting** | [QUICK-REFERENCE.md](references/QUICK-REFERENCE.md) |332| **Three-image LLM diff, SoM overlays, stabilization** | [ADVANCED-TECHNIQUES.md](references/ADVANCED-TECHNIQUES.md) |333| **Playwright Test Agents, agent-driven CI QA** | [ADVANCED-TECHNIQUES.md](references/ADVANCED-TECHNIQUES.md) |334| **Run DOM health check, extract computed styles** | [DIAGNOSTIC-TOOLS.md](references/DIAGNOSTIC-TOOLS.md) |335| **Layout snapshot diff, render intent declaration** | [DIAGNOSTIC-TOOLS.md](references/DIAGNOSTIC-TOOLS.md) |336| **Responsive breakpoint sweep, state triggers** | [DIAGNOSTIC-TOOLS.md](references/DIAGNOSTIC-TOOLS.md) |337| **Human-like interaction (avoid evaluate() trap)** | [SYSTEMATIC-TESTING.md](references/SYSTEMATIC-TESTING.md) |338| **Edit-Reload-Verify loop, state matrix sweep** | [SYSTEMATIC-TESTING.md](references/SYSTEMATIC-TESTING.md) |339| **Interactive state catalog, peripheral checks** | [SYSTEMATIC-TESTING.md](references/SYSTEMATIC-TESTING.md) |340| **Inject network failures, test error handling** | [FAILURE-INJECTION.md](references/FAILURE-INJECTION.md) |341| **Input stress testing, rapid interaction, state corruption** | [FAILURE-INJECTION.md](references/FAILURE-INJECTION.md) |342| **Failure resilience audit and scorecard** | [FAILURE-INJECTION.md](references/FAILURE-INJECTION.md) |343344### By Topic345346| Topic | Reference |347|-------|-----------|348| Google OAuth bypass, Supabase test users, provisioning | [AUTHENTICATION.md](references/AUTHENTICATION.md) |349| Persistent sessions, Electron, mobile, reload/relaunch | [INTERACTIVE-SESSIONS.md](references/INTERACTIVE-SESSIONS.md) |350| QA inventory, functional/visual QA, viewport fit, signoff | [VISUAL-QA.md](references/VISUAL-QA.md) |351| CSS normalization, model-bound screenshots, click helpers | [SCREENSHOTS.md](references/SCREENSHOTS.md) |352| Page Object Model, BasePage, locator strategies, fixtures | [PAGE-OBJECTS.md](references/PAGE-OBJECTS.md) |353| Browser console capture, error categorization, filtering | [CONSOLE-MONITORING.md](references/CONSOLE-MONITORING.md) |354| Agent-native visual analysis, structured QA, severity thresholds | [AI-VISUAL-ANALYSIS.md](references/AI-VISUAL-ANALYSIS.md) |355| HTML/JSON reports, CI artifacts, screenshot management | [REPORTING.md](references/REPORTING.md) |356| LLM diff, SoM overlays, ARIA, stabilization, Test Agents, CI QA | [ADVANCED-TECHNIQUES.md](references/ADVANCED-TECHNIQUES.md) |357| CLI commands, config snippets, failure modes | [QUICK-REFERENCE.md](references/QUICK-REFERENCE.md) |358| DOM health check, layout snapshot diff, computed styles, breakpoint sweep, state triggers | [DIAGNOSTIC-TOOLS.md](references/DIAGNOSTIC-TOOLS.md) |359| Human-like interaction, Edit-Reload-Verify loop, state matrix, state catalog | [SYSTEMATIC-TESTING.md](references/SYSTEMATIC-TESTING.md) |360| Network failure injection, input stress, state corruption, resilience scorecard | [FAILURE-INJECTION.md](references/FAILURE-INJECTION.md) |361362---363364## Tools & Scripts365366| Tool | Purpose |367|------|---------|368| `scripts/provision-e2e-test-users.ts` | Create test users in Supabase |369| `scripts/reset-e2e-test-user.ts` | Reset user to known seed state |370| `scripts/validate-e2e.sh` | Validate E2E setup |