Injects boxes, highlights, and callouts into browser DOM via browser_evaluate to annotate screenshots for user testing issues and reports.
From user-testing-agentnpx claudepluginhub ncklrs/claude-chrome-user-testing --plugin user-testing-agentThis skill uses the workspace's default tool permissions.
Designs and optimizes AI agent action spaces, tool definitions, observation formats, error recovery, and context for higher task completion rates.
Enables AI agents to execute x402 payments with per-task budgets, spending controls, and non-custodial wallets via MCP tools. Use when agents pay for APIs, services, or other agents.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
This skill provides visual annotation capabilities for screenshots taken during user testing. Annotations help highlight issues, confusion points, and notable elements in test screenshots.
Add visual markers (boxes, highlights, callouts) to screenshots before capturing them. This makes test reports more actionable by clearly showing where issues occurred.
A rectangular border around an element.
| Variant | Border Style | Use Case |
|---|---|---|
error | 3px solid red | Form errors, broken functionality |
confusion | 3px dashed red | User hesitation, unclear elements |
warning | 3px solid orange | Frustration triggers, warnings |
success | 3px solid green | Task completion, positive elements |
info | 3px solid blue | General callouts |
A semi-transparent overlay on an element.
| Color | Opacity | Use Case |
|---|---|---|
| Yellow | 40% | Draw attention to area |
| Orange | 30% | Frustration trigger match |
| Red | 25% | Critical issue area |
A numbered circle positioned near an element, used for referencing multiple issues.
error/confusion: #dc2626 (red-600)
warning: #f59e0b (amber-500)
success: #16a34a (green-600)
info: #2563eb (blue-600)
highlight: #fbbf24 (amber-400)
Use browser_evaluate to inject annotation elements before taking a screenshot. All DOM manipulation must use safe methods (createElement, appendChild, setAttribute).
First, find the target element and get its bounding box:
// Via browser_evaluate
const element = document.querySelector('[data-testid="submit-btn"]');
const rect = element.getBoundingClientRect();
const position = {
x: rect.left + window.scrollX,
y: rect.top + window.scrollY,
width: rect.width,
height: rect.height
};
return position;
Create a container div for annotations:
// Via browser_evaluate
(function() {
// Remove existing overlay if present
const existing = document.getElementById('uta-overlay');
if (existing) existing.remove();
// Create overlay container
const overlay = document.createElement('div');
overlay.id = 'uta-overlay';
overlay.style.cssText = 'position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:99999;';
document.body.appendChild(overlay);
return true;
})();
// Via browser_evaluate with parameters
(function(x, y, width, height, type, label) {
const overlay = document.getElementById('uta-overlay');
if (!overlay) return false;
const colors = {
error: '#dc2626',
confusion: '#dc2626',
warning: '#f59e0b',
success: '#16a34a',
info: '#2563eb'
};
const borderStyle = type === 'confusion' ? 'dashed' : 'solid';
const color = colors[type] || colors.info;
// Create box
const box = document.createElement('div');
box.className = 'uta-box';
box.style.cssText = [
'position:absolute',
'left:' + x + 'px',
'top:' + y + 'px',
'width:' + width + 'px',
'height:' + height + 'px',
'border:3px ' + borderStyle + ' ' + color,
'border-radius:4px',
'box-sizing:border-box'
].join(';');
// Create label if provided
if (label) {
const labelEl = document.createElement('div');
labelEl.className = 'uta-label';
labelEl.style.cssText = [
'position:absolute',
'top:-26px',
'left:-3px',
'background:' + color,
'color:white',
'padding:4px 8px',
'font-size:12px',
'font-family:system-ui,sans-serif',
'font-weight:500',
'border-radius:4px 4px 0 0',
'white-space:nowrap'
].join(';');
labelEl.textContent = label;
box.appendChild(labelEl);
}
overlay.appendChild(box);
return true;
})(x, y, width, height, type, label);
// Via browser_evaluate with parameters
(function(x, y, width, height, color) {
const overlay = document.getElementById('uta-overlay');
if (!overlay) return false;
const colors = {
yellow: 'rgba(251, 191, 36, 0.4)',
orange: 'rgba(245, 158, 11, 0.3)',
red: 'rgba(220, 38, 38, 0.25)'
};
const highlight = document.createElement('div');
highlight.className = 'uta-highlight';
highlight.style.cssText = [
'position:absolute',
'left:' + x + 'px',
'top:' + y + 'px',
'width:' + width + 'px',
'height:' + height + 'px',
'background:' + (colors[color] || colors.yellow),
'border-radius:2px'
].join(';');
overlay.appendChild(highlight);
return true;
})(x, y, width, height, color);
// Via browser_evaluate with parameters
(function(x, y, number, color) {
const overlay = document.getElementById('uta-overlay');
if (!overlay) return false;
const colors = {
red: '#dc2626',
orange: '#f59e0b',
green: '#16a34a',
blue: '#2563eb'
};
const callout = document.createElement('div');
callout.className = 'uta-callout';
callout.style.cssText = [
'position:absolute',
'left:' + (x - 12) + 'px',
'top:' + (y - 12) + 'px',
'width:24px',
'height:24px',
'background:' + (colors[color] || colors.red),
'color:white',
'border-radius:50%',
'display:flex',
'align-items:center',
'justify-content:center',
'font-size:14px',
'font-weight:bold',
'font-family:system-ui,sans-serif',
'box-shadow:0 2px 4px rgba(0,0,0,0.2)'
].join(';');
callout.textContent = String(number);
overlay.appendChild(callout);
return true;
})(x, y, number, color);
After adding annotations, use browser_take_screenshot to capture the annotated page.
Remove the overlay after taking the screenshot:
// Via browser_evaluate
(function() {
const overlay = document.getElementById('uta-overlay');
if (overlay) overlay.remove();
return true;
})();
browser_snapshot to find the elementbrowser_evaluatebrowser_take_screenshotWhen the testing agent detects an annotation trigger:
Confusion detected:
Error encountered:
Frustration trigger matched:
Task completed:
1. User: "I'm confused about this field"
2. Get position:
browser_evaluate: Get bounding box of the confusing element
3. Create overlay:
browser_evaluate: Create annotation container
4. Add annotation:
browser_evaluate: Add dashed red box at position with label "Confusing"
5. Capture:
browser_take_screenshot: Save as "confusion-form-field.png"
6. Clean up:
browser_evaluate: Remove overlay
7. Report:
"Screenshot saved: confusion-form-field.png - User found this field confusing"
Annotated screenshots should be referenced in the testing report:
## Usability Issues Found
### Critical: Form Submit Button Hard to Find

The submit button (annotated in red) was difficult to locate due to
its placement below the fold and low contrast with the background.