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: E2E testing for Next.js + Playwright + Supabase. OAuth bypass via test users, interactive debugging, visual QA. Use when: E2E, Playwright, visual regression, Electron testing.4---56# E2E Testing for Web & Electron Apps78> **Two modes:** Batch testing (CI/test suites) and Interactive debugging (persistent browser sessions for iterative QA). Both share the same QA methodology.910> **Stack:** Next.js 16 + Playwright + Supabase Auth + agent-native vision1112## Architecture1314```15┌──────────────────────────────────────────────────────────────────────────┐16│ E2E TESTING ARCHITECTURE │17├──────────────────────────────────────────────────────────────────────────┤18│ │19│ MODE 1: BATCH (CI / Test Suites) │20│ ═══════════════════════════════ │21│ Playwright Test runner → auth setup → test specs → reports │22│ ✓ Headless CI ✓ Parallel workers ✓ Retries ✓ Artifacts │23│ │24│ MODE 2: INTERACTIVE (Debugging / Iterative QA) │25│ ═══════════════════════════════════════════════ │26│ Persistent browser session → live reload → functional QA → visual QA │27│ ✓ Desktop/Mobile/Electron ✓ Session reuse ✓ Screenshot analysis │28│ │29│ SHARED INFRASTRUCTURE │30│ ═════════════════════ │31│ 1. Auth bypass: Supabase test users with email/password (no OAuth) │32│ 2. Console monitoring: capture runtime, network, hydration errors │33│ 3. Page Objects: BasePage → DashboardPage, SettingsPage, etc. │34│ 4. AI visual analysis: Screenshots → agent-native vision → QA │35│ 5. Diagnostic tools: DOM health check, layout snapshot diff, styles │36│ 6. Failure injection: network, input stress, state corruption │37│ 7. QA methodology: inventory → functional QA → visual QA → signoff │38│ │39└──────────────────────────────────────────────────────────────────────────┘40```4142---4344## Quick Start: Batch Testing4546```bash47# 1. Install Playwright48bun add -D @playwright/test && bunx playwright install chromium4950# 2. Create test user in Supabase (bypasses Google OAuth)51bun scripts/provision-e2e-test-users.ts --user=primary5253# 3. Run tests against production54E2E_TEST_EMAIL=test@app.test E2E_TEST_PASSWORD=xxx bun run test:e2e:prod55```5657## Quick Start: Interactive Debugging5859```bash60# 1. Install Playwright (npm for js_repl compat, bun for everything else)61test -f package.json || npm init -y62npm install playwright63npx playwright install chromium6465# 2. Bootstrap persistent session (js_repl, Node REPL, or script)66node -e "import('playwright').then(() => console.log('ready'))"67```6869Then launch a browser and start testing — see [INTERACTIVE-SESSIONS.md](references/INTERACTIVE-SESSIONS.md).7071---7273## The Google OAuth Bypass7475**Problem:** Google blocks automated logins (CAPTCHA, headless detection).7677**Solution:** Create test users with email/password auth in Supabase — same app, different auth method.7879```typescript80// Sign in via Supabase (NOT Google OAuth)81const { data, error } = await supabase.auth.signInWithPassword({82 email: process.env.E2E_TEST_EMAIL, // e2e-test@app.test83 password: process.env.E2E_TEST_PASSWORD,84});85// Inject session cookies into browser context86await context.addCookies([87 { name: 'sb-access-token', value: data.session.access_token, domain: '...', ... },88]);89```9091**Why `.test` TLD?** IANA-reserved, never resolves — test emails can't leak to real inboxes.9293**Deep dive:** [AUTHENTICATION.md](references/AUTHENTICATION.md)9495---9697## QA Inventory Methodology9899Before testing, build a coverage list from **three sources:**1001011. **User's requested requirements** — what was asked for1022. **Implemented features/behaviors** — what you actually built1033. **Claims in the final response** — what you intend to sign off on104105Everything in any of those three sources must map to at least one QA check.106107For each item, note:108- The intended functional check (user input → expected result)109- The specific state where visual check must happen110- The evidence to capture (screenshot, assertion)111112Add at least **2 exploratory/off-happy-path scenarios** that could expose fragile behavior.113114Update the inventory during testing if exploration reveals additional controls, states, or claims.115116---117118## Workflow119120### Batch Mode Phases121122| Phase | Steps |123|-------|-------|124| **1. Setup** | Install Playwright, create test users, configure storage state |125| **2. Implementation** | Build Page Objects, add console monitoring, capture screenshots |126| **3. Enhancement** | Add visual analysis, screenshot capture, HTML/JSON reports |127| **4. CI Integration** | Add test:e2e script, GitHub Actions workflow, artifact upload |128129### Interactive Mode Loop1301311. Build QA inventory from the three sources above1322. Bootstrap persistent browser session (once)1333. Start/confirm dev server1344. Launch runtime (web or Electron), keep handles alive1355. **Edit-Reload-Verify micro-loop** for each component:136 - Make one change → reload → snapshot diff → DOM health check → fix issues → screenshot → verify1376. Run functional QA with real user input (use `.click()`, not `page.evaluate()`)1387. Run separate visual QA pass1398. Run breakpoint sweep for responsive verification1409. Run failure injection pass (network failures, input stress, state corruption)14110. Verify viewport fit, capture evidence screenshots14211. Update inventory if exploration reveals new items14312. Repeat 5-11 until signoff criteria met14413. Clean up session when task is finished145146**Deep dive:** Edit-Reload-Verify loop → [SYSTEMATIC-TESTING.md](references/SYSTEMATIC-TESTING.md), DOM health check → [DIAGNOSTIC-TOOLS.md](references/DIAGNOSTIC-TOOLS.md)147148**Deep dive:** [INTERACTIVE-SESSIONS.md](references/INTERACTIVE-SESSIONS.md)149150---151152## Functional QA153154- Use **real user controls** for signoff: `.click()`, `.fill()`, `.press()` — NOT `page.evaluate()`155- Interact via **Playwright action methods** which simulate real mouse/keyboard and respect visibility, overlapping elements, and event bubbling — `page.evaluate()` bypasses all of this156- Verify **visible results**, not just internal state157- Cover **every control** in the QA inventory at least once158- For stateful toggles: test the full cycle (initial → changed → returned to initial)159- Test **interactive states** (hover, focus, disabled, error, empty, overflow) — see [DIAGNOSTIC-TOOLS.md](references/DIAGNOSTIC-TOOLS.md)160- **Exploratory pass** (30-90 seconds) using normal input, not only the happy path161- If exploratory pass reveals new states/controls, add to inventory162163## Visual QA (Separate Pass)164165- Each user-visible claim needs a matching visual check + reviewed screenshot166- Inspect initial viewport **before scrolling**167- Check **all required regions**, not just the main interaction surface168- Look for: clipping, overflow, distortion, weak contrast, broken layering, alignment problems169- Judge **aesthetic quality** as well as correctness170- For dynamic visuals, inspect long enough to judge stability — don't rely on a single screenshot171- Before signoff, ask: "What visible defect would most embarrass this result?"172173**Deep dive:** [VISUAL-QA.md](references/VISUAL-QA.md)174175## Signoff Criteria176177All three must pass independently — one does not imply the others:1781791. **Functional correctness** — user input paths work, QA inventory covered1802. **Viewport fit** — intended initial view visible without unintended clipping/scrolling1813. **Visual quality** — UI is coherent, not aesthetically weak for the task1824. **Failure resilience** (optional, recommended) — app handles network errors, input stress, and state corruption gracefully — see [FAILURE-INJECTION.md](references/FAILURE-INJECTION.md)183184Include brief negative confirmation of defect classes checked and not found.185186---187188## Test User Tiers189190| Type | Email | Tier | Purpose |191|------|-------|------|---------|192| `primary` | `e2e-test@app.test` | Pro | Main tests, full features |193| `free` | `e2e-free@app.test` | Free | Paywall, limitations |194| `premium` | `e2e-premium@app.test` | Premium | All features unlocked |195| `fresh` | `e2e-new@app.test` | None | Onboarding, empty states |196| `admin` | `e2e-admin@app.test` | Admin | Admin panel tests |197198---199200## Key Configuration201202```typescript203// playwright.production.config.ts204export default defineConfig({205 testDir: './e2e',206 timeout: 60000,207 retries: 2,208 use: {209 baseURL: 'https://your-app.com',210 trace: 'retain-on-failure',211 screenshot: 'on',212 video: 'retain-on-failure',213 actionTimeout: 30000,214 navigationTimeout: 60000,215 },216 projects: [217 { name: 'auth-setup', testMatch: /auth\.global-setup\.ts/ },218 {219 name: 'authenticated',220 dependencies: ['auth-setup'],221 use: { storageState: '.auth/user.json', ...devices['Desktop Chrome'] },222 },223 ],224});225```226227---228229## Console Error Categories230231| Category | Patterns | Action |232|----------|----------|--------|233| `hydration` | `hydrat`, `server.*different.*client` | Fix SSR mismatch |234| `runtime` | `TypeError`, `ReferenceError` | Fix JS error |235| `network` | `net::ERR`, `fetch.*failed` | Check API/CORS |236| `react` | `Warning:`, `useEffect` | Fix hook issue |237| `security` | `CSP`, `Refused to` | Fix CSP policy |238239**Deep dive:** [CONSOLE-MONITORING.md](references/CONSOLE-MONITORING.md)240241---242243## Page Object Pattern244245```typescript246export class DashboardPage extends BasePage {247 static readonly PATH = '/portfolio';248 readonly healthScoreWidget = this.page.locator('[data-testid="health-score"]');249 async goto() { await super.goto(DashboardPage.PATH); }250 async getHealthScore(): Promise<number | null> {251 const text = await this.healthScoreWidget.textContent();252 return text ? parseInt(text.match(/(\d+)/)?.[1] ?? '', 10) : null;253 }254}255```256257**Deep dive:** [PAGE-OBJECTS.md](references/PAGE-OBJECTS.md)258259---260261## AI Visual Analysis262263The 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.264265```javascript266// Codex: emit for agent to see267await codex.emitImage({ bytes: await page.screenshot({ type: "jpeg", quality: 85, scale: "css" }), mimeType: "image/jpeg" });268269// Claude Code / Gemini CLI: save to file, agent reads it natively270await page.screenshot({ path: '/tmp/visual-check.png' });271```272273**Deep dive:** [AI-VISUAL-ANALYSIS.md](references/AI-VISUAL-ANALYSIS.md)274275---276277## Running Tests278279```bash280# Batch mode281bun run test:e2e # Local (headless)282bun run test:e2e:prod --headed # Production (visible browser)283bun run test:e2e e2e/tests/dashboard.spec.ts # Specific file284bun run test:e2e:prod # Production (headless)285286# Interactive mode (inside persistent session)287await page.goto('http://127.0.0.1:3000'); # Navigate288await page.reload({ waitUntil: 'domcontentloaded' }); # Reload after changes289await page.screenshot({ type: 'jpeg', quality: 85 }); # Capture290```291292---293294## Validation Checklist295296- [ ] Test users exist in Supabase with email/password auth297- [ ] Test users have `is_test_user: true` metadata298- [ ] `.auth/user.json` generated on first run299- [ ] Tests pass in headless CI (no Google OAuth prompts)300- [ ] Console errors captured and categorized301- [ ] Screenshots captured at key test steps302- [ ] DOM health check passes (no critical/major issues)303- [ ] Layout snapshot diff shows no unexpected structural changes304- [ ] QA inventory built and all items covered305- [ ] Functional QA pass completed with real user input (`.click()`, not `evaluate()`)306- [ ] Visual QA pass completed with screenshot evidence307- [ ] Breakpoint sweep completed (mobile through desktop)308- [ ] Interactive states tested (hover, focus, error, empty, overflow)309- [ ] Failure injection pass: no blank pages on API errors, no duplicate submissions310- [ ] Signoff criteria met (functional + viewport fit + visual quality + resilience)311- [ ] No flaky tests from timing issues (use proper waits)312313---314315## Reference Index316317### By Task318319| I need to... | Read |320|--------------|------|321| **Set up test user auth bypass** | [AUTHENTICATION.md](references/AUTHENTICATION.md) |322| **Debug interactively with persistent browser** | [INTERACTIVE-SESSIONS.md](references/INTERACTIVE-SESSIONS.md) |323| **Run systematic visual QA and signoff** | [VISUAL-QA.md](references/VISUAL-QA.md) |324| **Capture and normalize screenshots** | [SCREENSHOTS.md](references/SCREENSHOTS.md) |325| **Implement Page Objects** | [PAGE-OBJECTS.md](references/PAGE-OBJECTS.md) |326| **Monitor console errors** | [CONSOLE-MONITORING.md](references/CONSOLE-MONITORING.md) |327| **Add AI visual analysis** | [AI-VISUAL-ANALYSIS.md](references/AI-VISUAL-ANALYSIS.md) |328| **Generate reports and CI artifacts** | [REPORTING.md](references/REPORTING.md) |329| **Quick commands & troubleshooting** | [QUICK-REFERENCE.md](references/QUICK-REFERENCE.md) |330| **Three-image LLM diff, SoM overlays, stabilization** | [ADVANCED-TECHNIQUES.md](references/ADVANCED-TECHNIQUES.md) |331| **Playwright Test Agents, agent-driven CI QA** | [ADVANCED-TECHNIQUES.md](references/ADVANCED-TECHNIQUES.md) |332| **Run DOM health check, extract computed styles** | [DIAGNOSTIC-TOOLS.md](references/DIAGNOSTIC-TOOLS.md) |333| **Layout snapshot diff, render intent declaration** | [DIAGNOSTIC-TOOLS.md](references/DIAGNOSTIC-TOOLS.md) |334| **Responsive breakpoint sweep, state triggers** | [DIAGNOSTIC-TOOLS.md](references/DIAGNOSTIC-TOOLS.md) |335| **Human-like interaction (avoid evaluate() trap)** | [SYSTEMATIC-TESTING.md](references/SYSTEMATIC-TESTING.md) |336| **Edit-Reload-Verify loop, state matrix sweep** | [SYSTEMATIC-TESTING.md](references/SYSTEMATIC-TESTING.md) |337| **Interactive state catalog, peripheral checks** | [SYSTEMATIC-TESTING.md](references/SYSTEMATIC-TESTING.md) |338| **Inject network failures, test error handling** | [FAILURE-INJECTION.md](references/FAILURE-INJECTION.md) |339| **Input stress testing, rapid interaction, state corruption** | [FAILURE-INJECTION.md](references/FAILURE-INJECTION.md) |340| **Failure resilience audit and scorecard** | [FAILURE-INJECTION.md](references/FAILURE-INJECTION.md) |341342### By Topic343344| Topic | Reference |345|-------|-----------|346| Google OAuth bypass, Supabase test users, provisioning | [AUTHENTICATION.md](references/AUTHENTICATION.md) |347| Persistent sessions, Electron, mobile, reload/relaunch | [INTERACTIVE-SESSIONS.md](references/INTERACTIVE-SESSIONS.md) |348| QA inventory, functional/visual QA, viewport fit, signoff | [VISUAL-QA.md](references/VISUAL-QA.md) |349| CSS normalization, model-bound screenshots, click helpers | [SCREENSHOTS.md](references/SCREENSHOTS.md) |350| Page Object Model, BasePage, locator strategies, fixtures | [PAGE-OBJECTS.md](references/PAGE-OBJECTS.md) |351| Browser console capture, error categorization, filtering | [CONSOLE-MONITORING.md](references/CONSOLE-MONITORING.md) |352| Agent-native visual analysis, structured QA, severity thresholds | [AI-VISUAL-ANALYSIS.md](references/AI-VISUAL-ANALYSIS.md) |353| HTML/JSON reports, CI artifacts, screenshot management | [REPORTING.md](references/REPORTING.md) |354| LLM diff, SoM overlays, ARIA, stabilization, Test Agents, CI QA | [ADVANCED-TECHNIQUES.md](references/ADVANCED-TECHNIQUES.md) |355| CLI commands, config snippets, failure modes | [QUICK-REFERENCE.md](references/QUICK-REFERENCE.md) |356| DOM health check, layout snapshot diff, computed styles, breakpoint sweep, state triggers | [DIAGNOSTIC-TOOLS.md](references/DIAGNOSTIC-TOOLS.md) |357| Human-like interaction, Edit-Reload-Verify loop, state matrix, state catalog | [SYSTEMATIC-TESTING.md](references/SYSTEMATIC-TESTING.md) |358| Network failure injection, input stress, state corruption, resilience scorecard | [FAILURE-INJECTION.md](references/FAILURE-INJECTION.md) |359360---361362## Tools & Scripts363364| Tool | Purpose |365|------|---------|366| `scripts/provision-e2e-test-users.ts` | Create test users in Supabase |367| `scripts/reset-e2e-test-user.ts` | Reset user to known seed state |368| `scripts/validate-e2e.sh` | Validate E2E setup |