Back to docs

Persona Testing

Test how real humans experience your site, not just whether buttons work.


The Problem

Traditional automation tests one thing: "Does this work?"

That's the wrong question. The right questions are:

  • Does this work for a first-time user?
  • Does this work for someone on mobile?
  • Does this work for an elderly user with motor limits?

A checkout flow that works for developers might fail for 40% of real users.


Built-in Personas

CBrowser includes 6 realistic personas:

Persona Description Behavior
power-user Tech-savvy expert Fast reactions, no errors, efficient navigation
first-timer New to your site Slow, exploratory, reads everything
mobile-user Smartphone user Touch interface, small screen, scroll-heavy
elderly-user Older adult Vision limits, slower motor control, careful reading
screen-reader-user Blind user Relies on ARIA, keyboard navigation only
impatient-user Short attention span Quick to abandon, skips content

How It Works

Each persona has human behavior parameters:

Timing Parameters

timing: {
  reactionTime: { min: 500, max: 2000 },  // MS before first action
  clickDelay: { min: 200, max: 800 },      // MS between clicks
  typeSpeed: { min: 50, max: 150 },        // MS per keystroke
  readingSpeed: 200,                        // Words per minute
  scrollPauseTime: { min: 500, max: 1500 } // MS after scrolling
}

Error Parameters

errors: {
  misClickRate: 0.05,        // 5% chance of missing target
  doubleClickAccidental: 0.02, // 2% accidental double-clicks
  typoRate: 0.03,            // 3% typo rate per character
  backtrackRate: 0.1         // 10% chance of going back
}

Mouse Behavior

mouse: {
  curvature: 0.3,    // How curved mouse paths are
  jitter: 5,         // Pixels of random movement
  overshoot: 0.1,    // 10% chance of overshooting
  speed: "normal"    // slow | normal | fast
}

Attention Patterns

attention: {
  pattern: "f-pattern",        // How they scan pages
  scrollBehavior: "chunked",   // continuous | chunked | jump
  focusAreas: ["cta", "prices"], // What they notice first
  distractionRate: 0.05        // 5% chance of getting distracted
}

Single Persona Exploration

Run a short cognitive journey as one persona. It needs an Anthropic API key (npx cbrowser config set-api-key <key>); since 20.0 there is no keyless heuristic mode, because its success verdicts were not accurate. An unsuccessful journey exits 1.

npx cbrowser explore "first-timer" \
  --start "https://your-site.com" \
  --goal "Complete signup and reach dashboard"

The summary it prints at the end (values are an example):

πŸ“Š Journey Results
   Success: βœ“
   Steps: 6
   Time: 45200ms
   Friction points: 2

⚠️  Friction Points:
   - Form validation error was
     confusing
   - Password requirements hidden
     until error

Multi-Persona Comparison

The real power: compare how different users experience the same flow. This runs one cognitive journey per persona, so it needs an Anthropic API key too.

npx cbrowser compare-personas \
  --start "https://your-site.com" \
  --goal "Complete checkout" \
  --personas power-user,first-timer,elderly-user,mobile-user

Output:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Persona         β”‚ Success  β”‚ Time     β”‚ Friction β”‚ Key Issues              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ power-user      β”‚ βœ“        β”‚ 12.5s    β”‚ 0        β”‚ -                       β”‚
β”‚ first-timer     β”‚ βœ“        β”‚ 45.2s    β”‚ 2        β”‚ Confusing CTA           β”‚
β”‚ elderly-user    β”‚ βœ—        β”‚ 120.3s   β”‚ 5        β”‚ Small buttons, tiny textβ”‚
β”‚ mobile-user     β”‚ βœ“        β”‚ 28.1s    β”‚ 1        β”‚ Horizontal scroll issue β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Recommendations:
β€’ elderly-user failed - increase button sizes, use larger fonts
β€’ first-timer took 3.6x longer than power-user - add more guidance
β€’ mobile-user experienced horizontal scroll - fix responsive layout

Creating Custom Personas

From Natural Language

Describe the user. CBrowser generates the parameters.

npx cbrowser persona create "impatient developer who hates slow UIs" --name speed-demon

Generated:

{
  "name": "speed-demon",
  "description": "Impatient developer who hates slow UIs",
  "timing": {
    "reactionTime": { "min": 100, "max": 300 },
    "clickDelay": { "min": 50, "max": 150 }
  },
  "errors": {
    "misClickRate": 0.02,
    "backtrackRate": 0.01
  },
  "attention": {
    "pattern": "skim",
    "distractionRate": 0.15
  }
}

From the Questionnaire

npx cbrowser \
  persona-questionnaire start \
  --name careful-reader

Answer 13 questions (30 with --comprehensive: all 25 cognitive traits and the five Big Five dimensions) and the persona is saved with your custom personas. See Persona-Questionnaire.

List All Personas

npx cbrowser persona list

Export/Import

# Share personas with your team
# (export writes the file
# elderly-user.persona.json)
npx cbrowser persona export \
  elderly-user
npx cbrowser persona import \
  teammate.json

Generating Reports

JSON Report

npx cbrowser compare-personas \
  --start "https://..." \
  --goal "..." \
  --personas power-user,elderly-user \
  --output report.json

HTML Report

npx cbrowser compare-personas \
  --start "https://..." \
  --goal "..." \
  --personas power-user,elderly-user \
  --html

Generates a visual dashboard with:

  • Success/failure per persona
  • Time comparisons
  • Friction point heatmaps
  • Screenshot comparisons
  • Actionable fixes

API Usage

import { CBrowser, runPersonaJourney, comparePersonas } from 'cbrowser';

// Single journey
const result = await runPersonaJourney({
  persona: 'elderly-user',
  startUrl: 'https://your-site.com',
  goal: 'Find contact information',
});

console.log(result.success);      // true/false
console.log(result.frictionPoints); // Array of issues
console.log(result.totalTime);    // Duration in ms

// Multi-persona comparison
const comparison = await comparePersonas({
  startUrl: 'https://your-site.com',
  goal: 'Complete checkout',
  personas: ['power-user', 'first-timer', 'elderly-user'],
});

for (const result of comparison.results) {
  console.log(`${result.persona}: ${result.success ? 'PASS' : 'FAIL'}`);
}

Best Practices

  1. Always test with elderly-user -- if it works for them, it works for everyone
  2. Compare against power-user -- shows the gap between expert and novice
  3. Test mobile separately -- touch interfaces have different challenges
  4. Run before every deploy -- catch UX regressions early
  5. Create personas for your actual users -- generic personas are a starting point


Copyright: (c) 2026 Alexa Eden.

License: MIT License

Contact: [email protected]

From the Blog