cbrowser 7.2.0 → 7.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analysis/bug-hunter.d.ts +32 -0
- package/dist/analysis/bug-hunter.d.ts.map +1 -0
- package/dist/analysis/bug-hunter.js +106 -0
- package/dist/analysis/bug-hunter.js.map +1 -0
- package/dist/analysis/chaos-testing.d.ts +41 -0
- package/dist/analysis/chaos-testing.d.ts.map +1 -0
- package/dist/analysis/chaos-testing.js +87 -0
- package/dist/analysis/chaos-testing.js.map +1 -0
- package/dist/analysis/index.d.ts +10 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +26 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/natural-language.d.ts +43 -0
- package/dist/analysis/natural-language.d.ts.map +1 -0
- package/dist/analysis/natural-language.js +205 -0
- package/dist/analysis/natural-language.js.map +1 -0
- package/dist/analysis/persona-comparison.d.ts +31 -0
- package/dist/analysis/persona-comparison.d.ts.map +1 -0
- package/dist/analysis/persona-comparison.js +217 -0
- package/dist/analysis/persona-comparison.js.map +1 -0
- package/dist/browser.d.ts +1 -395
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +0 -4388
- package/dist/browser.js.map +1 -1
- package/dist/cli.js +198 -55
- package/dist/cli.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +2 -1
- package/dist/daemon.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/performance/index.d.ts +7 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +23 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/performance/metrics.d.ts +49 -0
- package/dist/performance/metrics.d.ts.map +1 -0
- package/dist/performance/metrics.js +386 -0
- package/dist/performance/metrics.js.map +1 -0
- package/dist/testing/coverage.d.ts +39 -0
- package/dist/testing/coverage.d.ts.map +1 -0
- package/dist/testing/coverage.js +713 -0
- package/dist/testing/coverage.js.map +1 -0
- package/dist/testing/flaky-detection.d.ts +28 -0
- package/dist/testing/flaky-detection.d.ts.map +1 -0
- package/dist/testing/flaky-detection.js +332 -0
- package/dist/testing/flaky-detection.js.map +1 -0
- package/dist/testing/index.d.ts +10 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +26 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/nl-test-suite.d.ts +70 -0
- package/dist/testing/nl-test-suite.d.ts.map +1 -0
- package/dist/testing/nl-test-suite.js +427 -0
- package/dist/testing/nl-test-suite.js.map +1 -0
- package/dist/testing/test-repair.d.ts +36 -0
- package/dist/testing/test-repair.d.ts.map +1 -0
- package/dist/testing/test-repair.js +528 -0
- package/dist/testing/test-repair.js.map +1 -0
- package/dist/types.d.ts +125 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/visual/ab-comparison.d.ts +23 -0
- package/dist/visual/ab-comparison.d.ts.map +1 -0
- package/dist/visual/ab-comparison.js +366 -0
- package/dist/visual/ab-comparison.js.map +1 -0
- package/dist/visual/cross-browser.d.ts +41 -0
- package/dist/visual/cross-browser.d.ts.map +1 -0
- package/dist/visual/cross-browser.js +442 -0
- package/dist/visual/cross-browser.js.map +1 -0
- package/dist/visual/index.d.ts +10 -0
- package/dist/visual/index.d.ts.map +1 -0
- package/dist/visual/index.js +26 -0
- package/dist/visual/index.js.map +1 -0
- package/dist/visual/regression.d.ts +55 -0
- package/dist/visual/regression.d.ts.map +1 -0
- package/dist/visual/regression.js +616 -0
- package/dist/visual/regression.js.map +1 -0
- package/dist/visual/responsive.d.ts +27 -0
- package/dist/visual/responsive.d.ts.map +1 -0
- package/dist/visual/responsive.js +450 -0
- package/dist/visual/responsive.js.map +1 -0
- package/package.json +32 -3
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Responsive Visual Testing (v7.2.0)
|
|
3
|
+
*
|
|
4
|
+
* Test how pages render across different viewport sizes.
|
|
5
|
+
*/
|
|
6
|
+
import type { ViewportPreset, ResponsiveTestResult, ResponsiveTestOptions, ResponsiveSuite, ResponsiveSuiteResult } from "../types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Run responsive visual test for a single URL
|
|
9
|
+
*/
|
|
10
|
+
export declare function runResponsiveTest(url: string, options?: ResponsiveTestOptions): Promise<ResponsiveTestResult>;
|
|
11
|
+
/**
|
|
12
|
+
* Run responsive test suite for multiple URLs
|
|
13
|
+
*/
|
|
14
|
+
export declare function runResponsiveSuite(suite: ResponsiveSuite): Promise<ResponsiveSuiteResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Format responsive test result as console report
|
|
17
|
+
*/
|
|
18
|
+
export declare function formatResponsiveReport(result: ResponsiveTestResult): string;
|
|
19
|
+
/**
|
|
20
|
+
* Generate HTML report for responsive test suite
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateResponsiveHtmlReport(suiteResult: ResponsiveSuiteResult): string;
|
|
23
|
+
/**
|
|
24
|
+
* List available viewport presets
|
|
25
|
+
*/
|
|
26
|
+
export declare function listViewportPresets(): ViewportPreset[];
|
|
27
|
+
//# sourceMappingURL=responsive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responsive.d.ts","sourceRoot":"","sources":["../../src/visual/responsive.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EACV,cAAc,EAId,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAqJrB;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CA0G/B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAwC/F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CA+D3E;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,qBAAqB,GAAG,MAAM,CA6GvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,EAAE,CAEtD"}
|
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Responsive Visual Testing (v7.2.0)
|
|
4
|
+
*
|
|
5
|
+
* Test how pages render across different viewport sizes.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.runResponsiveTest = runResponsiveTest;
|
|
9
|
+
exports.runResponsiveSuite = runResponsiveSuite;
|
|
10
|
+
exports.formatResponsiveReport = formatResponsiveReport;
|
|
11
|
+
exports.generateResponsiveHtmlReport = generateResponsiveHtmlReport;
|
|
12
|
+
exports.listViewportPresets = listViewportPresets;
|
|
13
|
+
const fs_1 = require("fs");
|
|
14
|
+
const path_1 = require("path");
|
|
15
|
+
const browser_js_1 = require("../browser.js");
|
|
16
|
+
const types_js_1 = require("../types.js");
|
|
17
|
+
const regression_js_1 = require("./regression.js");
|
|
18
|
+
/**
|
|
19
|
+
* Get viewport presets by name or return custom preset
|
|
20
|
+
*/
|
|
21
|
+
function resolveViewports(viewports) {
|
|
22
|
+
if (!viewports || viewports.length === 0) {
|
|
23
|
+
// Default: mobile, tablet, desktop
|
|
24
|
+
return types_js_1.VIEWPORT_PRESETS.filter(v => v.name === "mobile" || v.name === "tablet" || v.name === "desktop");
|
|
25
|
+
}
|
|
26
|
+
return viewports.map(v => {
|
|
27
|
+
if (typeof v === "string") {
|
|
28
|
+
const preset = types_js_1.VIEWPORT_PRESETS.find(p => p.name === v);
|
|
29
|
+
if (!preset) {
|
|
30
|
+
throw new Error(`Unknown viewport preset: ${v}. Available: ${types_js_1.VIEWPORT_PRESETS.map(p => p.name).join(", ")}`);
|
|
31
|
+
}
|
|
32
|
+
return preset;
|
|
33
|
+
}
|
|
34
|
+
return v;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get the path for responsive testing screenshots
|
|
39
|
+
*/
|
|
40
|
+
function getResponsiveScreenshotsPath() {
|
|
41
|
+
const basePath = process.cwd();
|
|
42
|
+
const screenshotsPath = (0, path_1.join)(basePath, ".cbrowser", "responsive");
|
|
43
|
+
if (!(0, fs_1.existsSync)(screenshotsPath)) {
|
|
44
|
+
(0, fs_1.mkdirSync)(screenshotsPath, { recursive: true });
|
|
45
|
+
}
|
|
46
|
+
return screenshotsPath;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Capture screenshot at a specific viewport
|
|
50
|
+
*/
|
|
51
|
+
async function captureAtViewport(url, viewport, options = {}) {
|
|
52
|
+
const startTime = Date.now();
|
|
53
|
+
const browser = new browser_js_1.CBrowser({
|
|
54
|
+
viewportWidth: viewport.width,
|
|
55
|
+
viewportHeight: viewport.height,
|
|
56
|
+
});
|
|
57
|
+
try {
|
|
58
|
+
await browser.launch();
|
|
59
|
+
const page = await browser.getPage();
|
|
60
|
+
// Set mobile emulation if needed
|
|
61
|
+
if (viewport.isMobile || viewport.hasTouch) {
|
|
62
|
+
await page.emulateMedia({ reducedMotion: "reduce" });
|
|
63
|
+
}
|
|
64
|
+
await browser.navigate(url);
|
|
65
|
+
// Wait if specified
|
|
66
|
+
if (options.waitForSelector) {
|
|
67
|
+
await page.waitForSelector(options.waitForSelector, { timeout: 10000 }).catch(() => { });
|
|
68
|
+
}
|
|
69
|
+
if (options.waitBeforeCapture) {
|
|
70
|
+
await new Promise(resolve => setTimeout(resolve, options.waitBeforeCapture));
|
|
71
|
+
}
|
|
72
|
+
// Take screenshot
|
|
73
|
+
const screenshotsPath = getResponsiveScreenshotsPath();
|
|
74
|
+
const filename = `${viewport.name}-${Date.now()}.png`;
|
|
75
|
+
const screenshotPath = (0, path_1.join)(screenshotsPath, filename);
|
|
76
|
+
await page.screenshot({ path: screenshotPath, fullPage: false });
|
|
77
|
+
return {
|
|
78
|
+
viewport,
|
|
79
|
+
screenshotPath,
|
|
80
|
+
timestamp: new Date().toISOString(),
|
|
81
|
+
captureTime: Date.now() - startTime,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
await browser.close();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Analyze responsive issues from comparisons
|
|
90
|
+
*/
|
|
91
|
+
function analyzeResponsiveIssues(comparisons, screenshots) {
|
|
92
|
+
const issues = [];
|
|
93
|
+
for (const comparison of comparisons) {
|
|
94
|
+
if (comparison.analysis.overallStatus !== "pass") {
|
|
95
|
+
const changes = comparison.analysis.changes || [];
|
|
96
|
+
for (const change of changes) {
|
|
97
|
+
let issueType = "other";
|
|
98
|
+
const desc = change.description.toLowerCase();
|
|
99
|
+
if (desc.includes("overflow") || desc.includes("scroll")) {
|
|
100
|
+
issueType = "overflow";
|
|
101
|
+
}
|
|
102
|
+
else if (desc.includes("truncat") || desc.includes("cut off")) {
|
|
103
|
+
issueType = "truncation";
|
|
104
|
+
}
|
|
105
|
+
else if (desc.includes("overlap")) {
|
|
106
|
+
issueType = "overlap";
|
|
107
|
+
}
|
|
108
|
+
else if (desc.includes("hidden") || desc.includes("disappear")) {
|
|
109
|
+
issueType = "hidden_content";
|
|
110
|
+
}
|
|
111
|
+
else if (desc.includes("text") && (desc.includes("small") || desc.includes("read"))) {
|
|
112
|
+
issueType = "unreadable_text";
|
|
113
|
+
}
|
|
114
|
+
else if (desc.includes("layout") || desc.includes("break") || desc.includes("shift")) {
|
|
115
|
+
issueType = "layout_break";
|
|
116
|
+
}
|
|
117
|
+
// Map VisualChange severity to ResponsiveIssue severity
|
|
118
|
+
const severityMap = {
|
|
119
|
+
breaking: "critical",
|
|
120
|
+
warning: "major",
|
|
121
|
+
info: "minor",
|
|
122
|
+
acceptable: "minor",
|
|
123
|
+
};
|
|
124
|
+
issues.push({
|
|
125
|
+
type: issueType,
|
|
126
|
+
severity: severityMap[change.severity] || "minor",
|
|
127
|
+
description: change.description,
|
|
128
|
+
affectedViewports: [comparison.viewportA.name, comparison.viewportB.name],
|
|
129
|
+
breakpointRange: {
|
|
130
|
+
min: Math.min(comparison.viewportA.width, comparison.viewportB.width),
|
|
131
|
+
max: Math.max(comparison.viewportA.width, comparison.viewportB.width),
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return issues;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Run responsive visual test for a single URL
|
|
141
|
+
*/
|
|
142
|
+
async function runResponsiveTest(url, options = {}) {
|
|
143
|
+
const startTime = Date.now();
|
|
144
|
+
const viewports = resolveViewports(options.viewports);
|
|
145
|
+
console.log(`\n📱 Responsive Visual Test`);
|
|
146
|
+
console.log(` URL: ${url}`);
|
|
147
|
+
console.log(` Viewports: ${viewports.map(v => v.name).join(", ")}\n`);
|
|
148
|
+
// Capture screenshots at each viewport
|
|
149
|
+
const screenshots = [];
|
|
150
|
+
for (const viewport of viewports) {
|
|
151
|
+
console.log(` 📸 Capturing ${viewport.name} (${viewport.width}x${viewport.height})...`);
|
|
152
|
+
try {
|
|
153
|
+
const screenshot = await captureAtViewport(url, viewport, options);
|
|
154
|
+
screenshots.push(screenshot);
|
|
155
|
+
console.log(` ✅ Captured in ${screenshot.captureTime}ms`);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
console.log(` ❌ Failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (screenshots.length < 2) {
|
|
162
|
+
return {
|
|
163
|
+
url,
|
|
164
|
+
screenshots,
|
|
165
|
+
comparisons: [],
|
|
166
|
+
issues: [],
|
|
167
|
+
overallStatus: "major_issues",
|
|
168
|
+
summary: "Could not capture enough screenshots for comparison",
|
|
169
|
+
problematicViewports: [],
|
|
170
|
+
duration: Date.now() - startTime,
|
|
171
|
+
timestamp: new Date().toISOString(),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
// Compare adjacent viewport sizes (small to large)
|
|
175
|
+
const sortedScreenshots = [...screenshots].sort((a, b) => a.viewport.width - b.viewport.width);
|
|
176
|
+
const comparisons = [];
|
|
177
|
+
let hasMinorIssues = false;
|
|
178
|
+
let hasMajorIssues = false;
|
|
179
|
+
const problematicViewports = new Set();
|
|
180
|
+
console.log(`\n 🔍 Comparing viewports...`);
|
|
181
|
+
for (let i = 0; i < sortedScreenshots.length - 1; i++) {
|
|
182
|
+
const a = sortedScreenshots[i];
|
|
183
|
+
const b = sortedScreenshots[i + 1];
|
|
184
|
+
console.log(` ${a.viewport.name} → ${b.viewport.name}...`);
|
|
185
|
+
const analysis = await (0, regression_js_1.analyzeVisualDifferences)(a.screenshotPath, b.screenshotPath, { sensitivity: options.sensitivity || "medium" });
|
|
186
|
+
comparisons.push({
|
|
187
|
+
viewportA: a.viewport,
|
|
188
|
+
viewportB: b.viewport,
|
|
189
|
+
analysis,
|
|
190
|
+
screenshots: {
|
|
191
|
+
a: a.screenshotPath,
|
|
192
|
+
b: b.screenshotPath,
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
if (analysis.overallStatus === "fail") {
|
|
196
|
+
hasMajorIssues = true;
|
|
197
|
+
problematicViewports.add(a.viewport.name);
|
|
198
|
+
problematicViewports.add(b.viewport.name);
|
|
199
|
+
console.log(` ❌ Major issues (${(analysis.similarityScore * 100).toFixed(1)}%)`);
|
|
200
|
+
}
|
|
201
|
+
else if (analysis.overallStatus === "warning") {
|
|
202
|
+
hasMinorIssues = true;
|
|
203
|
+
console.log(` ⚠️ Minor issues (${(analysis.similarityScore * 100).toFixed(1)}%)`);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
console.log(` ✅ Responsive (${(analysis.similarityScore * 100).toFixed(1)}%)`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Analyze issues
|
|
210
|
+
const issues = analyzeResponsiveIssues(comparisons, screenshots);
|
|
211
|
+
const overallStatus = hasMajorIssues
|
|
212
|
+
? "major_issues"
|
|
213
|
+
: hasMinorIssues
|
|
214
|
+
? "minor_issues"
|
|
215
|
+
: "responsive";
|
|
216
|
+
const summary = overallStatus === "responsive"
|
|
217
|
+
? "Page is fully responsive across all tested viewports"
|
|
218
|
+
: overallStatus === "minor_issues"
|
|
219
|
+
? "Minor responsive issues detected"
|
|
220
|
+
: "Significant responsive issues detected";
|
|
221
|
+
return {
|
|
222
|
+
url,
|
|
223
|
+
screenshots,
|
|
224
|
+
comparisons,
|
|
225
|
+
issues,
|
|
226
|
+
overallStatus,
|
|
227
|
+
summary,
|
|
228
|
+
problematicViewports: Array.from(problematicViewports),
|
|
229
|
+
duration: Date.now() - startTime,
|
|
230
|
+
timestamp: new Date().toISOString(),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Run responsive test suite for multiple URLs
|
|
235
|
+
*/
|
|
236
|
+
async function runResponsiveSuite(suite) {
|
|
237
|
+
const startTime = Date.now();
|
|
238
|
+
const results = [];
|
|
239
|
+
console.log(`\n📱 Responsive Test Suite: ${suite.name}`);
|
|
240
|
+
console.log(` Testing ${suite.urls.length} URLs\n`);
|
|
241
|
+
for (const url of suite.urls) {
|
|
242
|
+
const result = await runResponsiveTest(url, suite.options);
|
|
243
|
+
results.push(result);
|
|
244
|
+
}
|
|
245
|
+
// Aggregate common issues
|
|
246
|
+
const issueMap = new Map();
|
|
247
|
+
for (const result of results) {
|
|
248
|
+
for (const issue of result.issues) {
|
|
249
|
+
const key = `${issue.type}-${issue.description}`;
|
|
250
|
+
if (issueMap.has(key)) {
|
|
251
|
+
const existing = issueMap.get(key);
|
|
252
|
+
existing.affectedViewports = [...new Set([...existing.affectedViewports, ...issue.affectedViewports])];
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
issueMap.set(key, { ...issue });
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
suite,
|
|
261
|
+
results,
|
|
262
|
+
summary: {
|
|
263
|
+
total: results.length,
|
|
264
|
+
responsive: results.filter(r => r.overallStatus === "responsive").length,
|
|
265
|
+
minorIssues: results.filter(r => r.overallStatus === "minor_issues").length,
|
|
266
|
+
majorIssues: results.filter(r => r.overallStatus === "major_issues").length,
|
|
267
|
+
totalIssues: results.reduce((sum, r) => sum + r.issues.length, 0),
|
|
268
|
+
},
|
|
269
|
+
commonIssues: Array.from(issueMap.values()),
|
|
270
|
+
duration: Date.now() - startTime,
|
|
271
|
+
timestamp: new Date().toISOString(),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Format responsive test result as console report
|
|
276
|
+
*/
|
|
277
|
+
function formatResponsiveReport(result) {
|
|
278
|
+
const lines = [];
|
|
279
|
+
const duration = (result.duration / 1000).toFixed(2);
|
|
280
|
+
lines.push(`╔${"═".repeat(78)}╗`);
|
|
281
|
+
lines.push(`║${" ".repeat(20)}RESPONSIVE VISUAL TEST REPORT${" ".repeat(29)}║`);
|
|
282
|
+
lines.push(`╚${"═".repeat(78)}╝`);
|
|
283
|
+
lines.push("");
|
|
284
|
+
const statusIcon = result.overallStatus === "responsive" ? "✅" : result.overallStatus === "minor_issues" ? "⚠️" : "❌";
|
|
285
|
+
const statusText = result.overallStatus.toUpperCase().replace("_", " ");
|
|
286
|
+
lines.push(`${statusIcon} Status: ${statusText}`);
|
|
287
|
+
lines.push(`🔗 URL: ${result.url}`);
|
|
288
|
+
lines.push(`⏱️ Duration: ${duration}s`);
|
|
289
|
+
lines.push("");
|
|
290
|
+
lines.push("─".repeat(79));
|
|
291
|
+
lines.push("📸 VIEWPORT SCREENSHOTS");
|
|
292
|
+
lines.push("─".repeat(79));
|
|
293
|
+
for (const screenshot of result.screenshots) {
|
|
294
|
+
const v = screenshot.viewport;
|
|
295
|
+
lines.push(` ${v.name.toUpperCase()} (${v.deviceType})`);
|
|
296
|
+
lines.push(` Dimensions: ${v.width}x${v.height}`);
|
|
297
|
+
if (v.deviceName)
|
|
298
|
+
lines.push(` Device: ${v.deviceName}`);
|
|
299
|
+
lines.push(` Capture time: ${screenshot.captureTime}ms`);
|
|
300
|
+
lines.push(` Path: ${screenshot.screenshotPath}`);
|
|
301
|
+
lines.push("");
|
|
302
|
+
}
|
|
303
|
+
lines.push("─".repeat(79));
|
|
304
|
+
lines.push("🔍 VIEWPORT COMPARISONS");
|
|
305
|
+
lines.push("─".repeat(79));
|
|
306
|
+
for (const comparison of result.comparisons) {
|
|
307
|
+
const icon = comparison.analysis.overallStatus === "pass" ? "✅" : comparison.analysis.overallStatus === "warning" ? "⚠️" : "❌";
|
|
308
|
+
lines.push(` ${comparison.viewportA.name} → ${comparison.viewportB.name}: ${icon}`);
|
|
309
|
+
lines.push(` Similarity: ${(comparison.analysis.similarityScore * 100).toFixed(1)}%`);
|
|
310
|
+
lines.push(` ${comparison.analysis.summary}`);
|
|
311
|
+
lines.push("");
|
|
312
|
+
}
|
|
313
|
+
if (result.issues.length > 0) {
|
|
314
|
+
lines.push("─".repeat(79));
|
|
315
|
+
lines.push("⚠️ RESPONSIVE ISSUES DETECTED");
|
|
316
|
+
lines.push("─".repeat(79));
|
|
317
|
+
for (const issue of result.issues) {
|
|
318
|
+
const severityIcon = issue.severity === "critical" ? "🔴" : issue.severity === "major" ? "🟠" : "🟡";
|
|
319
|
+
lines.push(` ${severityIcon} [${issue.type.toUpperCase()}] ${issue.description}`);
|
|
320
|
+
lines.push(` Affected: ${issue.affectedViewports.join(", ")}`);
|
|
321
|
+
if (issue.breakpointRange) {
|
|
322
|
+
lines.push(` Breakpoint range: ${issue.breakpointRange.min}px - ${issue.breakpointRange.max}px`);
|
|
323
|
+
}
|
|
324
|
+
lines.push("");
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
lines.push("─".repeat(79));
|
|
328
|
+
lines.push(`📝 SUMMARY: ${result.summary}`);
|
|
329
|
+
lines.push("─".repeat(79));
|
|
330
|
+
return lines.join("\n");
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Generate HTML report for responsive test suite
|
|
334
|
+
*/
|
|
335
|
+
function generateResponsiveHtmlReport(suiteResult) {
|
|
336
|
+
const { suite, results, summary, duration } = suiteResult;
|
|
337
|
+
return `<!DOCTYPE html>
|
|
338
|
+
<html>
|
|
339
|
+
<head>
|
|
340
|
+
<title>Responsive Test Report - ${suite.name}</title>
|
|
341
|
+
<style>
|
|
342
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
343
|
+
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #0f172a; color: #e2e8f0; line-height: 1.6; }
|
|
344
|
+
.container { max-width: 1200px; margin: 0 auto; padding: 2rem; }
|
|
345
|
+
header { text-align: center; margin-bottom: 2rem; }
|
|
346
|
+
h1 { font-size: 2rem; margin-bottom: 0.5rem; background: linear-gradient(135deg, #8b5cf6, #06b6d4); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
|
|
347
|
+
.subtitle { color: #94a3b8; }
|
|
348
|
+
.summary-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; margin-bottom: 2rem; }
|
|
349
|
+
.summary-card { background: #1e293b; border-radius: 0.5rem; padding: 1.5rem; text-align: center; }
|
|
350
|
+
.summary-value { font-size: 2rem; font-weight: bold; }
|
|
351
|
+
.summary-label { color: #94a3b8; font-size: 0.875rem; }
|
|
352
|
+
.responsive { color: #22c55e; }
|
|
353
|
+
.minor { color: #f59e0b; }
|
|
354
|
+
.major { color: #ef4444; }
|
|
355
|
+
.result-card { background: #1e293b; border-radius: 0.5rem; padding: 1.5rem; margin-bottom: 1rem; }
|
|
356
|
+
.result-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; }
|
|
357
|
+
.badge { padding: 0.25rem 0.75rem; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; }
|
|
358
|
+
.badge-responsive { background: rgba(34, 197, 94, 0.2); color: #22c55e; }
|
|
359
|
+
.badge-minor { background: rgba(245, 158, 11, 0.2); color: #f59e0b; }
|
|
360
|
+
.badge-major { background: rgba(239, 68, 68, 0.2); color: #ef4444; }
|
|
361
|
+
.viewport-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 0.5rem; margin-top: 1rem; }
|
|
362
|
+
.viewport-item { background: #0f172a; padding: 0.75rem; border-radius: 0.375rem; font-size: 0.875rem; }
|
|
363
|
+
.viewport-name { font-weight: 600; color: #8b5cf6; }
|
|
364
|
+
.issue { background: #0f172a; padding: 0.75rem; border-radius: 0.375rem; margin-top: 0.5rem; border-left: 3px solid; }
|
|
365
|
+
.issue-critical { border-color: #ef4444; }
|
|
366
|
+
.issue-major { border-color: #f59e0b; }
|
|
367
|
+
.issue-minor { border-color: #22c55e; }
|
|
368
|
+
footer { text-align: center; color: #64748b; padding: 2rem 0; font-size: 0.875rem; }
|
|
369
|
+
</style>
|
|
370
|
+
</head>
|
|
371
|
+
<body>
|
|
372
|
+
<div class="container">
|
|
373
|
+
<header>
|
|
374
|
+
<h1>📱 Responsive Test Report</h1>
|
|
375
|
+
<p class="subtitle">${suite.name}</p>
|
|
376
|
+
</header>
|
|
377
|
+
|
|
378
|
+
<div class="summary-grid">
|
|
379
|
+
<div class="summary-card">
|
|
380
|
+
<div class="summary-value">${summary.total}</div>
|
|
381
|
+
<div class="summary-label">Total URLs</div>
|
|
382
|
+
</div>
|
|
383
|
+
<div class="summary-card">
|
|
384
|
+
<div class="summary-value responsive">${summary.responsive}</div>
|
|
385
|
+
<div class="summary-label">Fully Responsive</div>
|
|
386
|
+
</div>
|
|
387
|
+
<div class="summary-card">
|
|
388
|
+
<div class="summary-value minor">${summary.minorIssues}</div>
|
|
389
|
+
<div class="summary-label">Minor Issues</div>
|
|
390
|
+
</div>
|
|
391
|
+
<div class="summary-card">
|
|
392
|
+
<div class="summary-value major">${summary.majorIssues}</div>
|
|
393
|
+
<div class="summary-label">Major Issues</div>
|
|
394
|
+
</div>
|
|
395
|
+
<div class="summary-card">
|
|
396
|
+
<div class="summary-value">${summary.totalIssues}</div>
|
|
397
|
+
<div class="summary-label">Total Issues</div>
|
|
398
|
+
</div>
|
|
399
|
+
</div>
|
|
400
|
+
|
|
401
|
+
<div class="results">
|
|
402
|
+
${results.map(result => {
|
|
403
|
+
const badgeClass = result.overallStatus === "responsive" ? "badge-responsive" : result.overallStatus === "minor_issues" ? "badge-minor" : "badge-major";
|
|
404
|
+
return `
|
|
405
|
+
<div class="result-card">
|
|
406
|
+
<div class="result-header">
|
|
407
|
+
<div>
|
|
408
|
+
<strong>${result.url}</strong>
|
|
409
|
+
<p style="color: #94a3b8; font-size: 0.875rem;">${result.summary}</p>
|
|
410
|
+
</div>
|
|
411
|
+
<span class="badge ${badgeClass}">${result.overallStatus.replace("_", " ").toUpperCase()}</span>
|
|
412
|
+
</div>
|
|
413
|
+
<div class="viewport-grid">
|
|
414
|
+
${result.screenshots.map(s => `
|
|
415
|
+
<div class="viewport-item">
|
|
416
|
+
<span class="viewport-name">${s.viewport.name}</span>
|
|
417
|
+
<span style="color: #94a3b8;"> ${s.viewport.width}×${s.viewport.height}</span>
|
|
418
|
+
</div>
|
|
419
|
+
`).join("")}
|
|
420
|
+
</div>
|
|
421
|
+
${result.issues.length > 0 ? `
|
|
422
|
+
<div style="margin-top: 1rem;">
|
|
423
|
+
<strong style="color: #f59e0b;">Issues:</strong>
|
|
424
|
+
${result.issues.map(issue => `
|
|
425
|
+
<div class="issue issue-${issue.severity}">
|
|
426
|
+
<strong>[${issue.type.toUpperCase()}]</strong> ${issue.description}
|
|
427
|
+
<br><span style="color: #94a3b8; font-size: 0.75rem;">Affected: ${issue.affectedViewports.join(", ")}</span>
|
|
428
|
+
</div>
|
|
429
|
+
`).join("")}
|
|
430
|
+
</div>
|
|
431
|
+
` : ""}
|
|
432
|
+
</div>
|
|
433
|
+
`;
|
|
434
|
+
}).join("")}
|
|
435
|
+
</div>
|
|
436
|
+
|
|
437
|
+
<footer>
|
|
438
|
+
Generated by CBrowser v7.2.0 | Test completed in ${(duration / 1000).toFixed(1)}s
|
|
439
|
+
</footer>
|
|
440
|
+
</div>
|
|
441
|
+
</body>
|
|
442
|
+
</html>`;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* List available viewport presets
|
|
446
|
+
*/
|
|
447
|
+
function listViewportPresets() {
|
|
448
|
+
return types_js_1.VIEWPORT_PRESETS;
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=responsive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responsive.js","sourceRoot":"","sources":["../../src/visual/responsive.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cbrowser",
|
|
3
|
-
"version": "7.
|
|
4
|
-
"description": "AI-powered browser automation with constitutional safety, AI visual regression, persona testing, and natural language test suites.",
|
|
3
|
+
"version": "7.4.0",
|
|
4
|
+
"description": "AI-powered browser automation with constitutional safety, AI visual regression, persona testing, and natural language test suites. Modular architecture for visual, testing, analysis, and performance modules.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"bin": {
|
|
8
8
|
"cbrowser": "dist/cli.js"
|
|
9
9
|
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./visual": {
|
|
17
|
+
"types": "./dist/visual/index.d.ts",
|
|
18
|
+
"import": "./dist/visual/index.js",
|
|
19
|
+
"require": "./dist/visual/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./testing": {
|
|
22
|
+
"types": "./dist/testing/index.d.ts",
|
|
23
|
+
"import": "./dist/testing/index.js",
|
|
24
|
+
"require": "./dist/testing/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./analysis": {
|
|
27
|
+
"types": "./dist/analysis/index.d.ts",
|
|
28
|
+
"import": "./dist/analysis/index.js",
|
|
29
|
+
"require": "./dist/analysis/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./performance": {
|
|
32
|
+
"types": "./dist/performance/index.d.ts",
|
|
33
|
+
"import": "./dist/performance/index.js",
|
|
34
|
+
"require": "./dist/performance/index.js"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
10
37
|
"scripts": {
|
|
11
38
|
"build": "tsc",
|
|
12
39
|
"dev": "tsc --watch",
|
|
@@ -38,7 +65,9 @@
|
|
|
38
65
|
"ai-visual-regression",
|
|
39
66
|
"visual-testing",
|
|
40
67
|
"screenshot-comparison",
|
|
41
|
-
"cross-browser-testing"
|
|
68
|
+
"cross-browser-testing",
|
|
69
|
+
"modular-architecture",
|
|
70
|
+
"performance-testing"
|
|
42
71
|
],
|
|
43
72
|
"author": "WF Media",
|
|
44
73
|
"license": "MIT",
|