Back to catalog

MCP Testing (Incognito Mode)

Automated testing with Chrome DevTools MCP server ALWAYS in incognito mode to avoid cache issues

  • Category: discovered
  • Tags: github, community
  • Version: 1.0.0
  • Author: walid
  • Downloads: 0
  • Updated: 2025-11-22

Download the latest version (v1.0.0) from this page.

SKILL.md

---
name: MCP Testing (Incognito Mode)
description: Automated testing with Chrome DevTools MCP server ALWAYS in incognito mode to avoid cache issues
version: 1.0.0
allowed-tools: [Bash, mcp__chrome-devtools__*, Read, Write]
---

# MCP Testing Skill - Incognito Mode Enforced

## Overview

This skill ensures ALL MCP Chrome DevTools testing is done in **incognito mode** to avoid browser cache issues that caused debugging loops in previous sessions.

**Critical Rule:** NEVER test in regular browser mode. Always launch Chrome with `--incognito` flag.

---

## Why Incognito Mode is Mandatory

### Problem: Browser Cache Persistence

**What Happened (2025-10-20 Session):**
- Frontend had bug (TypeError in authStore.ts)
- Fixed bug, rebuilt 8 times
- Same error persisted for 9 hours
- Root cause: Browser cache with `max-age=31536000, immutable` (1 year!)
- Chrome refused to revalidate even with hard reload (Cmd+Shift+R)

**Lesson Learned:**
> Regular browser mode is UNRELIABLE for testing after deployments due to aggressive Next.js caching.

### Incognito Benefits

✅ **Zero cache:** Every session starts fresh
✅ **No localStorage:** Avoids persisted auth state
✅ **No cookies:** Clean authentication tests
✅ **No service workers:** Avoids outdated JS workers
✅ **Reliable:** What you see = what's actually deployed

---

## How to Launch Chrome in Incognito Mode

### Correct Command (ALWAYS USE THIS)

```bash
# Kill any existing Chrome debugging sessions
pkill -f "remote-debugging-port=9222"

# Wait for port to be free
sleep 2

# Launch Chrome in INCOGNITO mode with debugging
open -na "Google Chrome" --args \
  --remote-debugging-port=9222 \
  --incognito \
  --new-window \
  "https://matrix.mutuapix.com/login"
```

### Verify Incognito Mode

After launching, verify the window shows:
- 🕵️ **Incognito icon** in top-right corner (sunglasses/hat)
- Dark theme (if user has incognito theme)
- "You've gone incognito" message

---

## MCP Chrome DevTools Integration

### Connection Status

```bash
# Check if Chrome DevTools is accessible
curl -s http://127.0.0.1:9222/json/version | jq .
```

**Expected Output:**
```json
{
  "Browser": "Chrome/130.x.x.x",
  "Protocol-Version": "1.3",
  "User-Agent": "Mozilla/5.0 ...",
  "V8-Version": "13.0.x.x",
  "WebKit-Version": "537.36",
  "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/browser/..."
}
```

### Available MCP Tools

**Navigation:**
- `mcp__chrome-devtools__navigate_page` - Go to URL
- `mcp__chrome-devtools__navigate_page_history` - Back/forward
- `mcp__chrome-devtools__new_page` - Open new tab

**Inspection:**
- `mcp__chrome-devtools__take_snapshot` - Get page elements with UIDs
- `mcp__chrome-devtools__take_screenshot` - Visual capture
- `mcp__chrome-devtools__list_console_messages` - JavaScript errors
- `mcp__chrome-devtools__list_network_requests` - API calls

**Interaction:**
- `mcp__chrome-devtools__click` - Click element by UID
- `mcp__chrome-devtools__fill` - Fill input field
- `mcp__chrome-devtools__fill_form` - Fill multiple fields at once
- `mcp__chrome-devtools__hover` - Hover over element

**Debugging:**
- `mcp__chrome-devtools__evaluate_script` - Run JavaScript
- `mcp__chrome-devtools__get_network_request` - Inspect specific request
- `mcp__chrome-devtools__wait_for` - Wait for text to appear

**Performance:**
- `mcp__chrome-devtools__performance_start_trace` - Start recording
- `mcp__chrome-devtools__performance_stop_trace` - Stop and analyze

---

## Testing Workflow (Mandatory Steps)

### Step 1: Launch Incognito Chrome

```bash
# ALWAYS run this first
pkill -f "remote-debugging-port=9222"
sleep 2
open -na "Google Chrome" --args \
  --remote-debugging-port=9222 \
  --incognito \
  --new-window \
  "https://matrix.mutuapix.com/login"
```

**Wait 3 seconds** for Chrome to fully start before MCP commands.

---

### Step 2: Verify Connection

```javascript
// Check MCP connection
mcp__chrome-devtools__list_pages()
```

**Expected:** At least 1 page showing login URL

---

### Step 3: Take Snapshot (Get Element UIDs)

