cbrowser 5.1.0 → 5.3.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.
@@ -5,13 +5,43 @@
5
5
  * behaviors, timing, and interaction patterns.
6
6
  */
7
7
  import type { Persona } from "./types.js";
8
+ /**
9
+ * Load all custom personas from disk.
10
+ */
11
+ export declare function loadCustomPersonas(): Record<string, Persona>;
12
+ /**
13
+ * Save a custom persona to disk.
14
+ */
15
+ export declare function saveCustomPersona(persona: Persona): string;
16
+ /**
17
+ * Delete a custom persona.
18
+ */
19
+ export declare function deleteCustomPersona(name: string): boolean;
20
+ /**
21
+ * Check if a persona name is a built-in (cannot be overwritten).
22
+ */
23
+ export declare function isBuiltinPersona(name: string): boolean;
24
+ /**
25
+ * Generate a persona from a natural language description using AI.
26
+ * This creates realistic behavioral parameters based on the description.
27
+ */
28
+ export declare function generatePersonaFromDescription(name: string, description: string): Persona;
8
29
  export declare const BUILTIN_PERSONAS: Record<string, Persona>;
9
30
  /**
10
31
  * Get a persona by name.
32
+ * Checks custom personas first, then built-ins.
11
33
  */
12
34
  export declare function getPersona(name: string): Persona | undefined;
13
35
  /**
14
- * List all available persona names.
36
+ * List all available persona names (built-in + custom).
15
37
  */
16
38
  export declare function listPersonas(): string[];
39
+ /**
40
+ * List only custom persona names.
41
+ */
42
+ export declare function listCustomPersonas(): string[];
43
+ /**
44
+ * Get the custom personas directory path.
45
+ */
46
+ export declare function getPersonasDir(): string;
17
47
  //# sourceMappingURL=personas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"personas.d.ts","sourceRoot":"","sources":["../src/personas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAoRpD,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAE5D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC"}
