cbrowser 7.3.0 → 7.4.1
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 -411
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +0 -4745
- package/dist/browser.js.map +1 -1
- package/dist/cli.js +64 -56
- 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/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +406 -1
- package/dist/mcp-server.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/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,528 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AI Test Repair (v6.2.0)
|
|
4
|
+
*
|
|
5
|
+
* Analyze test failures and suggest repairs.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.repairTest = repairTest;
|
|
9
|
+
exports.repairTestSuite = repairTestSuite;
|
|
10
|
+
exports.formatRepairReport = formatRepairReport;
|
|
11
|
+
exports.exportRepairedTest = exportRepairedTest;
|
|
12
|
+
const browser_js_1 = require("../browser.js");
|
|
13
|
+
const nl_test_suite_js_1 = require("./nl-test-suite.js");
|
|
14
|
+
/**
|
|
15
|
+
* Classify the type of failure from an error message.
|
|
16
|
+
*/
|
|
17
|
+
function classifyFailure(error, step) {
|
|
18
|
+
const lowerError = error.toLowerCase();
|
|
19
|
+
if (lowerError.includes("not found") || lowerError.includes("no element") || lowerError.includes("failed to click")) {
|
|
20
|
+
return "selector_not_found";
|
|
21
|
+
}
|
|
22
|
+
if (lowerError.includes("assertion") || lowerError.includes("verify") || lowerError.includes("expected")) {
|
|
23
|
+
return "assertion_failed";
|
|
24
|
+
}
|
|
25
|
+
if (lowerError.includes("timeout") || lowerError.includes("timed out")) {
|
|
26
|
+
return "timeout";
|
|
27
|
+
}
|
|
28
|
+
if (lowerError.includes("navigation") || lowerError.includes("navigate") || lowerError.includes("url")) {
|
|
29
|
+
return "navigation_failed";
|
|
30
|
+
}
|
|
31
|
+
if (lowerError.includes("not interactable") || lowerError.includes("disabled") || lowerError.includes("hidden")) {
|
|
32
|
+
return "element_not_interactable";
|
|
33
|
+
}
|
|
34
|
+
return "unknown";
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Find alternative selectors for a target on the current page.
|
|
38
|
+
*/
|
|
39
|
+
async function findAlternatives(browser, originalTarget) {
|
|
40
|
+
const page = browser.page;
|
|
41
|
+
if (!page)
|
|
42
|
+
return [];
|
|
43
|
+
try {
|
|
44
|
+
const alternatives = await page.evaluate((target) => {
|
|
45
|
+
const results = [];
|
|
46
|
+
const lowerTarget = target.toLowerCase();
|
|
47
|
+
// Find buttons with similar text
|
|
48
|
+
document.querySelectorAll("button, [role='button'], input[type='submit'], input[type='button']").forEach((el) => {
|
|
49
|
+
const text = el.textContent?.trim() || el.value || "";
|
|
50
|
+
if (text && (text.toLowerCase().includes(lowerTarget) || lowerTarget.includes(text.toLowerCase()))) {
|
|
51
|
+
results.push(`button: "${text}"`);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
// Find links with similar text
|
|
55
|
+
document.querySelectorAll("a").forEach((el) => {
|
|
56
|
+
const text = el.textContent?.trim() || "";
|
|
57
|
+
if (text && (text.toLowerCase().includes(lowerTarget) || lowerTarget.includes(text.toLowerCase()))) {
|
|
58
|
+
results.push(`link: "${text}"`);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
// Find inputs with similar labels/placeholders
|
|
62
|
+
document.querySelectorAll("input, textarea, select").forEach((el) => {
|
|
63
|
+
const input = el;
|
|
64
|
+
const placeholder = input.placeholder || "";
|
|
65
|
+
const label = document.querySelector(`label[for="${input.id}"]`)?.textContent?.trim() || "";
|
|
66
|
+
const name = input.name || "";
|
|
67
|
+
if (placeholder.toLowerCase().includes(lowerTarget) || lowerTarget.includes(placeholder.toLowerCase())) {
|
|
68
|
+
results.push(`input with placeholder "${placeholder}"`);
|
|
69
|
+
}
|
|
70
|
+
if (label.toLowerCase().includes(lowerTarget) || lowerTarget.includes(label.toLowerCase())) {
|
|
71
|
+
results.push(`input labeled "${label}"`);
|
|
72
|
+
}
|
|
73
|
+
if (name.toLowerCase().includes(lowerTarget)) {
|
|
74
|
+
results.push(`input named "${name}"`);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
// Find elements by aria-label
|
|
78
|
+
document.querySelectorAll("[aria-label]").forEach((el) => {
|
|
79
|
+
const label = el.getAttribute("aria-label") || "";
|
|
80
|
+
if (label.toLowerCase().includes(lowerTarget) || lowerTarget.includes(label.toLowerCase())) {
|
|
81
|
+
results.push(`aria:${el.tagName.toLowerCase()}/"${label}"`);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
return [...new Set(results)].slice(0, 10);
|
|
85
|
+
}, originalTarget);
|
|
86
|
+
return alternatives;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get page context for failure analysis.
|
|
94
|
+
*/
|
|
95
|
+
async function getPageContext(browser) {
|
|
96
|
+
const page = browser.page;
|
|
97
|
+
if (!page)
|
|
98
|
+
return { url: "", title: "", visibleText: [] };
|
|
99
|
+
try {
|
|
100
|
+
const context = await page.evaluate(() => {
|
|
101
|
+
const visibleText = [];
|
|
102
|
+
// Get visible button/link text
|
|
103
|
+
document.querySelectorAll("button, a, [role='button']").forEach((el) => {
|
|
104
|
+
const text = el.textContent?.trim();
|
|
105
|
+
if (text && text.length < 50) {
|
|
106
|
+
visibleText.push(text);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
return {
|
|
110
|
+
url: window.location.href,
|
|
111
|
+
title: document.title,
|
|
112
|
+
visibleText: [...new Set(visibleText)].slice(0, 20),
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
return context;
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return { url: "", title: "", visibleText: [] };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Generate repair suggestions for a failed step.
|
|
123
|
+
*/
|
|
124
|
+
async function generateRepairSuggestions(browser, step, error, failureType, alternatives, pageContext) {
|
|
125
|
+
const suggestions = [];
|
|
126
|
+
switch (failureType) {
|
|
127
|
+
case "selector_not_found": {
|
|
128
|
+
// Suggest alternative selectors
|
|
129
|
+
for (const alt of alternatives.slice(0, 3)) {
|
|
130
|
+
const newInstruction = step.instruction.replace(step.target || "", alt.replace(/^(button|link|input|aria):\s*/, "").replace(/"/g, "'"));
|
|
131
|
+
suggestions.push({
|
|
132
|
+
type: "selector_update",
|
|
133
|
+
confidence: 0.7,
|
|
134
|
+
description: `Update selector to "${alt}"`,
|
|
135
|
+
originalInstruction: step.instruction,
|
|
136
|
+
suggestedInstruction: `click ${alt.replace(/^(button|link|input|aria):\s*/, "")}`,
|
|
137
|
+
reasoning: `Found similar element on page: ${alt}`,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// Suggest adding a wait
|
|
141
|
+
if (suggestions.length === 0) {
|
|
142
|
+
suggestions.push({
|
|
143
|
+
type: "add_wait",
|
|
144
|
+
confidence: 0.5,
|
|
145
|
+
description: "Add wait before this step",
|
|
146
|
+
originalInstruction: step.instruction,
|
|
147
|
+
suggestedInstruction: `wait 2 seconds\n${step.instruction}`,
|
|
148
|
+
reasoning: "Element might not be loaded yet - adding wait may help",
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
case "assertion_failed": {
|
|
154
|
+
// Suggest updating the assertion based on page content
|
|
155
|
+
if (step.action === "assert" && pageContext.visibleText.length > 0) {
|
|
156
|
+
const possibleText = pageContext.visibleText.find((t) => t.length > 3 && t.length < 30);
|
|
157
|
+
if (possibleText) {
|
|
158
|
+
suggestions.push({
|
|
159
|
+
type: "assertion_update",
|
|
160
|
+
confidence: 0.6,
|
|
161
|
+
description: `Update assertion to check for visible text`,
|
|
162
|
+
originalInstruction: step.instruction,
|
|
163
|
+
suggestedInstruction: `verify page contains "${possibleText}"`,
|
|
164
|
+
reasoning: `Page contains "${possibleText}" which might be the intended check`,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Suggest checking URL instead
|
|
169
|
+
if (pageContext.url) {
|
|
170
|
+
const urlPath = new URL(pageContext.url).pathname;
|
|
171
|
+
suggestions.push({
|
|
172
|
+
type: "assertion_update",
|
|
173
|
+
confidence: 0.5,
|
|
174
|
+
description: "Assert URL instead of content",
|
|
175
|
+
originalInstruction: step.instruction,
|
|
176
|
+
suggestedInstruction: `verify url contains "${urlPath}"`,
|
|
177
|
+
reasoning: `Current URL is ${pageContext.url}`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
case "timeout": {
|
|
183
|
+
suggestions.push({
|
|
184
|
+
type: "add_wait",
|
|
185
|
+
confidence: 0.7,
|
|
186
|
+
description: "Increase wait time",
|
|
187
|
+
originalInstruction: step.instruction,
|
|
188
|
+
suggestedInstruction: `wait 5 seconds\n${step.instruction}`,
|
|
189
|
+
reasoning: "Operation timed out - page may need more time to load",
|
|
190
|
+
});
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
case "element_not_interactable": {
|
|
194
|
+
suggestions.push({
|
|
195
|
+
type: "add_wait",
|
|
196
|
+
confidence: 0.6,
|
|
197
|
+
description: "Wait for element to become interactive",
|
|
198
|
+
originalInstruction: step.instruction,
|
|
199
|
+
suggestedInstruction: `wait 2 seconds\n${step.instruction}`,
|
|
200
|
+
reasoning: "Element exists but is not interactable - may need to wait",
|
|
201
|
+
});
|
|
202
|
+
// Suggest scrolling
|
|
203
|
+
suggestions.push({
|
|
204
|
+
type: "change_action",
|
|
205
|
+
confidence: 0.5,
|
|
206
|
+
description: "Scroll element into view first",
|
|
207
|
+
originalInstruction: step.instruction,
|
|
208
|
+
suggestedInstruction: `scroll down\n${step.instruction}`,
|
|
209
|
+
reasoning: "Element might be outside viewport",
|
|
210
|
+
});
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
default: {
|
|
214
|
+
// Generic suggestion to skip
|
|
215
|
+
suggestions.push({
|
|
216
|
+
type: "skip_step",
|
|
217
|
+
confidence: 0.3,
|
|
218
|
+
description: "Skip this step",
|
|
219
|
+
originalInstruction: step.instruction,
|
|
220
|
+
suggestedInstruction: `// SKIPPED: ${step.instruction}`,
|
|
221
|
+
reasoning: "Unable to determine a fix - consider removing this step",
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Sort by confidence
|
|
226
|
+
return suggestions.sort((a, b) => b.confidence - a.confidence);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Analyze a failed test step and suggest repairs.
|
|
230
|
+
*/
|
|
231
|
+
async function analyzeFailure(browser, step, error) {
|
|
232
|
+
const failureType = classifyFailure(error, step);
|
|
233
|
+
const alternatives = step.target ? await findAlternatives(browser, step.target) : [];
|
|
234
|
+
const pageContext = await getPageContext(browser);
|
|
235
|
+
const suggestions = await generateRepairSuggestions(browser, step, error, failureType, alternatives, pageContext);
|
|
236
|
+
return {
|
|
237
|
+
step,
|
|
238
|
+
error,
|
|
239
|
+
failureType,
|
|
240
|
+
targetSelector: step.target,
|
|
241
|
+
alternativeSelectors: alternatives,
|
|
242
|
+
pageContext,
|
|
243
|
+
suggestions,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Run a test, analyze failures, and suggest/apply repairs.
|
|
248
|
+
*/
|
|
249
|
+
async function repairTest(test, options = {}) {
|
|
250
|
+
const { headless = true, autoApply = false, verifyRepairs = true, maxRetries = 3, } = options;
|
|
251
|
+
const browser = new browser_js_1.CBrowser({ headless });
|
|
252
|
+
const failureAnalyses = [];
|
|
253
|
+
const repairedSteps = [];
|
|
254
|
+
let failedSteps = 0;
|
|
255
|
+
console.log(`\n🔧 Analyzing test: ${test.name}`);
|
|
256
|
+
console.log(` Steps: ${test.steps.length}`);
|
|
257
|
+
console.log(` Auto-apply: ${autoApply}`);
|
|
258
|
+
console.log("");
|
|
259
|
+
try {
|
|
260
|
+
await browser.launch();
|
|
261
|
+
for (const step of test.steps) {
|
|
262
|
+
console.log(` → ${step.instruction}`);
|
|
263
|
+
let stepPassed = false;
|
|
264
|
+
let lastError = "";
|
|
265
|
+
let attempts = 0;
|
|
266
|
+
while (!stepPassed && attempts < maxRetries) {
|
|
267
|
+
attempts++;
|
|
268
|
+
try {
|
|
269
|
+
// Execute the step
|
|
270
|
+
switch (step.action) {
|
|
271
|
+
case "navigate":
|
|
272
|
+
await browser.navigate(step.target || "");
|
|
273
|
+
stepPassed = true;
|
|
274
|
+
break;
|
|
275
|
+
case "click":
|
|
276
|
+
const clickResult = await browser.smartClick(step.target || "");
|
|
277
|
+
stepPassed = clickResult.success;
|
|
278
|
+
if (!stepPassed)
|
|
279
|
+
lastError = `Failed to click: ${step.target}`;
|
|
280
|
+
break;
|
|
281
|
+
case "fill":
|
|
282
|
+
await browser.fill(step.target || "", step.value || "");
|
|
283
|
+
stepPassed = true;
|
|
284
|
+
break;
|
|
285
|
+
case "assert":
|
|
286
|
+
const assertResult = await browser.assert(step.instruction);
|
|
287
|
+
stepPassed = assertResult.passed;
|
|
288
|
+
if (!stepPassed)
|
|
289
|
+
lastError = assertResult.message;
|
|
290
|
+
break;
|
|
291
|
+
case "wait":
|
|
292
|
+
if (step.target) {
|
|
293
|
+
const page = browser.page;
|
|
294
|
+
if (page) {
|
|
295
|
+
await page.waitForSelector(`text=${step.target}`, { timeout: 10000 });
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
const ms = parseFloat(step.value || "1") * 1000;
|
|
300
|
+
await new Promise((r) => setTimeout(r, ms));
|
|
301
|
+
}
|
|
302
|
+
stepPassed = true;
|
|
303
|
+
break;
|
|
304
|
+
case "scroll":
|
|
305
|
+
const direction = step.target?.toLowerCase() === "up" ? -500 : 500;
|
|
306
|
+
const page = browser.page;
|
|
307
|
+
if (page) {
|
|
308
|
+
await page.evaluate((d) => window.scrollBy(0, d), direction);
|
|
309
|
+
}
|
|
310
|
+
stepPassed = true;
|
|
311
|
+
break;
|
|
312
|
+
case "screenshot":
|
|
313
|
+
await browser.screenshot();
|
|
314
|
+
stepPassed = true;
|
|
315
|
+
break;
|
|
316
|
+
default:
|
|
317
|
+
// Try as click
|
|
318
|
+
const unknownResult = await browser.smartClick(step.target || step.instruction);
|
|
319
|
+
stepPassed = unknownResult.success;
|
|
320
|
+
if (!stepPassed)
|
|
321
|
+
lastError = `Could not interpret: ${step.instruction}`;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
catch (e) {
|
|
325
|
+
lastError = e.message;
|
|
326
|
+
stepPassed = false;
|
|
327
|
+
}
|
|
328
|
+
if (!stepPassed && attempts < maxRetries) {
|
|
329
|
+
console.log(` ⚠️ Attempt ${attempts} failed, retrying...`);
|
|
330
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
if (stepPassed) {
|
|
334
|
+
console.log(` ✓ Passed`);
|
|
335
|
+
repairedSteps.push(step);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
console.log(` ✗ Failed: ${lastError}`);
|
|
339
|
+
failedSteps++;
|
|
340
|
+
// Analyze the failure
|
|
341
|
+
const analysis = await analyzeFailure(browser, step, lastError);
|
|
342
|
+
failureAnalyses.push(analysis);
|
|
343
|
+
if (autoApply && analysis.suggestions.length > 0) {
|
|
344
|
+
const bestSuggestion = analysis.suggestions[0];
|
|
345
|
+
console.log(` 🔧 Auto-applying: ${bestSuggestion.description}`);
|
|
346
|
+
// Parse the suggested instruction into a step
|
|
347
|
+
const repairedStep = (0, nl_test_suite_js_1.parseNLInstruction)(bestSuggestion.suggestedInstruction.split("\n").pop() || "");
|
|
348
|
+
repairedSteps.push(repairedStep);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
// Keep original step
|
|
352
|
+
repairedSteps.push(step);
|
|
353
|
+
if (analysis.suggestions.length > 0) {
|
|
354
|
+
console.log(` 💡 Suggestions:`);
|
|
355
|
+
for (const suggestion of analysis.suggestions.slice(0, 2)) {
|
|
356
|
+
console.log(` - ${suggestion.description} (${Math.round(suggestion.confidence * 100)}%)`);
|
|
357
|
+
console.log(` → ${suggestion.suggestedInstruction}`);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// Create repaired test
|
|
364
|
+
const repairedTest = {
|
|
365
|
+
name: test.name,
|
|
366
|
+
description: test.description,
|
|
367
|
+
steps: repairedSteps,
|
|
368
|
+
};
|
|
369
|
+
// Optionally verify the repaired test
|
|
370
|
+
let repairedTestPasses;
|
|
371
|
+
if (verifyRepairs && autoApply && failedSteps > 0) {
|
|
372
|
+
console.log(`\n 🔄 Verifying repaired test...`);
|
|
373
|
+
await browser.close();
|
|
374
|
+
const verifyBrowser = new browser_js_1.CBrowser({ headless });
|
|
375
|
+
try {
|
|
376
|
+
await verifyBrowser.launch();
|
|
377
|
+
let allPassed = true;
|
|
378
|
+
for (const step of repairedSteps) {
|
|
379
|
+
try {
|
|
380
|
+
switch (step.action) {
|
|
381
|
+
case "navigate":
|
|
382
|
+
await verifyBrowser.navigate(step.target || "");
|
|
383
|
+
break;
|
|
384
|
+
case "click":
|
|
385
|
+
const result = await verifyBrowser.smartClick(step.target || "");
|
|
386
|
+
if (!result.success)
|
|
387
|
+
allPassed = false;
|
|
388
|
+
break;
|
|
389
|
+
case "fill":
|
|
390
|
+
await verifyBrowser.fill(step.target || "", step.value || "");
|
|
391
|
+
break;
|
|
392
|
+
case "assert":
|
|
393
|
+
const assertResult = await verifyBrowser.assert(step.instruction);
|
|
394
|
+
if (!assertResult.passed)
|
|
395
|
+
allPassed = false;
|
|
396
|
+
break;
|
|
397
|
+
case "wait":
|
|
398
|
+
if (!step.target) {
|
|
399
|
+
const ms = parseFloat(step.value || "1") * 1000;
|
|
400
|
+
await new Promise((r) => setTimeout(r, ms));
|
|
401
|
+
}
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
catch {
|
|
406
|
+
allPassed = false;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
repairedTestPasses = allPassed;
|
|
410
|
+
console.log(` ${allPassed ? "✅" : "❌"} Repaired test ${allPassed ? "PASSES" : "still FAILS"}`);
|
|
411
|
+
}
|
|
412
|
+
finally {
|
|
413
|
+
await verifyBrowser.close();
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return {
|
|
417
|
+
originalTest: test,
|
|
418
|
+
repairedTest: failedSteps > 0 ? repairedTest : undefined,
|
|
419
|
+
failedSteps,
|
|
420
|
+
repairedSteps: autoApply ? failedSteps : 0,
|
|
421
|
+
failureAnalyses,
|
|
422
|
+
repairedTestPasses,
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
finally {
|
|
426
|
+
await browser.close();
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Run test repair on a full suite.
|
|
431
|
+
*/
|
|
432
|
+
async function repairTestSuite(suite, options = {}) {
|
|
433
|
+
const startTime = Date.now();
|
|
434
|
+
const testResults = [];
|
|
435
|
+
console.log(`\n🔧 Repairing Test Suite: ${suite.name}`);
|
|
436
|
+
console.log(` Tests: ${suite.tests.length}`);
|
|
437
|
+
console.log("");
|
|
438
|
+
for (const test of suite.tests) {
|
|
439
|
+
const result = await repairTest(test, options);
|
|
440
|
+
testResults.push(result);
|
|
441
|
+
}
|
|
442
|
+
const testsWithFailures = testResults.filter((r) => r.failedSteps > 0).length;
|
|
443
|
+
const testsRepaired = testResults.filter((r) => r.repairedSteps > 0).length;
|
|
444
|
+
const totalFailedSteps = testResults.reduce((sum, r) => sum + r.failedSteps, 0);
|
|
445
|
+
const totalRepairedSteps = testResults.reduce((sum, r) => sum + r.repairedSteps, 0);
|
|
446
|
+
return {
|
|
447
|
+
suiteName: suite.name,
|
|
448
|
+
timestamp: new Date().toISOString(),
|
|
449
|
+
duration: Date.now() - startTime,
|
|
450
|
+
testResults,
|
|
451
|
+
summary: {
|
|
452
|
+
totalTests: suite.tests.length,
|
|
453
|
+
testsWithFailures,
|
|
454
|
+
testsRepaired,
|
|
455
|
+
totalFailedSteps,
|
|
456
|
+
totalRepairedSteps,
|
|
457
|
+
repairSuccessRate: totalFailedSteps > 0 ? (totalRepairedSteps / totalFailedSteps) * 100 : 100,
|
|
458
|
+
},
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Format a repair result as a report.
|
|
463
|
+
*/
|
|
464
|
+
function formatRepairReport(result) {
|
|
465
|
+
const lines = [];
|
|
466
|
+
lines.push("");
|
|
467
|
+
lines.push("╔══════════════════════════════════════════════════════════════════════════════╗");
|
|
468
|
+
lines.push("║ AI TEST REPAIR REPORT ║");
|
|
469
|
+
lines.push("╚══════════════════════════════════════════════════════════════════════════════╝");
|
|
470
|
+
lines.push("");
|
|
471
|
+
lines.push(`📋 Suite: ${result.suiteName}`);
|
|
472
|
+
lines.push(`⏱️ Duration: ${(result.duration / 1000).toFixed(1)}s`);
|
|
473
|
+
lines.push(`📅 Timestamp: ${result.timestamp}`);
|
|
474
|
+
lines.push("");
|
|
475
|
+
// Summary
|
|
476
|
+
lines.push("📊 SUMMARY");
|
|
477
|
+
lines.push("─".repeat(60));
|
|
478
|
+
lines.push(` Total Tests: ${result.summary.totalTests}`);
|
|
479
|
+
lines.push(` Tests with Failures: ${result.summary.testsWithFailures}`);
|
|
480
|
+
lines.push(` Tests Repaired: ${result.summary.testsRepaired}`);
|
|
481
|
+
lines.push(` Total Failed Steps: ${result.summary.totalFailedSteps}`);
|
|
482
|
+
lines.push(` Total Repaired Steps: ${result.summary.totalRepairedSteps}`);
|
|
483
|
+
lines.push(` Repair Success Rate: ${result.summary.repairSuccessRate.toFixed(0)}%`);
|
|
484
|
+
lines.push("");
|
|
485
|
+
// Per-test details
|
|
486
|
+
for (const testResult of result.testResults) {
|
|
487
|
+
if (testResult.failedSteps === 0)
|
|
488
|
+
continue;
|
|
489
|
+
lines.push(`\n🔧 ${testResult.originalTest.name}`);
|
|
490
|
+
lines.push(` Failed Steps: ${testResult.failedSteps}`);
|
|
491
|
+
lines.push(` Repaired: ${testResult.repairedSteps}`);
|
|
492
|
+
for (const analysis of testResult.failureAnalyses) {
|
|
493
|
+
lines.push(`\n ❌ ${analysis.step.instruction}`);
|
|
494
|
+
lines.push(` Error: ${analysis.error}`);
|
|
495
|
+
lines.push(` Type: ${analysis.failureType}`);
|
|
496
|
+
if (analysis.suggestions.length > 0) {
|
|
497
|
+
lines.push(` 💡 Suggestions:`);
|
|
498
|
+
for (const s of analysis.suggestions.slice(0, 2)) {
|
|
499
|
+
lines.push(` - ${s.description} (${Math.round(s.confidence * 100)}%)`);
|
|
500
|
+
lines.push(` → ${s.suggestedInstruction}`);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
if (testResult.repairedTestPasses !== undefined) {
|
|
505
|
+
lines.push(`\n ${testResult.repairedTestPasses ? "✅" : "❌"} Repaired test ${testResult.repairedTestPasses ? "PASSES" : "still FAILS"}`);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
lines.push("");
|
|
509
|
+
return lines.join("\n");
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Export repaired test to file.
|
|
513
|
+
*/
|
|
514
|
+
function exportRepairedTest(result) {
|
|
515
|
+
if (!result.repairedTest) {
|
|
516
|
+
return `# Test: ${result.originalTest.name}\n# No repairs needed\n${result.originalTest.steps.map((s) => s.instruction).join("\n")}`;
|
|
517
|
+
}
|
|
518
|
+
const lines = [];
|
|
519
|
+
lines.push(`# Test: ${result.repairedTest.name} (Repaired)`);
|
|
520
|
+
lines.push(`# Original failures: ${result.failedSteps}`);
|
|
521
|
+
lines.push(`# Repairs applied: ${result.repairedSteps}`);
|
|
522
|
+
lines.push("");
|
|
523
|
+
for (const step of result.repairedTest.steps) {
|
|
524
|
+
lines.push(step.instruction);
|
|
525
|
+
}
|
|
526
|
+
return lines.join("\n");
|
|
527
|
+
}
|
|
528
|
+
//# sourceMappingURL=test-repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-repair.js","sourceRoot":"","sources":["../../src/testing/test-repair.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A/B Visual Comparison (v7.3.0)
|
|
3
|
+
*
|
|
4
|
+
* Compare two URLs side-by-side to detect visual differences.
|
|
5
|
+
*/
|
|
6
|
+
import type { ABComparisonResult, ABComparisonOptions, ABSuite, ABSuiteResult } from "../types.js";
|
|
7
|
+
/**
|
|
8
|
+
* Run A/B visual comparison between two URLs
|
|
9
|
+
*/
|
|
10
|
+
export declare function runABComparison(urlA: string, urlB: string, options?: ABComparisonOptions): Promise<ABComparisonResult>;
|
|
11
|
+
/**
|
|
12
|
+
* Run A/B comparison suite for multiple page pairs
|
|
13
|
+
*/
|
|
14
|
+
export declare function runABSuite(suite: ABSuite): Promise<ABSuiteResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Format A/B comparison result as console report
|
|
17
|
+
*/
|
|
18
|
+
export declare function formatABReport(result: ABComparisonResult): string;
|
|
19
|
+
/**
|
|
20
|
+
* Generate HTML report for A/B comparison suite
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateABHtmlReport(suiteResult: ABSuiteResult): string;
|
|
23
|
+
//# sourceMappingURL=ab-comparison.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ab-comparison.d.ts","sourceRoot":"","sources":["../../src/visual/ab-comparison.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAEV,kBAAkB,EAClB,mBAAmB,EAEnB,OAAO,EACP,aAAa,EAEd,MAAM,aAAa,CAAC;AA0GrB;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAmE7B;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CA6BvE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CA2DjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,aAAa,GAAG,MAAM,CAsHvE"}
|