```javascript
mcp__chrome-devtools__take_snapshot()
```

**Returns:** HTML structure with UIDs like:
```
[1] input type="email" placeholder="Email"
[2] input type="password" placeholder="Senha"
[3] button "Entrar"
```

---

### Step 4: Fill Login Form

```javascript
mcp__chrome-devtools__fill_form({
  elements: [
    { uid: "1", value: "teste@mutuapix.com" },
    { uid: "2", value: "teste123" }
  ]
})
```

---

### Step 5: Click Login Button

```javascript
mcp__chrome-devtools__click({ uid: "3" })
```

---

### Step 6: Check for Errors

```javascript
// Wait for navigation
mcp__chrome-devtools__wait_for({ text: "Dashboard", timeout: 5000 })

// Check console errors
mcp__chrome-devtools__list_console_messages()
```

**Look for:**
- ❌ `TypeError: v is not a function`
- ❌ `ReferenceError: environment is not defined`
- ❌ Any errors with `authStore.ts` in stack trace

---

### Step 7: Check Network Requests

```javascript
mcp__chrome-devtools__list_network_requests({
  resourceTypes: ["xhr", "fetch"]
})
```

**Verify:**
- ✅ `/api/v1/login` → 200 status
- ✅ `/api/v1/user` → 200 status (if dashboard loads)
- ❌ 401 errors (authentication failed)
- ❌ 500 errors (server error)

---

### Step 8: Take Screenshot (Evidence)

```javascript
mcp__chrome-devtools__take_screenshot({
  format: "png",
  fullPage: true
})
```

Save screenshot as evidence in `docs/testing/screenshots/`.

---

## Common Test Scenarios

### Scenario 1: Login Flow Test

**Goal:** Verify login works and dashboard loads

```javascript
// 1. Launch incognito
// (bash command above)

// 2. Navigate to login (already done in launch)
// 3. Take snapshot
const snapshot = mcp__chrome-devtools__take_snapshot()

// 4. Find email/password/button UIDs from snapshot
// 5. Fill form
mcp__chrome-devtools__fill_form({
  elements: [
    { uid: "email-input-uid", value: "admin@mutuapix.com" },
    { uid: "password-input-uid", value: "Admin@123" }
  ]
})

// 6. Click login
mcp__chrome-devtools__click({ uid: "login-button-uid" })

// 7. Wait for dashboard
mcp__chrome-devtools__wait_for({ text: "Bem-vindo", timeout: 5000 })

// 8. Check errors
const errors = mcp__chrome-devtools__list_console_messages()
// Should be empty or only warnings

// 9. Screenshot success
mcp__chrome-devtools__take_screenshot({ filePath: "docs/testing/screenshots/login-success.png" })
```

---

### Scenario 2: Cache Validation

**Goal:** Verify new code is deployed (not cached)

```javascript
// 1. Launch incognito
// 2. Navigate to any page
mcp__chrome-devtools__navigate_page({ url: "https://matrix.mutuapix.com" })

// 3. Check for specific code pattern that was just deployed
const result = mcp__chrome-devtools__evaluate_script({
  function: `() => {
    // Look for new function/variable that didn't exist before
    return typeof window.someNewFeature !== 'undefined'
  }`
})

// 4. Check network for new bundle hash
const requests = mcp__chrome-devtools__list_network_requests({
  resourceTypes: ["script"]
})

// Verify bundle filename changed (new hash = new code)
// Example: page-8e52c12b50f60245.js (old) vs page-0757a9532994887c.js (new)
```

---

### Scenario 3: Console Error Detection

**Goal:** Find JavaScript errors that might cause bugs

```javascript
// 1. Navigate to page
mcp__chrome-devtools__navigate_page({ url: "https://matrix.mutuapix.com/user/dashboard" })

// 2. Wait for page load
await sleep(3000)

// 3. Get all console messages
const messages = mcp__chrome-devtools__list_console_messages()

// 4. Filter errors
const errors = messages.filter(m => m.level === 'error')

// 5. Report findings
if (errors.length > 0) {
  console.log(`❌ Found ${errors.length} errors:`)
  errors.forEach(e => console.log(`  - ${e.text} (${e.url}:${e.line})`))
} else {
  console.log(`✅ No console errors`)
}
```

---

## Integration with Deployment

### Post-Deploy Test (Automated)

After every deployment, run this test suite:

```bash
# 1. Deploy code
ssh root@138.199.162.115 'cd /var/www/mutuapix-frontend-production && rm -rf .next && npm run build && pm2 restart mutuapix-frontend'

# 2. Wait for PM2 restart
sleep 5

# 3. Launch incognito Chrome for testing
pkill -f "remote-debugging-port=9222"
sleep 2
open -na "Google Chrome" --args \
  --remote-debugging-port=9222 \
  --incognito \
  --new-window \
  "https://matrix.mutuapix.com/login"

# 4. Wait for Chrome
sleep 3

# 5. Run MCP test suite (see scenarios above)
```