1
+ {"version":3,"file":"personas.d.ts","sourceRoot":"","sources":["../src/personas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAkB1C;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoB5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAM1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAqBzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAMD;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CA2OT;AAMD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAoRpD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAS5D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAMvC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
package/dist/personas.js CHANGED
@@ -7,8 +7,333 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.BUILTIN_PERSONAS = void 0;
10
+ exports.loadCustomPersonas = loadCustomPersonas;
11
+ exports.saveCustomPersona = saveCustomPersona;
12
+ exports.deleteCustomPersona = deleteCustomPersona;
13
+ exports.isBuiltinPersona = isBuiltinPersona;
14
+ exports.generatePersonaFromDescription = generatePersonaFromDescription;
10
15
  exports.getPersona = getPersona;
11
16
  exports.listPersonas = listPersonas;
17
+ exports.listCustomPersonas = listCustomPersonas;
18
+ exports.getPersonasDir = getPersonasDir;
19
+ const fs_1 = require("fs");
20
+ const path_1 = require("path");
21
+ const os_1 = require("os");
22
+ // ============================================================================
23
+ // Custom Personas Storage
24
+ // ============================================================================
25
+ const DATA_DIR = process.env.CBROWSER_DATA_DIR || (0, path_1.join)((0, os_1.homedir)(), ".cbrowser");
26
+ const PERSONAS_DIR = (0, path_1.join)(DATA_DIR, "personas");
27
+ function ensurePersonasDir() {
28
+ if (!(0, fs_1.existsSync)(DATA_DIR)) {
29
+ (0, fs_1.mkdirSync)(DATA_DIR, { recursive: true });
30
+ }
31
+ if (!(0, fs_1.existsSync)(PERSONAS_DIR)) {
32
+ (0, fs_1.mkdirSync)(PERSONAS_DIR, { recursive: true });
33
+ }
34
+ }
35
+ /**
36
+ * Load all custom personas from disk.
37
+ */
38
+ function loadCustomPersonas() {
39
+ ensurePersonasDir();
40
+ const personas = {};
41
+ try {
42
+ const files = (0, fs_1.readdirSync)(PERSONAS_DIR).filter(f => f.endsWith(".json"));
43
+ for (const file of files) {
44
+ try {
45
+ const content = (0, fs_1.readFileSync)((0, path_1.join)(PERSONAS_DIR, file), "utf-8");
46
+ const persona = JSON.parse(content);
47
+ personas[persona.name] = persona;
48
+ }
49
+ catch {
50
+ // Skip invalid files
51
+ }
52
+ }
53
+ }
54
+ catch {
55
+ // Directory doesn't exist or can't be read
56
+ }
57
+ return personas;
58
+ }
59
+ /**
60
+ * Save a custom persona to disk.
61
+ */
62
+ function saveCustomPersona(persona) {
63
+ ensurePersonasDir();
64
+ const filename = `${persona.name.toLowerCase().replace(/[^a-z0-9-]/g, "-")}.json`;
65
+ const filepath = (0, path_1.join)(PERSONAS_DIR, filename);
66
+ (0, fs_1.writeFileSync)(filepath, JSON.stringify(persona, null, 2));
67
+ return filepath;
68
+ }
69
+ /**
70
+ * Delete a custom persona.
71
+ */
72
+ function deleteCustomPersona(name) {
73
+ ensurePersonasDir();
74
+ const customPersonas = loadCustomPersonas();
75
+ if (!customPersonas[name]) {
76
+ return false;
77
+ }
78
+ const filename = `${name.toLowerCase().replace(/[^a-z0-9-]/g, "-")}.json`;
79
+ const filepath = (0, path_1.join)(PERSONAS_DIR, filename);
80
+ try {
81
+ if ((0, fs_1.existsSync)(filepath)) {
82
+ (0, fs_1.unlinkSync)(filepath);
83
+ return true;
84
+ }
85
+ }
86
+ catch {
87
+ // Ignore errors
88
+ }
89
+ return false;
90
+ }
91
+ /**
92
+ * Check if a persona name is a built-in (cannot be overwritten).
93
+ */
94
+ function isBuiltinPersona(name) {
95
+ return name in exports.BUILTIN_PERSONAS;
96
+ }
97
+ // ============================================================================
98
+ // AI Persona Generation
99
+ // ============================================================================
100
+ /**
101
+ * Generate a persona from a natural language description using AI.
102
+ * This creates realistic behavioral parameters based on the description.
103
+ */
104
+ function generatePersonaFromDescription(name, description) {
105
+ // Analyze description for key traits
106
+ const descLower = description.toLowerCase();
107
+ // Determine tech level
108
+ let techLevel = "intermediate";
109
+ if (descLower.match(/expert|developer|engineer|tech.?savvy|power user|advanced/)) {
110
+ techLevel = "expert";
111
+ }
112
+ else if (descLower.match(/beginner|new|first.?time|elderly|senior|novice|learning/)) {
113
+ techLevel = "beginner";
114
+ }
115
+ // Determine device
116
+ let device = "desktop";
117
+ if (descLower.match(/mobile|phone|smartphone|iphone|android/)) {
118
+ device = "mobile";
119
+ }
120
+ else if (descLower.match(/tablet|ipad/)) {
121
+ device = "tablet";
122
+ }
123
+ // Determine age range
124
+ let ageRange = "25-45";
125
+ if (descLower.match(/elderly|senior|older|65\+|retired/)) {
126
+ ageRange = "65+";
127
+ }
128
+ else if (descLower.match(/teen|young|student|gen.?z|18-24/)) {
129
+ ageRange = "18-24";
130
+ }
131
+ else if (descLower.match(/middle.?age|40s|50s/)) {
132
+ ageRange = "45-65";
133
+ }
134
+ // Determine speed/patience traits
135
+ const isImpatient = descLower.match(/impatient|rush|fast|quick|busy|frustrated|annoyed/);
136
+ const isSlow = descLower.match(/slow|careful|cautious|elderly|senior|deliberate|thorough/);
137
+ const isDistracted = descLower.match(/distract|adhd|multitask|busy|interrupt/);
138
+ // Determine disability/accessibility needs
139
+ const hasVisionIssues = descLower.match(/vision|blind|visually.?impaired|screen.?reader|low.?vision/);
140
+ const hasMotorIssues = descLower.match(/motor|tremor|parkinson|arthritis|dexterity/);
141
+ // Calculate timing parameters
142
+ let reactionMin = 200, reactionMax = 500;
143
+ let clickDelayMin = 100, clickDelayMax = 300;
144
+ let typeSpeedMin = 50, typeSpeedMax = 120;
145
+ let readingSpeed = 250;
146
+ let scrollPauseMin = 200, scrollPauseMax = 500;
147
+ if (techLevel === "expert" || isImpatient) {
148
+ reactionMin = 100;
149
+ reactionMax = 300;
150
+ clickDelayMin = 50;
151
+ clickDelayMax = 150;
152
+ typeSpeedMin = 30;
153
+ typeSpeedMax = 80;
154
+ readingSpeed = 400;
155
+ scrollPauseMin = 100;
156
+ scrollPauseMax = 300;
157
+ }
158
+ else if (techLevel === "beginner" || isSlow) {
159
+ reactionMin = 500;
160
+ reactionMax = 1500;
161
+ clickDelayMin = 300;
162
+ clickDelayMax = 800;
163
+ typeSpeedMin = 100;
164
+ typeSpeedMax = 200;
165
+ readingSpeed = 150;
166
+ scrollPauseMin = 500;
167
+ scrollPauseMax = 1500;
168
+ }
169
+ if (hasMotorIssues || ageRange === "65+") {
170
+ reactionMin = Math.max(reactionMin, 800);
171
+ reactionMax = Math.max(reactionMax, 2000);
172
+ clickDelayMin = Math.max(clickDelayMin, 500);
173
+ clickDelayMax = Math.max(clickDelayMax, 1200);
174
+ typeSpeedMin = Math.max(typeSpeedMin, 150);
175
+ typeSpeedMax = Math.max(typeSpeedMax, 300);
176
+ readingSpeed = Math.min(readingSpeed, 100);
177
+ }
178
+ // Calculate error parameters
179
+ let misClickRate = 0.05;
180
+ let doubleClickAccidental = 0.03;
181
+ let typoRate = 0.05;
182
+ let backtrackRate = 0.1;
183
+ if (techLevel === "expert") {
184
+ misClickRate = 0.02;
185
+ doubleClickAccidental = 0.01;
186
+ typoRate = 0.02;
187
+ backtrackRate = 0.05;
188
+ }
189
+ else if (techLevel === "beginner") {
190
+ misClickRate = 0.1;
191
+ doubleClickAccidental = 0.05;
192
+ typoRate = 0.08;
193
+ backtrackRate = 0.2;
194
+ }
195
+ if (hasMotorIssues) {
196
+ misClickRate = Math.max(misClickRate, 0.2);
197
+ doubleClickAccidental = Math.max(doubleClickAccidental, 0.15);
198
+ }
199
+ if (device === "mobile") {
200
+ misClickRate = Math.max(misClickRate, 0.15);
201
+ typoRate = Math.max(typoRate, 0.12);
202
+ }
203
+ // Calculate mouse parameters
204
+ let curvature = 0.4;
205
+ let jitter = 5;
206
+ let overshoot = 0.1;
207
+ let speed = "normal";
208
+ if (techLevel === "expert" || isImpatient) {
209
+ curvature = 0.2;
210
+ jitter = 2;
211
+ overshoot = 0.05;
212
+ speed = "fast";
213
+ }
214
+ else if (techLevel === "beginner" || isSlow) {
215
+ curvature = 0.6;
216
+ jitter = 8;
217
+ overshoot = 0.15;
218
+ speed = "slow";
219
+ }
220
+ if (hasMotorIssues) {
221
+ jitter = Math.max(jitter, 12);
222
+ overshoot = Math.max(overshoot, 0.25);
223
+ speed = "slow";
224
+ }
225
+ if (hasVisionIssues) {
226
+ // Screen reader users don't use mouse
227
+ curvature = 0;
228
+ jitter = 0;
229
+ overshoot = 0;
230
+ }
231
+ // Calculate attention parameters
232
+ let pattern = "f-pattern";
233
+ let scrollBehavior = "chunked";
234
+ let focusAreas = ["header", "cta", "text"];
235
+ let distractionRate = 0.2;
236
+ if (techLevel === "expert" || isImpatient) {
237
+ pattern = "skim";
238
+ scrollBehavior = "jump";
239
+ focusAreas = ["cta", "prices"];
240
+ distractionRate = 0.1;
241
+ }
242
+ else if (techLevel === "beginner" || isSlow) {
243
+ pattern = "thorough";
244
+ scrollBehavior = "chunked";
245
+ focusAreas = ["header", "text", "images"];
246
+ distractionRate = 0.3;
247
+ }
248
+ if (isDistracted) {
249
+ distractionRate = Math.max(distractionRate, 0.5);
250
+ }
251
+ if (hasVisionIssues) {
252
+ pattern = "thorough";
253
+ focusAreas = ["header", "text"];
254
+ }
255
+ // Determine viewport
256
+ let viewport = [1280, 800];
257
+ if (device === "mobile") {
258
+ viewport = [375, 812];
259
+ }
260
+ else if (device === "tablet") {
261
+ viewport = [820, 1180];
262
+ }
263
+ else if (techLevel === "expert") {
264
+ viewport = [1920, 1080];
265
+ }
266
+ // Build behaviors object
267
+ const behaviors = {};
268
+ if (techLevel === "expert") {
269
+ behaviors.uses_keyboard_shortcuts = true;
270
+ behaviors.reads_quickly = true;
271
+ behaviors.skips_tutorials = true;
272
+ }
273
+ if (techLevel === "beginner") {
274
+ behaviors.reads_everything = true;
275
+ behaviors.hesitant_to_click = true;
276
+ behaviors.follows_tutorials = true;
277
+ }
278
+ if (isImpatient) {
279
+ behaviors.abandons_quickly = true;
280
+ behaviors.skips_reading = true;
281
+ behaviors.expects_speed = true;
282
+ }
283
+ if (hasVisionIssues) {
284
+ behaviors.keyboard_only = true;
285
+ behaviors.relies_on_aria = true;
286
+ behaviors.needs_alt_text = true;
287
+ }
288
+ if (device === "mobile") {
289
+ behaviors.uses_gestures = true;
290
+ behaviors.expects_mobile_friendly = true;
291
+ behaviors.short_sessions = true;
292
+ }
293
+ return {
294
+ name,
295
+ description,
296
+ demographics: {
297
+ age_range: ageRange,
298
+ tech_level: techLevel,
299
+ device,
300
+ },
301
+ behaviors,
302
+ humanBehavior: {
303
+ timing: {
304
+ reactionTime: { min: reactionMin, max: reactionMax },
305
+ clickDelay: { min: clickDelayMin, max: clickDelayMax },
306
+ typeSpeed: { min: typeSpeedMin, max: typeSpeedMax },
307
+ readingSpeed,
308
+ scrollPauseTime: { min: scrollPauseMin, max: scrollPauseMax },
309
+ },
310
+ errors: {
311
+ misClickRate,
312
+ doubleClickAccidental,
313
+ typoRate,
314
+ backtrackRate,
315
+ },
316
+ mouse: {
317
+ curvature,
318
+ jitter,
319
+ overshoot,
320
+ speed,
321
+ },
322
+ attention: {
323
+ pattern,
324
+ scrollBehavior,
325
+ focusAreas,
326
+ distractionRate,
327
+ },
328
+ },
329
+ context: {
330
+ viewport,
331
+ },
332
+ };
333
+ }
334
+ // ============================================================================
335
+ // Built-in Personas
336
+ // ============================================================================
12
337
  exports.BUILTIN_PERSONAS = {
13
338
  "power-user": {
14
339
  name: "power-user",
@@ -283,14 +608,36 @@ exports.BUILTIN_PERSONAS = {
283
608
  };
284
609
  /**
285
610
  * Get a persona by name.
611
+ * Checks custom personas first, then built-ins.
286
612
  */
287
613
  function getPersona(name) {
614
+ // Check custom personas first
615
+ const customPersonas = loadCustomPersonas();
616
+ if (customPersonas[name]) {
617
+ return customPersonas[name];
618
+ }
619
+ // Fall back to built-ins
288
620
  return exports.BUILTIN_PERSONAS[name];
289
621
  }
290
622
  /**
291
- * List all available persona names.
623
+ * List all available persona names (built-in + custom).
292
624
  */
293
625
  function listPersonas() {
294
- return Object.keys(exports.BUILTIN_PERSONAS);
626
+ const builtinNames = Object.keys(exports.BUILTIN_PERSONAS);
627
+ const customNames = Object.keys(loadCustomPersonas());
628
+ // Combine and dedupe (custom personas with same name as built-in take precedence in getPersona)
629
+ return [...new Set([...builtinNames, ...customNames])];
630
+ }
631
+ /**
632
+ * List only custom persona names.
633
+ */
634
+ function listCustomPersonas() {
635
+ return Object.keys(loadCustomPersonas());
636
+ }
637
+ /**
638
+ * Get the custom personas directory path.
639
+ */
640
+ function getPersonasDir() {
641
+ return PERSONAS_DIR;
295
642
  }
296
643
  //# sourceMappingURL=personas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"personas.js","sourceRoot":"","sources":["../src/personas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"personas.js","sourceRoot":"","sources":["../src/personas.ts"],"names":[],"mappings":"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"}
package/docs/INSTALL.md CHANGED
@@ -57,7 +57,7 @@ CBROWSER_DATA_DIR="./data" npx cbrowser navigate "https://example.com"
57
57
  | Variable | Default | Description |
58
58
  |----------|---------|-------------|
59
59
  | `CBROWSER_DATA_DIR` | `~/.cbrowser` | Data storage directory |
60
- | `CBROWSER_HEADLESS` | `false` | Run headless by default |
60
+ | `CBROWSER_HEADLESS` | `true` | Run headless by default (set to `false` for GUI) |
61
61
  | `CBROWSER_TIMEOUT` | `30000` | Default timeout (ms) |
62
62
  | `CBROWSER_VIEWPORT_WIDTH` | `1280` | Default viewport width |
63
63
  | `CBROWSER_VIEWPORT_HEIGHT` | `800` | Default viewport height |
@@ -2,9 +2,11 @@
2
2
  * CBrowser Basic Usage Examples
3
3
  *
4
4
  * Run with: npx ts-node examples/basic-usage.ts
5
+ * Or: bun run examples/basic-usage.ts
5
6
  */
6
7
 
7
- import { CBrowser } from "../src/index.js";
8
+ import { CBrowser } from "cbrowser";
9
+ // For local development: import { CBrowser } from "../src/index.js";
8
10
 
9
11
  async function basicNavigation() {
10
12
  console.log("=== Basic Navigation ===\n");
@@ -0,0 +1,184 @@
1
+ /**
2
+ * CBrowser v5.0.0 Smart Automation Examples
3
+ *
4
+ * Demonstrates:
5
+ * - Smart click with auto-retry
6
+ * - Natural language assertions
7
+ * - Self-healing selector cache
8
+ * - AI test generation
9
+ *
10
+ * Run with: npx ts-node examples/smart-automation.ts
11
+ */
12
+
13
+ import { CBrowser } from "../src/index.js";
14
+
15
+ async function smartClickExample() {
16
+ console.log("=== Smart Click with Auto-Retry ===\n");
17
+
18
+ const browser = new CBrowser({ headless: true });
19
+
20
+ try {
21
+ await browser.navigate("https://example.com");
22
+
23
+ // Smart click automatically:
24
+ // 1. Checks self-healing cache for known working selectors
25
+ // 2. Tries the original selector
26
+ // 3. Generates alternatives (text variants, ARIA roles, attributes)
27
+ // 4. Retries with each alternative
28
+ // 5. Caches the working selector for future use
29
+ const result = await browser.smartClick("More information...", {
30
+ maxRetries: 3,
31
+ });
32
+
33
+ console.log(`Success: ${result.success}`);
34
+ console.log(`Attempts: ${result.attempts.length}`);
35
+ console.log(`Final selector: ${result.finalSelector}`);
36
+
37
+ if (result.aiSuggestion) {
38
+ console.log(`AI suggestion: ${result.aiSuggestion}`);
39
+ }
40
+ } finally {
41
+ await browser.close();
42
+ }
43
+ }
44
+
45
+ async function assertionsExample() {
46
+ console.log("\n=== Natural Language Assertions ===\n");
47
+
48
+ const browser = new CBrowser({ headless: true });
49
+
50
+ try {
51
+ await browser.navigate("https://example.com");
52
+
53
+ // Title assertions
54
+ const titleResult = await browser.assert("title contains 'Example'");
55
+ console.log(`Title assertion: ${titleResult.passed ? "PASS" : "FAIL"}`);
56
+ console.log(` Message: ${titleResult.message}`);
57
+
58
+ // URL assertions
59
+ const urlResult = await browser.assert("url contains 'example.com'");
60
+ console.log(`URL assertion: ${urlResult.passed ? "PASS" : "FAIL"}`);
61
+ console.log(` Message: ${urlResult.message}`);
62
+
63
+ // Content assertions
64
+ const contentResult = await browser.assert(
65
+ "page contains 'illustrative examples'"
66
+ );
67
+ console.log(`Content assertion: ${contentResult.passed ? "PASS" : "FAIL"}`);
68
+ console.log(` Message: ${contentResult.message}`);
69
+
70
+ // Element count assertions
71
+ const linkResult = await browser.assert("1 links");
72
+ console.log(`Link count assertion: ${linkResult.passed ? "PASS" : "FAIL"}`);
73
+ console.log(` Actual: ${linkResult.actual}, Expected: ${linkResult.expected}`);
74
+ } finally {
75
+ await browser.close();
76
+ }
77
+ }
78
+
79
+ async function selfHealingExample() {
80
+ console.log("\n=== Self-Healing Selector Cache ===\n");
81
+
82
+ const browser = new CBrowser({ headless: true });
83
+
84
+ try {
85
+ // Get cache statistics
86
+ const stats = browser.getSelectorCacheStats();
87
+ console.log(`Cache entries: ${stats.totalEntries}`);
88
+ console.log(`Total successes: ${stats.totalSuccesses}`);
89
+ console.log(`Total failures: ${stats.totalFailures}`);
90
+
91
+ if (stats.topDomains.length > 0) {
92
+ console.log("\nTop domains:");
93
+ for (const { domain, count } of stats.topDomains) {
94
+ console.log(` ${domain}: ${count} cached selectors`);
95
+ }
96
+ }
97
+
98
+ // The cache is stored in ~/.cbrowser/selector-cache.json
99
+ // Each entry maps: domain + originalSelector -> workingSelector
100
+ // When a selector fails, CBrowser checks the cache first
101
+ // If found, it uses the cached working selector
102
+ // If not found, it tries alternatives and caches the one that works
103
+ } finally {
104
+ await browser.close();
105
+ }
106
+ }
107
+
108
+ async function testGenerationExample() {
109
+ console.log("\n=== AI Test Generation ===\n");
110
+
111
+ const browser = new CBrowser({ headless: true });
112
+
113
+ try {
114
+ // Generate tests for a page
115
+ const result = await browser.generateTests("https://example.com");
116
+
117
+ console.log(`Page analyzed: ${result.url}`);
118
+ console.log(`Tests generated: ${result.tests.length}\n`);
119
+
120
+ // Show generated test scenarios
121
+ for (const test of result.tests) {
122
+ console.log(`Test: ${test.name}`);
123
+ console.log(` Description: ${test.description}`);
124
+ console.log(` Steps: ${test.steps.length}`);
125
+ console.log(` Assertions: ${test.assertions.join(", ")}`);
126
+ console.log();
127
+ }
128
+
129
+ // Generated Playwright code
130
+ console.log("=== Generated Playwright Code ===");
131
+ console.log(result.playwrightCode.slice(0, 500) + "...\n");
132
+
133
+ // Generated CBrowser script
134
+ console.log("=== Generated CBrowser Script ===");
135
+ console.log(result.cbrowserScript.slice(0, 500) + "...\n");
136
+ } finally {
137
+ await browser.close();
138
+ }
139
+ }
140
+
141
+ async function pageAnalysisExample() {
142
+ console.log("\n=== Page Analysis ===\n");
143
+
144
+ const browser = new CBrowser({ headless: true });
145
+
146
+ try {
147
+ await browser.navigate("https://example.com");
148
+
149
+ const analysis = await browser.analyzePage();
150
+
151
+ console.log(`Title: ${analysis.title}`);
152
+ console.log(`URL: ${analysis.url}`);
153
+ console.log(`Forms: ${analysis.forms.length}`);
154
+ console.log(`Buttons: ${analysis.buttons.length}`);
155
+ console.log(`Links: ${analysis.links.length}`);
156
+ console.log(`Inputs: ${analysis.inputs.length}`);
157
+ console.log(`Has login form: ${analysis.hasLogin}`);
158
+ console.log(`Has search: ${analysis.hasSearch}`);
159
+ console.log(`Has navigation: ${analysis.hasNavigation}`);
160
+
161
+ // Detailed form analysis
162
+ if (analysis.forms.length > 0) {
163
+ console.log("\nForm details:");
164
+ for (const form of analysis.forms) {
165
+ console.log(` Selector: ${form.selector}`);
166
+ console.log(` Fields: ${form.fields.length}`);
167
+ console.log(` Is login: ${form.isLoginForm}`);
168
+ console.log(` Is search: ${form.isSearchForm}`);
169
+ }
170
+ }
171
+ } finally {
172
+ await browser.close();
173
+ }
174
+ }
175
+
176
+ async function main() {
177
+ await smartClickExample();
178
+ await assertionsExample();
179
+ await selfHealingExample();
180
+ await testGenerationExample();
181
+ await pageAnalysisExample();
182
+ }
183
+
184
+ main().catch(console.error);