testchimp-runner-core 0.0.34 → 0.0.36
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/execution-service.d.ts +1 -4
- package/dist/execution-service.d.ts.map +1 -1
- package/dist/execution-service.js +155 -468
- package/dist/execution-service.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/orchestrator/decision-parser.d.ts +18 -0
- package/dist/orchestrator/decision-parser.d.ts.map +1 -0
- package/dist/orchestrator/decision-parser.js +127 -0
- package/dist/orchestrator/decision-parser.js.map +1 -0
- package/dist/orchestrator/index.d.ts +4 -2
- package/dist/orchestrator/index.d.ts.map +1 -1
- package/dist/orchestrator/index.js +14 -2
- package/dist/orchestrator/index.js.map +1 -1
- package/dist/orchestrator/orchestrator-agent.d.ts +17 -14
- package/dist/orchestrator/orchestrator-agent.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator-agent.js +534 -204
- package/dist/orchestrator/orchestrator-agent.js.map +1 -1
- package/dist/orchestrator/orchestrator-prompts.d.ts +14 -2
- package/dist/orchestrator/orchestrator-prompts.d.ts.map +1 -1
- package/dist/orchestrator/orchestrator-prompts.js +529 -247
- package/dist/orchestrator/orchestrator-prompts.js.map +1 -1
- package/dist/orchestrator/page-som-handler.d.ts +106 -0
- package/dist/orchestrator/page-som-handler.d.ts.map +1 -0
- package/dist/orchestrator/page-som-handler.js +1353 -0
- package/dist/orchestrator/page-som-handler.js.map +1 -0
- package/dist/orchestrator/som-types.d.ts +149 -0
- package/dist/orchestrator/som-types.d.ts.map +1 -0
- package/dist/orchestrator/som-types.js +87 -0
- package/dist/orchestrator/som-types.js.map +1 -0
- package/dist/orchestrator/tool-registry.d.ts +2 -0
- package/dist/orchestrator/tool-registry.d.ts.map +1 -1
- package/dist/orchestrator/tool-registry.js.map +1 -1
- package/dist/orchestrator/tools/index.d.ts +4 -1
- package/dist/orchestrator/tools/index.d.ts.map +1 -1
- package/dist/orchestrator/tools/index.js +7 -2
- package/dist/orchestrator/tools/index.js.map +1 -1
- package/dist/orchestrator/tools/refresh-som-markers.d.ts +12 -0
- package/dist/orchestrator/tools/refresh-som-markers.d.ts.map +1 -0
- package/dist/orchestrator/tools/refresh-som-markers.js +64 -0
- package/dist/orchestrator/tools/refresh-som-markers.js.map +1 -0
- package/dist/orchestrator/tools/view-previous-screenshot.d.ts +15 -0
- package/dist/orchestrator/tools/view-previous-screenshot.d.ts.map +1 -0
- package/dist/orchestrator/tools/view-previous-screenshot.js +92 -0
- package/dist/orchestrator/tools/view-previous-screenshot.js.map +1 -0
- package/dist/orchestrator/types.d.ts +23 -1
- package/dist/orchestrator/types.d.ts.map +1 -1
- package/dist/orchestrator/types.js +11 -1
- package/dist/orchestrator/types.js.map +1 -1
- package/dist/scenario-service.d.ts +5 -0
- package/dist/scenario-service.d.ts.map +1 -1
- package/dist/scenario-service.js +17 -0
- package/dist/scenario-service.js.map +1 -1
- package/dist/scenario-worker-class.d.ts +4 -0
- package/dist/scenario-worker-class.d.ts.map +1 -1
- package/dist/scenario-worker-class.js +18 -3
- package/dist/scenario-worker-class.js.map +1 -1
- package/dist/testing/agent-tester.d.ts +35 -0
- package/dist/testing/agent-tester.d.ts.map +1 -0
- package/dist/testing/agent-tester.js +84 -0
- package/dist/testing/agent-tester.js.map +1 -0
- package/dist/testing/ref-translator-tester.d.ts +44 -0
- package/dist/testing/ref-translator-tester.d.ts.map +1 -0
- package/dist/testing/ref-translator-tester.js +104 -0
- package/dist/testing/ref-translator-tester.js.map +1 -0
- package/dist/utils/hierarchical-selector.d.ts +47 -0
- package/dist/utils/hierarchical-selector.d.ts.map +1 -0
- package/dist/utils/hierarchical-selector.js +212 -0
- package/dist/utils/hierarchical-selector.js.map +1 -0
- package/dist/utils/page-info-retry.d.ts +14 -0
- package/dist/utils/page-info-retry.d.ts.map +1 -0
- package/dist/utils/page-info-retry.js +60 -0
- package/dist/utils/page-info-retry.js.map +1 -0
- package/dist/utils/page-info-utils.d.ts +1 -0
- package/dist/utils/page-info-utils.d.ts.map +1 -1
- package/dist/utils/page-info-utils.js +46 -18
- package/dist/utils/page-info-utils.js.map +1 -1
- package/dist/utils/ref-attacher.d.ts +21 -0
- package/dist/utils/ref-attacher.d.ts.map +1 -0
- package/dist/utils/ref-attacher.js +149 -0
- package/dist/utils/ref-attacher.js.map +1 -0
- package/dist/utils/ref-translator.d.ts +49 -0
- package/dist/utils/ref-translator.d.ts.map +1 -0
- package/dist/utils/ref-translator.js +276 -0
- package/dist/utils/ref-translator.js.map +1 -0
- package/package.json +6 -1
- package/RELEASE_0.0.26.md +0 -165
- package/RELEASE_0.0.27.md +0 -236
- package/RELEASE_0.0.28.md +0 -286
- package/plandocs/BEFORE_AFTER_VERIFICATION.md +0 -148
- package/plandocs/COORDINATE_MODE_DIAGNOSIS.md +0 -144
- package/plandocs/CREDIT_CALLBACK_ARCHITECTURE.md +0 -253
- package/plandocs/HUMAN_LIKE_IMPROVEMENTS.md +0 -642
- package/plandocs/IMPLEMENTATION_STATUS.md +0 -108
- package/plandocs/INTEGRATION_COMPLETE.md +0 -322
- package/plandocs/MULTI_AGENT_ARCHITECTURE_REVIEW.md +0 -844
- package/plandocs/ORCHESTRATOR_MVP_SUMMARY.md +0 -539
- package/plandocs/PHASE1_ABSTRACTION_COMPLETE.md +0 -241
- package/plandocs/PHASE1_FINAL_STATUS.md +0 -210
- package/plandocs/PHASE_1_COMPLETE.md +0 -165
- package/plandocs/PHASE_1_SUMMARY.md +0 -184
- package/plandocs/PLANNING_SESSION_SUMMARY.md +0 -372
- package/plandocs/PROMPT_OPTIMIZATION_ANALYSIS.md +0 -120
- package/plandocs/PROMPT_SANITY_CHECK.md +0 -120
- package/plandocs/SCRIPT_CLEANUP_FEATURE.md +0 -201
- package/plandocs/SCRIPT_GENERATION_ARCHITECTURE.md +0 -364
- package/plandocs/SELECTOR_IMPROVEMENTS.md +0 -139
- package/plandocs/SESSION_SUMMARY_v0.0.33.md +0 -151
- package/plandocs/TROUBLESHOOTING_SESSION.md +0 -72
- package/plandocs/VISION_DIAGNOSTICS_IMPROVEMENTS.md +0 -336
- package/plandocs/VISUAL_AGENT_EVOLUTION_PLAN.md +0 -396
- package/plandocs/WHATS_NEW_v0.0.33.md +0 -183
- package/src/auth-config.ts +0 -84
- package/src/credit-usage-service.ts +0 -188
- package/src/env-loader.ts +0 -103
- package/src/execution-service.ts +0 -1413
- package/src/file-handler.ts +0 -104
- package/src/index.ts +0 -422
- package/src/llm-facade.ts +0 -821
- package/src/llm-provider.ts +0 -53
- package/src/model-constants.ts +0 -35
- package/src/orchestrator/index.ts +0 -34
- package/src/orchestrator/orchestrator-agent.ts +0 -862
- package/src/orchestrator/orchestrator-agent.ts.backup +0 -1386
- package/src/orchestrator/orchestrator-prompts.ts +0 -474
- package/src/orchestrator/tool-registry.ts +0 -182
- package/src/orchestrator/tools/check-page-ready.ts +0 -75
- package/src/orchestrator/tools/extract-data.ts +0 -92
- package/src/orchestrator/tools/index.ts +0 -12
- package/src/orchestrator/tools/inspect-page.ts +0 -42
- package/src/orchestrator/tools/recall-history.ts +0 -72
- package/src/orchestrator/tools/take-screenshot.ts +0 -128
- package/src/orchestrator/tools/verify-action-result.ts +0 -159
- package/src/orchestrator/types.ts +0 -248
- package/src/playwright-mcp-service.ts +0 -224
- package/src/progress-reporter.ts +0 -144
- package/src/prompts.ts +0 -842
- package/src/providers/backend-proxy-llm-provider.ts +0 -91
- package/src/providers/local-llm-provider.ts +0 -38
- package/src/scenario-service.ts +0 -232
- package/src/scenario-worker-class.ts +0 -1089
- package/src/script-utils.ts +0 -203
- package/src/types.ts +0 -239
- package/src/utils/browser-utils.ts +0 -348
- package/src/utils/coordinate-converter.ts +0 -162
- package/src/utils/page-info-utils.ts +0 -250
- package/testchimp-runner-core-0.0.33.tgz +0 -0
- package/tsconfig.json +0 -19
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone Ref Translator Tester
|
|
3
|
+
* Tests ref translation effectiveness independently
|
|
4
|
+
*/
|
|
5
|
+
export interface TranslationTestCommand {
|
|
6
|
+
ref: string;
|
|
7
|
+
operation: string;
|
|
8
|
+
value?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface TranslationTestResult {
|
|
11
|
+
ref: string;
|
|
12
|
+
operation: string;
|
|
13
|
+
alternatives: string[];
|
|
14
|
+
successful?: string;
|
|
15
|
+
allFailed: boolean;
|
|
16
|
+
error?: string;
|
|
17
|
+
elementInfo?: {
|
|
18
|
+
tag: string;
|
|
19
|
+
role: string;
|
|
20
|
+
text: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface TranslationBatchResult {
|
|
24
|
+
totalCommands: number;
|
|
25
|
+
successfulTranslations: number;
|
|
26
|
+
failedTranslations: number;
|
|
27
|
+
results: TranslationTestResult[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Test ref translation for a set of commands
|
|
31
|
+
*/
|
|
32
|
+
export declare class RefTranslatorTester {
|
|
33
|
+
private translator;
|
|
34
|
+
constructor();
|
|
35
|
+
/**
|
|
36
|
+
* Test translation of ref commands on a page
|
|
37
|
+
*/
|
|
38
|
+
testTranslation(page: any, commands: TranslationTestCommand[]): Promise<TranslationBatchResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Test a single ref command
|
|
41
|
+
*/
|
|
42
|
+
testSingleCommand(page: any, ref: string, operation: string, value?: string): Promise<TranslationTestResult>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=ref-translator-tester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-translator-tester.d.ts","sourceRoot":"","sources":["../../src/testing/ref-translator-tester.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,UAAU,CAAgB;;IAMlC;;OAEG;IACG,eAAe,CACnB,IAAI,EAAE,GAAG,EACT,QAAQ,EAAE,sBAAsB,EAAE,GACjC,OAAO,CAAC,sBAAsB,CAAC;IA6FlC;;OAEG;IACG,iBAAiB,CACrB,IAAI,EAAE,GAAG,EACT,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,CAAC;CAIlC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Standalone Ref Translator Tester
|
|
4
|
+
* Tests ref translation effectiveness independently
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.RefTranslatorTester = void 0;
|
|
8
|
+
const ref_translator_1 = require("../utils/ref-translator");
|
|
9
|
+
const ref_attacher_1 = require("../utils/ref-attacher");
|
|
10
|
+
/**
|
|
11
|
+
* Test ref translation for a set of commands
|
|
12
|
+
*/
|
|
13
|
+
class RefTranslatorTester {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.translator = new ref_translator_1.RefTranslator(console.log);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Test translation of ref commands on a page
|
|
19
|
+
*/
|
|
20
|
+
async testTranslation(page, commands) {
|
|
21
|
+
console.log('\n=== REF TRANSLATION TEST ===');
|
|
22
|
+
console.log(`Testing ${commands.length} command(s)`);
|
|
23
|
+
try {
|
|
24
|
+
// Step 1: Get page info (uses data-tc-id if available)
|
|
25
|
+
console.log('\n1. Getting page info...');
|
|
26
|
+
const pageInfo = await (0, ref_attacher_1.getPageInfoFromAttachedRefs)(page);
|
|
27
|
+
console.log(` RefMap size: ${pageInfo.refMap?.size || 0}`);
|
|
28
|
+
// Step 2: Convert to RefCommand format
|
|
29
|
+
const refCommands = commands.map(cmd => ({
|
|
30
|
+
type: 'ref',
|
|
31
|
+
ref: cmd.ref,
|
|
32
|
+
operation: cmd.operation,
|
|
33
|
+
value: cmd.value
|
|
34
|
+
}));
|
|
35
|
+
// Step 3: Translate commands
|
|
36
|
+
console.log('\n2. Translating commands...');
|
|
37
|
+
const results = [];
|
|
38
|
+
for (const cmd of commands) {
|
|
39
|
+
console.log(`\n Testing ref='${cmd.ref}' operation='${cmd.operation}'`);
|
|
40
|
+
// Get element info
|
|
41
|
+
const elementInfo = pageInfo.refMap?.get(cmd.ref);
|
|
42
|
+
if (!elementInfo) {
|
|
43
|
+
console.log(` ⚠️ Ref '${cmd.ref}' not found in refMap`);
|
|
44
|
+
results.push({
|
|
45
|
+
ref: cmd.ref,
|
|
46
|
+
operation: cmd.operation,
|
|
47
|
+
alternatives: [],
|
|
48
|
+
allFailed: true,
|
|
49
|
+
error: 'Ref not found in refMap'
|
|
50
|
+
});
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
console.log(` Element: <${elementInfo.tag}> role="${elementInfo.role}" text="${elementInfo.text?.substring(0, 30)}"`);
|
|
54
|
+
// Translate single command
|
|
55
|
+
const translated = await this.translator.translateRefCommands([{ type: 'ref', ref: cmd.ref, operation: cmd.operation, value: cmd.value }], page, pageInfo.refMap, pageInfo.ariaSnapshot);
|
|
56
|
+
const result = translated[0];
|
|
57
|
+
console.log(` Generated ${result.alternatives.length} alternatives`);
|
|
58
|
+
if (result.successful) {
|
|
59
|
+
console.log(` ✓ Success: ${result.successful.substring(0, 80)}...`);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
console.log(` ✗ All alternatives failed`);
|
|
63
|
+
}
|
|
64
|
+
results.push({
|
|
65
|
+
ref: cmd.ref,
|
|
66
|
+
operation: cmd.operation,
|
|
67
|
+
alternatives: result.alternatives,
|
|
68
|
+
successful: result.successful,
|
|
69
|
+
allFailed: !result.successful,
|
|
70
|
+
elementInfo: {
|
|
71
|
+
tag: elementInfo.tag,
|
|
72
|
+
role: elementInfo.role,
|
|
73
|
+
text: elementInfo.text || ''
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Step 4: Summary
|
|
78
|
+
const successful = results.filter(r => !r.allFailed).length;
|
|
79
|
+
const failed = results.filter(r => r.allFailed).length;
|
|
80
|
+
console.log('\n3. Summary:');
|
|
81
|
+
console.log(` ✓ Successful: ${successful}/${commands.length}`);
|
|
82
|
+
console.log(` ✗ Failed: ${failed}/${commands.length}`);
|
|
83
|
+
return {
|
|
84
|
+
totalCommands: commands.length,
|
|
85
|
+
successfulTranslations: successful,
|
|
86
|
+
failedTranslations: failed,
|
|
87
|
+
results
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
console.error(`\n❌ Translation test failed: ${error.message}`);
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Test a single ref command
|
|
97
|
+
*/
|
|
98
|
+
async testSingleCommand(page, ref, operation, value) {
|
|
99
|
+
const result = await this.testTranslation(page, [{ ref, operation, value }]);
|
|
100
|
+
return result.results[0];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.RefTranslatorTester = RefTranslatorTester;
|
|
104
|
+
//# sourceMappingURL=ref-translator-tester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ref-translator-tester.js","sourceRoot":"","sources":["../../src/testing/ref-translator-tester.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hierarchical Selector Generator
|
|
3
|
+
* Generates Playwright selectors using ARIA tree hierarchy for uniqueness
|
|
4
|
+
* Mimics Playwright's own selector generation strategy
|
|
5
|
+
*/
|
|
6
|
+
export interface AriaNode {
|
|
7
|
+
role: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
ref?: string;
|
|
10
|
+
children?: AriaNode[];
|
|
11
|
+
}
|
|
12
|
+
export interface AriaTreePath {
|
|
13
|
+
nodes: AriaNode[];
|
|
14
|
+
targetIndex: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class HierarchicalSelectorGenerator {
|
|
17
|
+
private logger?;
|
|
18
|
+
constructor(logger?: (message: string, level?: 'log' | 'error' | 'warn') => void);
|
|
19
|
+
/**
|
|
20
|
+
* Generate Playwright selectors for a ref using ARIA tree hierarchy
|
|
21
|
+
* Returns selectors in priority order, considering parent context for uniqueness
|
|
22
|
+
*/
|
|
23
|
+
generateSelectorsForRef(ref: string, refMap: Map<string, any>, ariaTree: any): string[];
|
|
24
|
+
/**
|
|
25
|
+
* Strategy 1: Unique attributes (most reliable)
|
|
26
|
+
*/
|
|
27
|
+
private generateUniqueAttributeSelectors;
|
|
28
|
+
/**
|
|
29
|
+
* Strategy 2: Parent-scoped selectors (uses hierarchy for uniqueness)
|
|
30
|
+
*/
|
|
31
|
+
private generateParentScopedSelectors;
|
|
32
|
+
/**
|
|
33
|
+
* Strategy 3: nth-match based on sibling position in ARIA tree
|
|
34
|
+
*/
|
|
35
|
+
private generateNthMatchSelectors;
|
|
36
|
+
/**
|
|
37
|
+
* Strategy 4: Generic fallbacks (last resort)
|
|
38
|
+
*/
|
|
39
|
+
private generateGenericFallbacks;
|
|
40
|
+
/**
|
|
41
|
+
* Walk ARIA tree to find path from root to target ref
|
|
42
|
+
*/
|
|
43
|
+
private getAriaTreePath;
|
|
44
|
+
private walkTree;
|
|
45
|
+
private escape;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=hierarchical-selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchical-selector.d.ts","sourceRoot":"","sources":["../../src/utils/hierarchical-selector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,6BAA6B;IACxC,OAAO,CAAC,MAAM,CAAC,CAA8D;gBAEjE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,KAAK,IAAI;IAIhF;;;OAGG;IACH,uBAAuB,CACrB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EACxB,QAAQ,EAAE,GAAG,GACZ,MAAM,EAAE;IA+BX;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAgCxC;;OAEG;IACH,OAAO,CAAC,6BAA6B;IA4CrC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IA2CjC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA2BhC;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,QAAQ;IAyBhB,OAAO,CAAC,MAAM;CAGf"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Hierarchical Selector Generator
|
|
4
|
+
* Generates Playwright selectors using ARIA tree hierarchy for uniqueness
|
|
5
|
+
* Mimics Playwright's own selector generation strategy
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.HierarchicalSelectorGenerator = void 0;
|
|
9
|
+
class HierarchicalSelectorGenerator {
|
|
10
|
+
constructor(logger) {
|
|
11
|
+
this.logger = logger;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Generate Playwright selectors for a ref using ARIA tree hierarchy
|
|
15
|
+
* Returns selectors in priority order, considering parent context for uniqueness
|
|
16
|
+
*/
|
|
17
|
+
generateSelectorsForRef(ref, refMap, ariaTree) {
|
|
18
|
+
const element = refMap.get(ref);
|
|
19
|
+
if (!element) {
|
|
20
|
+
this.logger?.(`[HierarchicalSelector] Ref '${ref}' not found in refMap`, 'warn');
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
// Get ARIA tree path to understand hierarchy
|
|
24
|
+
const path = this.getAriaTreePath(ariaTree, ref);
|
|
25
|
+
const selectors = [];
|
|
26
|
+
// Strategy 1: BEST - Unique attribute (name, id, data-testid)
|
|
27
|
+
selectors.push(...this.generateUniqueAttributeSelectors(element));
|
|
28
|
+
// Strategy 2: GOOD - Parent-scoped semantic selectors
|
|
29
|
+
if (path) {
|
|
30
|
+
selectors.push(...this.generateParentScopedSelectors(element, path));
|
|
31
|
+
}
|
|
32
|
+
// Strategy 3: FALLBACK - nth-match based on sibling position
|
|
33
|
+
if (path) {
|
|
34
|
+
selectors.push(...this.generateNthMatchSelectors(element, path, ref));
|
|
35
|
+
}
|
|
36
|
+
// Strategy 4: LAST RESORT - Generic selectors with first()
|
|
37
|
+
selectors.push(...this.generateGenericFallbacks(element));
|
|
38
|
+
return selectors;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Strategy 1: Unique attributes (most reliable)
|
|
42
|
+
*/
|
|
43
|
+
generateUniqueAttributeSelectors(element) {
|
|
44
|
+
const selectors = [];
|
|
45
|
+
const { tag, name, id, ariaLabel, placeholder, type } = element;
|
|
46
|
+
// name attribute (best for forms)
|
|
47
|
+
if (name && (tag === 'input' || tag === 'textarea' || tag === 'select')) {
|
|
48
|
+
selectors.push(`${tag}[name="${name}"]`);
|
|
49
|
+
}
|
|
50
|
+
// data-testid
|
|
51
|
+
if (element.dataTestId) {
|
|
52
|
+
selectors.push(`[data-testid="${element.dataTestId}"]`);
|
|
53
|
+
}
|
|
54
|
+
// ID (only if stable - avoid auto-generated)
|
|
55
|
+
if (id && !id.match(/^(rc_|:r[0-9]+:|__|«)/)) {
|
|
56
|
+
selectors.push(`#${id}`);
|
|
57
|
+
}
|
|
58
|
+
// aria-label (semantic)
|
|
59
|
+
if (ariaLabel && ariaLabel.length > 0 && ariaLabel.length < 50) {
|
|
60
|
+
selectors.push(`[aria-label="${this.escape(ariaLabel)}"]`);
|
|
61
|
+
}
|
|
62
|
+
// placeholder
|
|
63
|
+
if (placeholder && placeholder.length > 0) {
|
|
64
|
+
selectors.push(`[placeholder="${this.escape(placeholder)}"]`);
|
|
65
|
+
}
|
|
66
|
+
return selectors;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Strategy 2: Parent-scoped selectors (uses hierarchy for uniqueness)
|
|
70
|
+
*/
|
|
71
|
+
generateParentScopedSelectors(element, path) {
|
|
72
|
+
const selectors = [];
|
|
73
|
+
const { role, text, tag } = element;
|
|
74
|
+
const nodes = path.nodes;
|
|
75
|
+
if (nodes.length < 2)
|
|
76
|
+
return selectors; // Need at least parent + target
|
|
77
|
+
// Get parent and grandparent for context
|
|
78
|
+
const parent = nodes[nodes.length - 2];
|
|
79
|
+
const grandparent = nodes.length >= 3 ? nodes[nodes.length - 3] : null;
|
|
80
|
+
// Parent has text content - use it for scoping
|
|
81
|
+
if (parent.name && parent.name.length > 0 && parent.name.length < 50) {
|
|
82
|
+
// Approach 1: Scope by parent text, then find by role
|
|
83
|
+
if (role) {
|
|
84
|
+
selectors.push(`text=${parent.name} >> [role="${role}"]`);
|
|
85
|
+
}
|
|
86
|
+
// Approach 2: Scope by parent text, then find by tag
|
|
87
|
+
if (tag) {
|
|
88
|
+
selectors.push(`text=${parent.name} >> ${tag}`);
|
|
89
|
+
}
|
|
90
|
+
// Approach 3: Use getByText parent chaining (Playwright style)
|
|
91
|
+
if (text && text.length > 0) {
|
|
92
|
+
selectors.push(`text=${parent.name} >> text=${text}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Grandparent scoping (for nested structures)
|
|
96
|
+
if (grandparent && grandparent.name && grandparent.name.length > 0) {
|
|
97
|
+
if (role) {
|
|
98
|
+
selectors.push(`text=${grandparent.name} >> [role="${role}"]`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Text content with role (if element has visible text)
|
|
102
|
+
if (text && text.length > 0 && text.length < 30 && role) {
|
|
103
|
+
selectors.push(`[role="${role}"][aria-label*="${this.escape(text)}"]`);
|
|
104
|
+
}
|
|
105
|
+
return selectors;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Strategy 3: nth-match based on sibling position in ARIA tree
|
|
109
|
+
*/
|
|
110
|
+
generateNthMatchSelectors(element, path, ref) {
|
|
111
|
+
const selectors = [];
|
|
112
|
+
const { role, tag, text } = element;
|
|
113
|
+
const nodes = path.nodes;
|
|
114
|
+
if (nodes.length < 2)
|
|
115
|
+
return selectors;
|
|
116
|
+
const parent = nodes[nodes.length - 2];
|
|
117
|
+
// Find position among siblings with same role
|
|
118
|
+
const siblingsWithSameRole = (parent.children || []).filter((child) => child.role === role);
|
|
119
|
+
const position = siblingsWithSameRole.findIndex((child) => child.ref === ref);
|
|
120
|
+
if (position >= 0) {
|
|
121
|
+
// nth-match by role
|
|
122
|
+
if (role) {
|
|
123
|
+
selectors.push(`[role="${role}"] >> nth=${position}`);
|
|
124
|
+
// Playwright's getByRole with nth
|
|
125
|
+
selectors.push(`getByRole('${role}').nth(${position})`);
|
|
126
|
+
}
|
|
127
|
+
// nth-match by tag
|
|
128
|
+
if (tag) {
|
|
129
|
+
selectors.push(`${tag} >> nth=${position}`);
|
|
130
|
+
selectors.push(`locator('${tag}').nth(${position})`);
|
|
131
|
+
}
|
|
132
|
+
// Special case: first or last
|
|
133
|
+
if (position === 0) {
|
|
134
|
+
if (role)
|
|
135
|
+
selectors.push(`[role="${role}"] >> first`);
|
|
136
|
+
if (tag)
|
|
137
|
+
selectors.push(`${tag} >> first`);
|
|
138
|
+
}
|
|
139
|
+
else if (position === siblingsWithSameRole.length - 1) {
|
|
140
|
+
if (role)
|
|
141
|
+
selectors.push(`[role="${role}"] >> last`);
|
|
142
|
+
if (tag)
|
|
143
|
+
selectors.push(`${tag} >> last`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return selectors;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Strategy 4: Generic fallbacks (last resort)
|
|
150
|
+
*/
|
|
151
|
+
generateGenericFallbacks(element) {
|
|
152
|
+
const selectors = [];
|
|
153
|
+
const { tag, role, text, type } = element;
|
|
154
|
+
// Text content
|
|
155
|
+
if (text && text.length > 0 && text.length < 30) {
|
|
156
|
+
selectors.push(`text=${this.escape(text)}`);
|
|
157
|
+
selectors.push(`getByText('${this.escape(text)}')`);
|
|
158
|
+
}
|
|
159
|
+
// Role only (use first())
|
|
160
|
+
if (role) {
|
|
161
|
+
selectors.push(`[role="${role}"] >> first`);
|
|
162
|
+
selectors.push(`getByRole('${role}').first()`);
|
|
163
|
+
}
|
|
164
|
+
// Type selector
|
|
165
|
+
if (type) {
|
|
166
|
+
selectors.push(`${tag}[type="${type}"] >> first`);
|
|
167
|
+
}
|
|
168
|
+
// Ultimate fallback
|
|
169
|
+
selectors.push(`${tag} >> first`);
|
|
170
|
+
return selectors;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Walk ARIA tree to find path from root to target ref
|
|
174
|
+
*/
|
|
175
|
+
getAriaTreePath(tree, targetRef) {
|
|
176
|
+
const path = [];
|
|
177
|
+
const found = this.walkTree(tree, targetRef, path);
|
|
178
|
+
if (found) {
|
|
179
|
+
return {
|
|
180
|
+
nodes: path,
|
|
181
|
+
targetIndex: path.length - 1
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
walkTree(node, targetRef, path) {
|
|
187
|
+
if (!node)
|
|
188
|
+
return false;
|
|
189
|
+
// Add current node to path
|
|
190
|
+
path.push(node);
|
|
191
|
+
// Found it!
|
|
192
|
+
if (node.ref === targetRef) {
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
// Search children
|
|
196
|
+
if (node.children && Array.isArray(node.children)) {
|
|
197
|
+
for (const child of node.children) {
|
|
198
|
+
if (this.walkTree(child, targetRef, path)) {
|
|
199
|
+
return true; // Found in this subtree
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Not found in this subtree - backtrack
|
|
204
|
+
path.pop();
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
escape(str) {
|
|
208
|
+
return str.replace(/'/g, "\\'").replace(/"/g, '\\"');
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
exports.HierarchicalSelectorGenerator = HierarchicalSelectorGenerator;
|
|
212
|
+
//# sourceMappingURL=hierarchical-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchical-selector.js","sourceRoot":"","sources":["../../src/utils/hierarchical-selector.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAcH,MAAa,6BAA6B;IAGxC,YAAY,MAAoE;QAC9E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,uBAAuB,CACrB,GAAW,EACX,MAAwB,EACxB,QAAa;QAEb,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,EAAE,CAAC,+BAA+B,GAAG,uBAAuB,EAAE,MAAM,CAAC,CAAC;YACjF,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,6CAA6C;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAEjD,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,8DAA8D;QAC9D,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gCAAgC,CAAC,OAAO,CAAC,CAAC,CAAC;QAElE,sDAAsD;QACtD,IAAI,IAAI,EAAE,CAAC;YACT,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,6BAA6B,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,6DAA6D;QAC7D,IAAI,IAAI,EAAE,CAAC;YACT,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACxE,CAAC;QAED,2DAA2D;QAC3D,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;QAE1D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,gCAAgC,CAAC,OAAY;QACnD,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAEhE,kCAAkC;QAClC,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,QAAQ,CAAC,EAAE,CAAC;YACxE,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,UAAU,IAAI,IAAI,CAAC,CAAC;QAC3C,CAAC;QAED,cAAc;QACd,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,SAAS,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAC1D,CAAC;QAED,6CAA6C;QAC7C,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAC7C,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3B,CAAC;QAED,wBAAwB;QACxB,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC/D,SAAS,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC;QAED,cAAc;QACd,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,SAAS,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,6BAA6B,CAAC,OAAY,EAAE,IAAkB;QACpE,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC,CAAE,gCAAgC;QAEzE,yCAAyC;QACzC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEvE,+CAA+C;QAC/C,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACrE,sDAAsD;YACtD,IAAI,IAAI,EAAE,CAAC;gBACT,SAAS,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,IAAI,cAAc,IAAI,IAAI,CAAC,CAAC;YAC5D,CAAC;YAED,qDAAqD;YACrD,IAAI,GAAG,EAAE,CAAC;gBACR,SAAS,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC,CAAC;YAClD,CAAC;YAED,+DAA+D;YAC/D,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,SAAS,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,IAAI,YAAY,IAAI,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,8CAA8C;QAC9C,IAAI,WAAW,IAAI,WAAW,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnE,IAAI,IAAI,EAAE,CAAC;gBACT,SAAS,CAAC,IAAI,CAAC,QAAQ,WAAW,CAAC,IAAI,cAAc,IAAI,IAAI,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,uDAAuD;QACvD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;YACxD,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,mBAAmB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,yBAAyB,CAAC,OAAY,EAAE,IAAkB,EAAE,GAAW;QAC7E,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAEzB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAEvC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEvC,8CAA8C;QAC9C,MAAM,oBAAoB,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAe,EAAE,EAAE,CAC9E,KAAK,CAAC,IAAI,KAAK,IAAI,CACpB,CAAC;QAEF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC,KAAe,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAExF,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,oBAAoB;YACpB,IAAI,IAAI,EAAE,CAAC;gBACT,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,aAAa,QAAQ,EAAE,CAAC,CAAC;gBACtD,kCAAkC;gBAClC,SAAS,CAAC,IAAI,CAAC,cAAc,IAAI,UAAU,QAAQ,GAAG,CAAC,CAAC;YAC1D,CAAC;YAED,mBAAmB;YACnB,IAAI,GAAG,EAAE,CAAC;gBACR,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,WAAW,QAAQ,EAAE,CAAC,CAAC;gBAC5C,SAAS,CAAC,IAAI,CAAC,YAAY,GAAG,UAAU,QAAQ,GAAG,CAAC,CAAC;YACvD,CAAC;YAED,8BAA8B;YAC9B,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,IAAI,IAAI;oBAAE,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC;gBACtD,IAAI,GAAG;oBAAE,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC;YAC7C,CAAC;iBAAM,IAAI,QAAQ,KAAK,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxD,IAAI,IAAI;oBAAE,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,YAAY,CAAC,CAAC;gBACrD,IAAI,GAAG;oBAAE,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,wBAAwB,CAAC,OAAY;QAC3C,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAE1C,eAAe;QACf,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAChD,SAAS,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5C,SAAS,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,EAAE,CAAC;YACT,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC;YAC5C,SAAS,CAAC,IAAI,CAAC,cAAc,IAAI,YAAY,CAAC,CAAC;QACjD,CAAC;QAED,gBAAgB;QAChB,IAAI,IAAI,EAAE,CAAC;YACT,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,UAAU,IAAI,aAAa,CAAC,CAAC;QACpD,CAAC;QAED,oBAAoB;QACpB,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC;QAElC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAAS,EAAE,SAAiB;QAClD,MAAM,IAAI,GAAe,EAAE,CAAC;QAE5B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QAEnD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC;aAC7B,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,QAAQ,CAAC,IAAS,EAAE,SAAiB,EAAE,IAAgB;QAC7D,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAExB,2BAA2B;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhB,YAAY;QACZ,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kBAAkB;QAClB,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;oBAC1C,OAAO,IAAI,CAAC,CAAE,wBAAwB;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,MAAM,CAAC,GAAW;QACxB,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;CACF;AA1PD,sEA0PC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Page Info Retry Utility
|
|
3
|
+
* Handles adaptive page loading with exponential backoff
|
|
4
|
+
*/
|
|
5
|
+
import { PageInfo } from './page-info-utils';
|
|
6
|
+
export declare class PageInfoRetry {
|
|
7
|
+
/**
|
|
8
|
+
* Get page info with retry logic - waits for interactive elements to appear
|
|
9
|
+
* Uses exponential backoff to handle slow-loading React/Vue/Angular apps
|
|
10
|
+
*/
|
|
11
|
+
static getWithRetry(page: any, maxAttempts?: number): Promise<PageInfo>;
|
|
12
|
+
private static calculateTotalWaitTime;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=page-info-retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-info-retry.d.ts","sourceRoot":"","sources":["../../src/utils/page-info-retry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElE,qBAAa,aAAa;IACxB;;;OAGG;WACU,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,GAAE,MAAU,GAAG,OAAO,CAAC,QAAQ,CAAC;IA0ChF,OAAO,CAAC,MAAM,CAAC,sBAAsB;CAStC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Page Info Retry Utility
|
|
4
|
+
* Handles adaptive page loading with exponential backoff
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PageInfoRetry = void 0;
|
|
8
|
+
const page_info_utils_1 = require("./page-info-utils");
|
|
9
|
+
class PageInfoRetry {
|
|
10
|
+
/**
|
|
11
|
+
* Get page info with retry logic - waits for interactive elements to appear
|
|
12
|
+
* Uses exponential backoff to handle slow-loading React/Vue/Angular apps
|
|
13
|
+
*/
|
|
14
|
+
static async getWithRetry(page, maxAttempts = 6) {
|
|
15
|
+
// Wait for initial page load (generous timeout for slow apps)
|
|
16
|
+
try {
|
|
17
|
+
await page.waitForLoadState('domcontentloaded', { timeout: 20000 }).catch(() => { });
|
|
18
|
+
}
|
|
19
|
+
catch (waitError) {
|
|
20
|
+
// Continue even if wait fails
|
|
21
|
+
}
|
|
22
|
+
let attempt = 0;
|
|
23
|
+
let backoffMs = 1000; // Start with 1 second (adequate for most sites)
|
|
24
|
+
while (attempt < maxAttempts) {
|
|
25
|
+
attempt++;
|
|
26
|
+
// Try to extract page info
|
|
27
|
+
const pageInfo = await (0, page_info_utils_1.getEnhancedPageInfo)(page);
|
|
28
|
+
// If we got a reasonable number of elements, we're done
|
|
29
|
+
if (pageInfo.interactiveElements && pageInfo.interactiveElements.length >= 3) {
|
|
30
|
+
if (attempt > 1) {
|
|
31
|
+
console.log(`[PageInfoRetry] ✓ Page elements loaded after ${attempt} attempts`);
|
|
32
|
+
}
|
|
33
|
+
return pageInfo;
|
|
34
|
+
}
|
|
35
|
+
// If this is the last attempt, return what we have
|
|
36
|
+
if (attempt >= maxAttempts) {
|
|
37
|
+
const totalWait = this.calculateTotalWaitTime(maxAttempts);
|
|
38
|
+
console.log(`[PageInfoRetry] ⚠️ Only found ${pageInfo.interactiveElements?.length || 0} elements after ${maxAttempts} attempts (total wait: ~${totalWait}ms)`);
|
|
39
|
+
return pageInfo;
|
|
40
|
+
}
|
|
41
|
+
// Wait with exponential backoff before retrying
|
|
42
|
+
console.log(`[PageInfoRetry] Only ${pageInfo.interactiveElements?.length || 0} elements found (attempt ${attempt}/${maxAttempts}), waiting ${backoffMs}ms...`);
|
|
43
|
+
await page.waitForTimeout(backoffMs);
|
|
44
|
+
backoffMs = Math.min(backoffMs * 1.6, 15000); // Cap at 15 seconds per attempt
|
|
45
|
+
}
|
|
46
|
+
// Fallback (shouldn't reach here, but for type safety)
|
|
47
|
+
return await (0, page_info_utils_1.getEnhancedPageInfo)(page);
|
|
48
|
+
}
|
|
49
|
+
static calculateTotalWaitTime(maxAttempts) {
|
|
50
|
+
let total = 0;
|
|
51
|
+
let backoffMs = 1000;
|
|
52
|
+
for (let i = 1; i < maxAttempts; i++) {
|
|
53
|
+
total += backoffMs;
|
|
54
|
+
backoffMs = Math.min(backoffMs * 1.6, 15000);
|
|
55
|
+
}
|
|
56
|
+
return Math.round(total);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.PageInfoRetry = PageInfoRetry;
|
|
60
|
+
//# sourceMappingURL=page-info-retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-info-retry.js","sourceRoot":"","sources":["../../src/utils/page-info-retry.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,uDAAkE;AAElE,MAAa,aAAa;IACxB;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAS,EAAE,cAAsB,CAAC;QAC1D,8DAA8D;QAC9D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtF,CAAC;QAAC,OAAO,SAAS,EAAE,CAAC;YACnB,8BAA8B;QAChC,CAAC;QAED,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,SAAS,GAAG,IAAI,CAAC,CAAC,gDAAgD;QAEtE,OAAO,OAAO,GAAG,WAAW,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;YAEV,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,MAAM,IAAA,qCAAmB,EAAC,IAAI,CAAC,CAAC;YAEjD,wDAAwD;YACxD,IAAI,QAAQ,CAAC,mBAAmB,IAAI,QAAQ,CAAC,mBAAmB,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC7E,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,gDAAgD,OAAO,WAAW,CAAC,CAAC;gBAClF,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,mDAAmD;YACnD,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;gBAC3D,OAAO,CAAC,GAAG,CAAC,kCAAkC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,IAAI,CAAC,mBAAmB,WAAW,2BAA2B,SAAS,KAAK,CAAC,CAAC;gBAChK,OAAO,QAAQ,CAAC;YAClB,CAAC;YAED,gDAAgD;YAChD,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,IAAI,CAAC,4BAA4B,OAAO,IAAI,WAAW,cAAc,SAAS,OAAO,CAAC,CAAC;YAC/J,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACrC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,gCAAgC;QAChF,CAAC;QAED,uDAAuD;QACvD,OAAO,MAAM,IAAA,qCAAmB,EAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAEO,MAAM,CAAC,sBAAsB,CAAC,WAAmB;QACvD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,KAAK,IAAI,SAAS,CAAC;YACnB,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;CACF;AAxDD,sCAwDC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-info-utils.d.ts","sourceRoot":"","sources":["../../src/utils/page-info-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC;IAC5D,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,GAAG,CAAC;IAClB,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACxE,wBAAsB,mBAAmB,CAAC,WAAW,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,GAAG,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"page-info-utils.d.ts","sourceRoot":"","sources":["../../src/utils/page-info-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC;IAC5D,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,GAAG,CAAC;IAClB,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACxE,wBAAsB,mBAAmB,CAAC,WAAW,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,GAAG,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC"}
|