---

## Troubleshooting

### Issue: "Failed to fetch browser webSocket URL"

**Cause:** Chrome not running or port 9222 blocked

**Fix:**
```bash
# Kill existing sessions
pkill -f "remote-debugging-port=9222"

# Check if port is free
lsof -i :9222

# If port is in use by something else, kill it
kill -9 $(lsof -t -i:9222)

# Restart Chrome
open -na "Google Chrome" --args --remote-debugging-port=9222 --incognito
```

---

### Issue: MCP finds element but can't click it

**Cause:** Element might be covered by overlay or still loading

**Fix:**
```javascript
// Wait for element to be visible
mcp__chrome-devtools__wait_for({ text: "Button Text", timeout: 5000 })

// Then click
mcp__chrome-devtools__click({ uid: "button-uid" })
```

---

### Issue: Network requests show 401 errors

**Cause:** Authentication failed or token expired

**Debug:**
```javascript
// Check if login request succeeded
const loginRequest = mcp__chrome-devtools__get_network_request({
  url: "https://api.mutuapix.com/api/v1/login"
})

// Check response
console.log(loginRequest.response.body)

// Verify token was set in localStorage
const tokenCheck = mcp__chrome-devtools__evaluate_script({
  function: `() => {
    return localStorage.getItem('auth-storage')
  }`
})
```

---

## Best Practices

### ✅ DO

- **Always** launch Chrome with `--incognito` flag
- **Always** wait 3 seconds after launching Chrome before MCP commands
- **Always** check console messages after each test
- **Always** verify network requests succeeded (200 status)
- **Always** take screenshots as evidence
- **Always** close Chrome after tests to avoid port conflicts

### ❌ DON'T

- **Never** test in regular browser mode (cache issues!)
- **Never** assume element UIDs are stable (re-take snapshot each test)
- **Never** skip incognito mode "to save time" (will waste hours debugging cache)
- **Never** run multiple Chrome instances on port 9222 (conflict)
- **Never** trust hard reload (Cmd+Shift+R) - use incognito instead

---

## Checklist: Before Every MCP Test

- [ ] 1. Kill existing Chrome sessions: `pkill -f "remote-debugging-port=9222"`
- [ ] 2. Wait for port to be free: `sleep 2`
- [ ] 3. Launch Chrome with `--incognito` flag
- [ ] 4. Wait for Chrome to start: `sleep 3`
- [ ] 5. Verify connection: `mcp__chrome-devtools__list_pages()`
- [ ] 6. Take snapshot to get element UIDs
- [ ] 7. Run test scenario
- [ ] 8. Check console messages for errors
- [ ] 9. Verify network requests
- [ ] 10. Take screenshot as evidence

---

## Example: Complete Login Test

```bash
#!/bin/bash
# test-login-incognito.sh

echo "🧪 Testing Login in Incognito Mode"

# Step 1: Clean slate
echo "1. Killing existing Chrome sessions..."
pkill -f "remote-debugging-port=9222"
sleep 2

# Step 2: Launch incognito Chrome
echo "2. Launching Chrome in incognito mode..."
open -na "Google Chrome" --args \
  --remote-debugging-port=9222 \
  --incognito \
  --new-window \
  "https://matrix.mutuapix.com/login"

# Step 3: Wait for Chrome
echo "3. Waiting for Chrome to start..."
sleep 3

# Step 4: Verify connection
echo "4. Verifying MCP connection..."
curl -s http://127.0.0.1:9222/json/version > /dev/null
if [ $? -eq 0 ]; then
  echo "✅ Chrome DevTools connected"
else
  echo "❌ Chrome DevTools not accessible"
  exit 1
fi

# Step 5: Run MCP tests (via Claude Code)
echo "5. Running MCP test suite..."
# (Claude Code MCP commands here)

echo "✅ Test complete!"
```

---

## Integration with CLAUDE.md

Add this to [CLAUDE.md](CLAUDE.md):

```markdown
## MCP Testing

**CRITICAL:** Always use incognito mode for MCP Chrome DevTools testing.

See: @.claude/skills/mcp-testing-incognito/SKILL.md

Quick launch:
```bash
pkill -f "remote-debugging-port=9222" && sleep 2 && \
open -na "Google Chrome" --args --remote-debugging-port=9222 \
  --incognito --new-window "https://matrix.mutuapix.com/login"
```
```

---

## Version History

**v1.0.0 (2025-10-20):**
- Initial creation after 9-hour debugging session
- Enforces incognito mode for all MCP testing
- Prevents browser cache issues that caused debugging loops
- Includes complete test scenarios and troubleshooting guide

---

**Status:** ✅ Active
**Last Updated:** 2025-10-20
**Related Issues:** Browser cache persistence (2025-10-20 session)