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 an exploration as a specific persona (heuristic-based, free):

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

Output:

🎭 Persona: first-timer (New user exploring for the first time)

πŸ“ Journey Start: https://your-site.com
🎯 Goal: Complete signup and reach dashboard

Step 1: [2.3s] Scrolled down to explore page
Step 2: [4.1s] Read hero section (slower reading speed)
Step 3: [1.8s] Clicked "Sign Up" button
Step 4: [12.5s] Filled registration form (with 2 typos corrected)
Step 5: [0.8s] Clicked "Create Account"
Step 6: [3.2s] Waited for confirmation...

βœ… Goal Achieved!
⏱️  Total Time: 45.2s
πŸ”΄ Friction Points: 2
   - Form validation error was confusing
   - Password requirements not visible until error

Multi-Persona Comparison

The real power: compare how different users experience the same flow.

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
  }
}

Manually

npx cbrowser persona create-manual --name "careful-reader"

Then edit ~/.cbrowser/personas/careful-reader.json.

List All Personas

npx cbrowser persona list

Export/Import

# Share personas with your team
npx cbrowser persona export elderly-user > elderly-user.json
npx cbrowser persona import teammate-persona.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

Related


Copyright: (c) 2026 Alexa Eden.

License: MIT License

Contact: [email protected]

From the Blog