Help us improve
Share bugs, ideas, or general feedback.
From user-testing-agent
Tests essential user journeys like purchase flows and logins from project config using navigate/verify/input steps with personas. Ensures critical paths pass before deployments.
npx claudepluginhub ncklrs/claude-chrome-user-testing --plugin user-testing-agentHow this skill is triggered — by the user, by Claude, or both
Slash command
/user-testing-agent:critical-pathsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Test must-work user journeys defined in project configuration. Critical paths are essential flows that must always function correctly.
Executes smoke tests validating critical user journeys like registration, authentication, checkout, search, and profile management with performance SLAs for release workflows.
Runs smoke tests for login, signup, checkout, navigation, and search flows in web apps. Validates critical functionality before releases, deployments, or CI/CD.
Executes end-to-end user flow tests using Playwright MCP from tests/e2e-test-plan.md. Verifies multi-step journeys, state persistence, error handling in auth, business, and admin flows.
Share bugs, ideas, or general feedback.
Test must-work user journeys defined in project configuration. Critical paths are essential flows that must always function correctly.
A critical path is a user journey that:
| Site Type | Critical Paths |
|---|---|
| E-commerce | Purchase flow, Account creation, Cart |
| SaaS | Signup, Login, Core feature usage |
| Content | Navigation, Search, Article viewing |
| Banking | Login, Transfer, Balance check |
{
"paths": [
{
"name": "string (required)",
"description": "string (required)",
"persona": "persona-id (required)",
"priority": "critical|high|medium|low (optional, default: high)",
"timeout": "number in seconds (optional, default: 120)",
"steps": [
{
"action": "navigate|task|verify|wait|input",
"...action-specific fields"
}
],
"onFailure": "continue|stop (optional, default: continue)"
}
]
}
Navigate to a URL path.
{
"action": "navigate",
"to": "/path",
"waitFor": "load|networkidle (optional)"
}
Perform a task using the persona's behavior.
{
"action": "task",
"do": "description of task to perform",
"timeout": 30
}
Verify something exists or is true.
// Verify element exists
{ "action": "verify", "element": "description of element" }
// Verify text appears
{ "action": "verify", "text": "exact text to find" }
// Verify URL matches
{ "action": "verify", "url": "/expected-path" }
// Verify URL contains
{ "action": "verify", "urlContains": "confirmation" }
Wait for a condition.
// Wait for seconds
{ "action": "wait", "seconds": 2 }
// Wait for element
{ "action": "wait", "for": "element description" }
// Wait for navigation
{ "action": "wait", "for": "page load" }
Enter specific data into a field.
{
"action": "input",
"field": "field description or selector",
"value": "value to enter"
}
function executePath(path, baseUrl):
results = { steps: [], status: 'pending' }
loadPersona(path.persona)
startTime = now()
for step in path.steps:
stepResult = executeStep(step, baseUrl)
results.steps.append(stepResult)
if stepResult.status == 'fail':
results.status = 'fail'
results.failedAt = step
captureScreenshot()
if path.onFailure == 'stop':
break
else:
return results
results.status = 'pass'
results.duration = now() - startTime
return results
function executeStep(step, baseUrl):
switch step.action:
case 'navigate':
navigate(baseUrl + step.to)
return { status: 'pass' }
case 'task':
success = performTaskAsPersona(step.do)
return { status: success ? 'pass' : 'fail' }
case 'verify':
found = verifyCondition(step)
return { status: found ? 'pass' : 'fail' }
case 'wait':
waitForCondition(step)
return { status: 'pass' }
case 'input':
fillField(step.field, step.value)
return { status: 'pass' }
| Priority | On Failure | Report Level |
|---|---|---|
| critical | Major alert | CRITICAL |
| high | Alert | ERROR |
| medium | Warning | WARNING |
| low | Note | INFO |
const pathReport = {
summary: {
total: 3,
passed: 2,
failed: 1,
skipped: 0
},
results: [
{
name: 'purchase-flow',
status: 'pass',
duration: 45,
steps: [
{ action: 'navigate', status: 'pass', duration: 2 },
{ action: 'task', status: 'pass', duration: 15 },
// ...
]
},
{
name: 'password-reset',
status: 'fail',
duration: 15,
failedAt: { step: 4, action: 'task', error: 'Button not clickable' },
screenshot: 'path-password-reset-fail.png'
}
],
actionRequired: [
{
priority: 'high',
path: 'password-reset',
issue: 'Form submission broken',
recommendation: 'Check submit button handler'
}
]
};
When --fail-fast is enabled:
All pass + no critical failures = SUCCESS
Any critical failure = FAILURE
Only non-critical failures = WARNING (could be configurable)
{
"paths": [
{
"name": "guest-purchase",
"description": "Guest checkout flow",
"persona": "impulse-buyer",
"priority": "critical",
"steps": [
{ "action": "navigate", "to": "/" },
{ "action": "task", "do": "find a product" },
{ "action": "task", "do": "add to cart" },
{ "action": "task", "do": "go to cart" },
{ "action": "task", "do": "proceed to checkout" },
{ "action": "task", "do": "fill shipping info" },
{ "action": "verify", "element": "payment form" }
]
},
{
"name": "product-search",
"description": "Search for products",
"persona": "comparison-shopper",
"priority": "high",
"steps": [
{ "action": "navigate", "to": "/" },
{ "action": "task", "do": "search for a product" },
{ "action": "verify", "element": "search results" },
{ "action": "task", "do": "click a result" },
{ "action": "verify", "element": "product details" }
]
}
]
}
{
"paths": [
{
"name": "signup-to-dashboard",
"description": "New user onboarding",
"persona": "genz-digital-native",
"priority": "critical",
"steps": [
{ "action": "navigate", "to": "/signup" },
{ "action": "task", "do": "complete registration" },
{ "action": "verify", "urlContains": "dashboard" },
{ "action": "verify", "element": "welcome message" }
]
},
{
"name": "login-flow",
"description": "Existing user login",
"persona": "busy-executive",
"priority": "critical",
"steps": [
{ "action": "navigate", "to": "/login" },
{ "action": "input", "field": "email", "value": "test@example.com" },
{ "action": "input", "field": "password", "value": "testpass123" },
{ "action": "task", "do": "submit login" },
{ "action": "verify", "element": "dashboard or main app" }
]
}
]
}