
Visual Testing Advanced
- 135 installs
- 433 repo stars
- Updated August 4, 2026
- proffesor-for-testing/agentic-qe
Perform advanced visual regression and UI consistency testing across breakpoints, themes, and components to catch layout drift before users do.
About
Visual testing advanced skill from agentic-qe that guides agents through screenshot comparison, responsive layout validation, and UI regression analysis to prevent visual defects in web, mobile, and extension frontends.
- Cross-breakpoint visual regression checks
- Theme and component consistency validation
- Screenshot diff and layout drift detection
- Browser and viewport coverage planning
- Actionable UI defect triage output
Visual Testing Advanced by the numbers
- 135 all-time installs (skills.sh)
- +6 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #916 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/proffesor-for-testing/agentic-qe --skill visual-testing-advancedAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 135 |
|---|---|
| repo stars | ★ 433 |
| Last updated | August 4, 2026 |
| Repository | proffesor-for-testing/agentic-qe ↗ |
What it does
Perform advanced visual regression and UI consistency testing across breakpoints, themes, and components to catch layout drift before users do.
Files
Advanced Visual Testing
<default_to_action> When detecting visual regressions or validating UI: 1. CAPTURE baseline screenshots (first run establishes baseline) 2. COMPARE new screenshots against baseline (pixel-by-pixel or AI) 3. MASK dynamic content (timestamps, ads, user counts) 4. TEST across devices (desktop, tablet, mobile viewports) 5. REVIEW and approve intentional changes, fail on regressions
Quick Visual Testing Steps:
- Set up baseline on main branch
- Compare feature branch against baseline
- Mask dynamic elements (timestamps, avatars)
- Use AI-powered comparison to reduce false positives
- Integrate in CI/CD to block visual regressions
Critical Success Factors:
- Functional tests don't catch visual bugs
- AI-powered tools reduce false positives
- Review diffs, don't just auto-approve
</default_to_action>
Quick Reference Card
When to Use
- UI component changes
- CSS/styling modifications
- Responsive design validation
- Cross-browser consistency checks
Visual Bug Types
| Bug Type | Description |
|---|---|
| Layout shift | Elements moved position |
| Color change | Unintended color modification |
| Font rendering | Typography issues |
| Alignment | Spacing/alignment problems |
| Missing images | Broken image paths |
| Overflow | Content clipping |
Comparison Algorithms
| Algorithm | Best For |
|---|---|
| Pixel diff | Exact match requirement |
| Structural similarity | Handle anti-aliasing |
| AI semantic | Ignore insignificant changes |
---
PRIMARY PATH: qe-browser visual-diff
Most visual regression work should go through the `qe-browser` fleet skill. It wraps Vibium (WebDriver BiDi) and provides pixel-diff against stored baselines with threshold enforcement and diff-image output. See .claude/skills/qe-browser/SKILL.md.
# Navigate
vibium go https://example.com
vibium wait load
# First run — creates baseline in .aqe/visual-baselines/homepage.png
node .claude/skills/qe-browser/scripts/visual-diff.js --name homepage
# Subsequent runs — compare, non-zero exit on mismatch
node .claude/skills/qe-browser/scripts/visual-diff.js --name homepage --threshold 0.02
# Scope to a single region
node .claude/skills/qe-browser/scripts/visual-diff.js --name hero --selector "#hero"
# Responsive — run diff at each breakpoint
for viewport in "375 667" "768 1024" "1920 1080"; do
read w h <<< "$viewport"
vibium viewport $w $h
node .claude/skills/qe-browser/scripts/visual-diff.js --name "homepage-${w}x${h}"
done
# Reset baseline after an intentional design change
node .claude/skills/qe-browser/scripts/visual-diff.js --name homepage --update-baselineBaselines live in .aqe/visual-baselines/. The script uses pixelmatch when installed, with a hash-based exact-match fallback otherwise. Non-zero exit when similarity < 1 - threshold, so CI gating is $?-based.
When to keep Playwright visual regression
Use the Playwright recipe below only when you need:
- AI semantic comparison (Percy, Applitools) to ignore insignificant pixel drift
- Cross-browser rendering checks in Firefox/WebKit (Vibium is Chrome-only today)
- Tight integration with an existing Playwright test suite
---
LEGACY: Visual Regression with Playwright (fallback)
import { test, expect } from '@playwright/test';
test('homepage visual regression', async ({ page }) => {
await page.goto('https://example.com');
// Capture and compare screenshot
await expect(page).toHaveScreenshot('homepage.png');
// First run: saves baseline
// Subsequent runs: compares to baseline
});
test('responsive design', async ({ page }) => {
// Mobile viewport
await page.setViewportSize({ width: 375, height: 667 });
await page.goto('https://example.com');
await expect(page).toHaveScreenshot('homepage-mobile.png');
// Tablet viewport
await page.setViewportSize({ width: 768, height: 1024 });
await expect(page).toHaveScreenshot('homepage-tablet.png');
});---
Handling Dynamic Content
test('mask dynamic elements', async ({ page }) => {
await page.goto('https://example.com');
await expect(page).toHaveScreenshot({
mask: [
page.locator('.timestamp'), // Dynamic time
page.locator('.user-count'), // Live counter
page.locator('.advertisement'), // Ads
page.locator('.avatar') // User avatars
]
});
});---
AI-Powered Visual Testing (Percy)
import percySnapshot from '@percy/playwright';
test('AI-powered visual test', async ({ page }) => {
await page.goto('https://example.com');
// Percy uses AI to ignore anti-aliasing, minor font differences
await percySnapshot(page, 'Homepage');
});
test('component visual test', async ({ page }) => {
await page.goto('https://example.com/components');
// Snapshot specific component
const button = page.locator('.primary-button');
await percySnapshot(page, 'Primary Button', {
scope: button
});
});---
Playwright Configuration
// playwright.config.js
export default {
expect: {
toHaveScreenshot: {
maxDiffPixels: 100, // Allow 100 pixel difference
maxDiffPixelRatio: 0.01, // Or 1% of image
threshold: 0.2, // Color similarity threshold
animations: 'disabled', // Disable animations
caret: 'hide' // Hide cursor
}
}
};---
Agent-Driven Visual Testing
// Comprehensive visual regression
await Task("Visual Regression Suite", {
baseline: 'main-branch',
current: 'feature-branch',
pages: ['homepage', 'product', 'checkout'],
devices: ['desktop', 'tablet', 'mobile'],
browsers: ['chrome', 'firefox', 'safari'],
threshold: 0.01
}, "qe-visual-tester");
// Returns:
// {
// comparisons: 27, // 3 pages × 3 devices × 3 browsers
// differences: 2,
// report: 'visual-regression-report.html'
// }---
Agent Coordination Hints
Memory Namespace
aqe/visual-testing/
├── baselines/* - Baseline screenshots
├── comparisons/* - Diff results
├── components/* - Component snapshots
└── reports/* - Visual regression reportsFleet Coordination
const visualFleet = await FleetManager.coordinate({
strategy: 'visual-testing',
agents: [
'qe-visual-tester', // Screenshot comparison
'qe-test-executor', // Cross-browser execution
'qe-quality-gate' // Block on visual regressions
],
topology: 'parallel'
});---
Related Skills
- accessibility-testing - Visual a11y checks
- compatibility-testing - Cross-browser visuals
- regression-testing - Regression suite
---
Remember
Functional tests don't catch visual bugs. Layout shifts, color changes, font rendering, alignment issues - all invisible to functional tests but visible to users.
AI-powered tools reduce false positives. Percy, Applitools use AI to ignore insignificant differences (anti-aliasing, minor font rendering).
With Agents: qe-visual-tester automates visual regression across browsers and devices, uses AI to filter noise, and generates visual diff reports. Catches UI regressions before users see them.
skill: visual-testing-advanced
version: 1.0.0
description: >
Evaluation suite for visual-testing-advanced skill.
Tests advanced visual regression testing with sophisticated diff detection,
region analysis, and cross-viewport consistency verification.
models_to_test:
- claude-sonnet-4-6 # Primary (high accuracy expected)
- claude-haiku-4-5 # Fast model (minimum quality floor)
mcp_integration:
enabled: true
namespace: skill-validation
query_patterns: true
track_outcomes: true
store_patterns: true
share_learning: true
target_agents:
- qe-learning-coordinator
learning:
store_success_patterns: true
pattern_ttl_days: 90
min_confidence_to_store: 0.7
result_format:
json_output: true
include_timing: true
setup:
required_tools:
- jq
environment_variables:
VISUAL_DIFF_THRESHOLD: "0.05"
MIN_REGION_SIZE: "10"
test_cases:
- id: tc001_visual_diff_detection
description: "Visual differences are correctly detected"
category: core
priority: critical
input:
baselineImage: "baseline.png"
actualImage: "actual.png"
context:
diffThreshold: 0.05
expected_output:
must_contain:
- "diff"
- "detected"
must_not_contain:
- "error"
validation:
schema_check: true
keyword_match_threshold: 0.8
- id: tc002_region_analysis
description: "Changed regions are identified and analyzed"
category: core
priority: critical
input:
compareImages: true
analyzeRegions: true
context:
regionMinSize: 10
expected_output:
must_contain:
- "region"
- "change"
validation:
schema_check: true
- id: tc003_cross_viewport_consistency
description: "Visual consistency is verified across viewports"
category: core
priority: high
input:
viewports:
- "1920x1080"
- "1024x768"
- "375x667"
context:
compareAcrossViewports: true
expected_output:
must_contain:
- "viewport"
- "consistent"
validation:
schema_check: true
allow_partial: true
- id: tc004_diff_percentage_calculation
description: "Diff percentage is accurately calculated"
category: core
priority: high
input:
totalPixels: 1000000
changedPixels: 5000
context:
calculateDiffPercentage: true
expected_output:
must_contain:
- "0.5"
validation:
schema_check: true
allow_partial: true
- id: tc005_responsive_design_validation
description: "Responsive design changes are properly validated"
category: core
priority: high
input:
pages:
- "homepage"
- "product-page"
viewports: ["desktop", "tablet", "mobile"]
context:
validateResponsive: true
expected_output:
must_contain:
- "responsive"
- "layout"
validation:
schema_check: true
allow_partial: true
success_criteria:
pass_rate: 0.8
critical_pass_rate: 1.0
avg_reasoning_quality: 0.7
max_execution_time_ms: 300000
cross_model_variance: 0.15
metadata:
author: "qe-visual-specialist"
created: "2026-02-02"
last_updated: "2026-02-02"
coverage_target: "Diff detection, region analysis, viewport consistency, responsive design, pixel-level accuracy"
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://agentic-qe.dev/schemas/visual-testing-advanced-output.json",
"title": "AQE Visual Testing Advanced Skill Output Schema",
"description": "Schema for advanced visual regression testing output including pixel comparison, AI-powered diff analysis, and cross-browser visual consistency.",
"type": "object",
"required": ["skillName", "version", "timestamp", "status", "trustTier", "output"],
"properties": {
"skillName": {
"type": "string",
"const": "visual-testing-advanced",
"description": "Skill identifier"
},
"version": {
"type": "string",
"pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9]+)?$"
},
"timestamp": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?$"
},
"status": {
"type": "string",
"enum": ["success", "partial", "failed", "skipped"]
},
"trustTier": {
"type": "integer",
"const": 3
},
"output": {
"type": "object",
"required": ["summary", "comparisons", "regressionStatus", "metrics"],
"properties": {
"summary": {
"type": "string",
"minLength": 10,
"maxLength": 2000
},
"score": {
"$ref": "#/$defs/visualScore"
},
"comparisons": {
"type": "array",
"items": {
"$ref": "#/$defs/visualComparison"
},
"minItems": 1,
"description": "Visual comparison results"
},
"regressionStatus": {
"$ref": "#/$defs/regressionStatus",
"description": "Overall visual regression status"
},
"baselineInfo": {
"$ref": "#/$defs/baselineInfo",
"description": "Baseline screenshot information"
},
"responsiveResults": {
"type": "array",
"items": {
"$ref": "#/$defs/responsiveResult"
},
"description": "Results by viewport size"
},
"componentResults": {
"type": "array",
"items": {
"$ref": "#/$defs/componentResult"
},
"description": "Component-level visual results"
},
"findings": {
"type": "array",
"items": {
"$ref": "#/$defs/visualFinding"
},
"maxItems": 500
},
"recommendations": {
"type": "array",
"items": {
"$ref": "#/$defs/recommendation"
},
"maxItems": 100
},
"metrics": {
"$ref": "#/$defs/visualMetrics"
},
"artifacts": {
"type": "array",
"items": {
"$ref": "#/$defs/artifact"
},
"maxItems": 200
}
}
},
"metadata": {
"type": "object",
"properties": {
"executionTimeMs": { "type": "integer", "minimum": 0 },
"toolsUsed": {
"type": "array",
"items": {
"type": "string",
"enum": ["playwright", "percy", "applitools", "backstopjs", "chromatic", "reg-suit"]
}
},
"agentId": { "type": "string", "pattern": "^qe-[a-z][a-z0-9-]*$" },
"targetUrl": { "type": "string" },
"baselineBranch": { "type": "string" },
"comparisonBranch": { "type": "string" }
}
},
"validation": {
"type": "object",
"properties": {
"schemaValid": { "type": "boolean" },
"contentValid": { "type": "boolean" },
"confidence": { "type": "number", "minimum": 0, "maximum": 1 }
}
},
"learning": {
"type": "object",
"properties": {
"patternsDetected": { "type": "array", "items": { "type": "string" } },
"reward": { "type": "number", "minimum": 0, "maximum": 1 }
}
}
},
"$defs": {
"visualScore": {
"type": "object",
"required": ["value", "max"],
"properties": {
"value": { "type": "number", "minimum": 0, "maximum": 100 },
"max": { "type": "number", "const": 100 },
"grade": { "type": "string", "pattern": "^[A-F][+-]?$" },
"visualConsistency": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Visual consistency score"
}
}
},
"visualComparison": {
"type": "object",
"required": ["page", "status"],
"properties": {
"page": { "type": "string", "description": "Page or component name" },
"url": { "type": "string" },
"status": {
"type": "string",
"enum": ["passed", "failed", "new", "updated", "skipped"]
},
"diffPercent": {
"type": "number",
"minimum": 0,
"maximum": 100,
"description": "Difference percentage"
},
"diffPixels": { "type": "integer", "minimum": 0 },
"threshold": { "type": "number", "minimum": 0, "maximum": 100 },
"viewport": {
"type": "object",
"properties": {
"width": { "type": "integer" },
"height": { "type": "integer" }
}
},
"browser": { "type": "string" },
"baselineScreenshot": { "type": "string" },
"actualScreenshot": { "type": "string" },
"diffScreenshot": { "type": "string" },
"comparisonAlgorithm": {
"type": "string",
"enum": ["pixel-diff", "structural-similarity", "ai-semantic", "perceptual-hash"]
},
"maskedRegions": {
"type": "array",
"items": {
"$ref": "#/$defs/maskedRegion"
}
}
}
},
"maskedRegion": {
"type": "object",
"properties": {
"selector": { "type": "string" },
"reason": { "type": "string", "enum": ["dynamic-content", "timestamp", "ad", "user-data", "animation"] }
}
},
"regressionStatus": {
"type": "object",
"properties": {
"hasRegressions": { "type": "boolean" },
"regressionCount": { "type": "integer", "minimum": 0 },
"newScreenshots": { "type": "integer", "minimum": 0 },
"updatedBaselines": { "type": "integer", "minimum": 0 },
"requiresReview": { "type": "boolean" }
}
},
"baselineInfo": {
"type": "object",
"properties": {
"branch": { "type": "string" },
"commit": { "type": "string" },
"createdAt": { "type": "string" },
"screenshotCount": { "type": "integer", "minimum": 0 }
}
},
"responsiveResult": {
"type": "object",
"required": ["viewport", "status"],
"properties": {
"viewport": {
"type": "string",
"enum": ["mobile", "tablet", "desktop", "large-desktop"]
},
"width": { "type": "integer" },
"status": { "type": "string", "enum": ["passed", "failed", "partial"] },
"comparisonCount": { "type": "integer" },
"regressionCount": { "type": "integer" }
}
},
"componentResult": {
"type": "object",
"required": ["component", "status"],
"properties": {
"component": { "type": "string" },
"selector": { "type": "string" },
"status": { "type": "string", "enum": ["passed", "failed", "new"] },
"diffPercent": { "type": "number" },
"screenshotPath": { "type": "string" }
}
},
"visualFinding": {
"type": "object",
"required": ["id", "title", "severity", "category"],
"properties": {
"id": { "type": "string", "pattern": "^VIS-\\d{3,6}$" },
"title": { "type": "string", "minLength": 5, "maxLength": 200 },
"description": { "type": "string", "maxLength": 2000 },
"severity": { "type": "string", "enum": ["critical", "high", "medium", "low", "info"] },
"category": {
"type": "string",
"enum": ["layout-shift", "color-change", "font-rendering", "alignment", "missing-element", "overflow", "responsive", "animation"]
},
"page": { "type": "string" },
"viewport": { "type": "string" },
"browser": { "type": "string" },
"diffPercent": { "type": "number" },
"screenshotEvidence": { "type": "string" },
"remediation": { "type": "string" }
}
},
"visualMetrics": {
"type": "object",
"properties": {
"totalComparisons": { "type": "integer", "minimum": 0 },
"passed": { "type": "integer", "minimum": 0 },
"failed": { "type": "integer", "minimum": 0 },
"new": { "type": "integer", "minimum": 0 },
"passRate": { "type": "number", "minimum": 0, "maximum": 100 },
"avgDiffPercent": { "type": "number", "minimum": 0, "maximum": 100 },
"viewportsCovered": { "type": "integer", "minimum": 0 },
"browsersCovered": { "type": "integer", "minimum": 0 },
"componentsCovered": { "type": "integer", "minimum": 0 },
"executionTimeMs": { "type": "integer", "minimum": 0 }
}
},
"recommendation": {
"type": "object",
"required": ["id", "title", "priority"],
"properties": {
"id": { "type": "string", "pattern": "^REC-\\d{3,6}$" },
"title": { "type": "string" },
"description": { "type": "string" },
"priority": { "type": "string", "enum": ["critical", "high", "medium", "low"] }
}
},
"artifact": {
"type": "object",
"required": ["type", "path"],
"properties": {
"type": { "type": "string", "enum": ["baseline", "actual", "diff", "report", "video"] },
"path": { "type": "string" },
"format": { "type": "string", "enum": ["png", "jpg", "webp", "html", "json", "webm"] }
}
}
}
}
{
"skillName": "visual-testing-advanced",
"skillVersion": "1.0.0",
"requiredTools": [
"jq"
],
"optionalTools": [
"imagemagick",
"playwright",
"ajv",
"jsonschema",
"python3"
],
"schemaPath": "schemas/output.json",
"requiredFields": [
"skillName",
"status",
"output"
],
"requiredNonEmptyFields": [],
"mustContainTerms": [
"visual",
"test",
"diff"
],
"mustNotContainTerms": [
"TODO",
"placeholder"
],
"enumValidations": {
".status": [
"success",
"partial",
"failed",
"skipped"
]
}
}