@testmuai/playwright-bindings 0.1.25 → 0.1.26
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/healPatch.d.ts.map +1 -1
- package/dist/healPatch.js +12 -1
- package/dist/healPatch.js.map +1 -1
- package/dist/helpers/autohealAx.d.ts +16 -0
- package/dist/helpers/autohealAx.d.ts.map +1 -1
- package/dist/helpers/autohealAx.js +66 -14
- package/dist/helpers/autohealAx.js.map +1 -1
- package/dist/helpers/axTree/captureAxTree.d.ts +8 -19
- package/dist/helpers/axTree/captureAxTree.d.ts.map +1 -1
- package/dist/helpers/axTree/captureAxTree.js +7 -101
- package/dist/helpers/axTree/captureAxTree.js.map +1 -1
- package/dist/helpers/axTree/captureFrameForest.d.ts +44 -0
- package/dist/helpers/axTree/captureFrameForest.d.ts.map +1 -0
- package/dist/helpers/axTree/captureFrameForest.js +417 -0
- package/dist/helpers/axTree/captureFrameForest.js.map +1 -0
- package/dist/helpers/axTree/index.d.ts +2 -0
- package/dist/helpers/axTree/index.d.ts.map +1 -1
- package/dist/helpers/axTree/index.js +1 -0
- package/dist/helpers/axTree/index.js.map +1 -1
- package/package.json +1 -1
package/dist/healPatch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"healPatch.d.ts","sourceRoot":"","sources":["../src/healPatch.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAgB,KAAK,IAAI,
|
|
1
|
+
{"version":3,"file":"healPatch.d.ts","sourceRoot":"","sources":["../src/healPatch.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAgB,KAAK,IAAI,EAAqB,MAAM,YAAY,CAAC;AA8PxE;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI,CAUvD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAU3D;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
package/dist/healPatch.js
CHANGED
|
@@ -80,7 +80,18 @@ async function tryAh2LocatorHeal(loc, original, name, args, description) {
|
|
|
80
80
|
return { healed: false };
|
|
81
81
|
const selector = healed.locatorType === 'xpath' ? `xpath=${healed.locator}` : healed.locator;
|
|
82
82
|
try {
|
|
83
|
-
|
|
83
|
+
// Frame-scoped heal: rebuild the frame chain (root→leaf) so an iframe-
|
|
84
|
+
// resident element is retried in its own frame, not at the top level
|
|
85
|
+
// (where a frame-relative selector cannot resolve).
|
|
86
|
+
let root = page;
|
|
87
|
+
for (const fr of healed.frameChain ?? []) {
|
|
88
|
+
const fsel = fr.locatorType === 'xpath' ? `xpath=${fr.locator}` : fr.locator;
|
|
89
|
+
root = root.frameLocator(fsel);
|
|
90
|
+
}
|
|
91
|
+
const fresh = root.locator(selector);
|
|
92
|
+
// The retry runs the UNWRAPPED `original` on the fresh locator, so it
|
|
93
|
+
// cannot recurse back into this wrapper (JS's built-in bound; PY needs an
|
|
94
|
+
// explicit _in_heal guard because it replays the patched method instead).
|
|
84
95
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
85
96
|
const value = await original.apply(fresh, withCappedTimeout(name, args));
|
|
86
97
|
log.helper(`[heal] ${name} '${description}' → fresh locator ${selector.slice(0, 80)}`);
|
package/dist/healPatch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"healPatch.js","sourceRoot":"","sources":["../src/healPatch.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"healPatch.js","sourceRoot":"","sources":["../src/healPatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,11 +15,27 @@
|
|
|
15
15
|
* transport/other error). NEVER throws.
|
|
16
16
|
*/
|
|
17
17
|
import type { Page } from 'playwright';
|
|
18
|
+
import { type FrameCapture } from './axTree/index.js';
|
|
19
|
+
/** One iframe in the healed element's frame chain (root→leaf), for the retry. */
|
|
20
|
+
export interface FrameChainEntry {
|
|
21
|
+
locator: string;
|
|
22
|
+
locatorType: string;
|
|
23
|
+
}
|
|
18
24
|
export interface LocatorHeal {
|
|
19
25
|
locator: string;
|
|
20
26
|
locatorType: string;
|
|
27
|
+
/** Ordered iframe chain (root→leaf) scoping the target; empty for main frame. */
|
|
28
|
+
frameChain: FrameChainEntry[];
|
|
21
29
|
confidence: number;
|
|
22
30
|
reasoning: string;
|
|
23
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* DFS the frame forest for the chain of captures from a top-level iframe down
|
|
34
|
+
* to the one owning `targetFrameId`. Returns the ordered list (root→leaf) or
|
|
35
|
+
* null when the frame isn't in the forest. Mirrors Python `_find_frame_path`.
|
|
36
|
+
*/
|
|
37
|
+
declare function findFramePath(frameCaptures: FrameCapture[] | undefined, targetFrameId: string): FrameCapture[] | null;
|
|
38
|
+
export declare const _findFramePath: typeof findFramePath;
|
|
24
39
|
export declare function runLocatorHeal(page: Page, actionInstruction: string, actionType: string, previousSelectors?: string, confidenceFloor?: number): Promise<LocatorHeal | null>;
|
|
40
|
+
export {};
|
|
25
41
|
//# sourceMappingURL=autohealAx.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autohealAx.d.ts","sourceRoot":"","sources":["../../src/helpers/autohealAx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"autohealAx.d.ts","sourceRoot":"","sources":["../../src/helpers/autohealAx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAM3B,iFAAiF;AACjF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AA4BD;;;;GAIG;AACH,iBAAS,aAAa,CACpB,aAAa,EAAE,YAAY,EAAE,GAAG,SAAS,EACzC,aAAa,EAAE,MAAM,GACpB,YAAY,EAAE,GAAG,IAAI,CAOvB;AAwCD,eAAO,MAAM,cAAc,sBAAgB,CAAC;AAE5C,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,iBAAiB,EAAE,MAAM,EACzB,UAAU,EAAE,MAAM,EAClB,iBAAiB,SAAK,EACtB,eAAe,SAAM,GACpB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA4D7B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { config } from '../config.js';
|
|
2
2
|
import { fetchWithAuth } from '../http.js';
|
|
3
3
|
import { log } from '../log.js';
|
|
4
|
-
import {
|
|
4
|
+
import { captureFrameForest, serializeAxTree, resolveSessionForFrame, } from './axTree/index.js';
|
|
5
5
|
import { enrichElementLocator } from './textualAnalyzer/locatorEnrichment.js';
|
|
6
6
|
const HEAL_TIMEOUT_MS = 60_000;
|
|
7
7
|
const VALID_ACTION_TYPES = new Set(['click', 'select', 'type', 'scroll']);
|
|
@@ -28,26 +28,67 @@ async function postAxHeal(url, body) {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* ref carries `frame_id == ""`), so this always opens a fresh main-page
|
|
35
|
-
* session — identical to what the Python `resolve_session_for_frame` does for
|
|
36
|
-
* the `""` main-frame convention. Frame-scoped routing (the Python
|
|
37
|
-
* `_frame_capture.resolve_session_for_frame` OOPIF path) lands together with
|
|
38
|
-
* frame-aware capture as a documented follow-up. Caller owns detaching it.
|
|
31
|
+
* DFS the frame forest for the chain of captures from a top-level iframe down
|
|
32
|
+
* to the one owning `targetFrameId`. Returns the ordered list (root→leaf) or
|
|
33
|
+
* null when the frame isn't in the forest. Mirrors Python `_find_frame_path`.
|
|
39
34
|
*/
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
function findFramePath(frameCaptures, targetFrameId) {
|
|
36
|
+
for (const fc of frameCaptures ?? []) {
|
|
37
|
+
if (fc.frameId === targetFrameId)
|
|
38
|
+
return [fc];
|
|
39
|
+
const sub = findFramePath(fc.children, targetFrameId);
|
|
40
|
+
if (sub !== null)
|
|
41
|
+
return [fc, ...sub];
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
42
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve the ordered iframe locator chain (root→leaf) that scopes
|
|
47
|
+
* `targetFrameId`. Each iframe's owner element is enriched on its PARENT
|
|
48
|
+
* frame's session (the first on the main frame). Returns null on any failure
|
|
49
|
+
* (frame not found, missing owner id, enrichment miss) so the caller fails safe.
|
|
50
|
+
* Mirrors Python `_build_frame_chain`.
|
|
51
|
+
*/
|
|
52
|
+
async function buildFrameChain(page, frameCaptures, targetFrameId) {
|
|
53
|
+
const path = findFramePath(frameCaptures, targetFrameId);
|
|
54
|
+
if (!path)
|
|
55
|
+
return null;
|
|
56
|
+
const chain = [];
|
|
57
|
+
let parentFrameId = ''; // the first iframe's owner lives in the main frame
|
|
58
|
+
for (const fc of path) {
|
|
59
|
+
const owner = fc.ownerBackendNodeId;
|
|
60
|
+
if (owner == null)
|
|
61
|
+
return null;
|
|
62
|
+
const cdp = await resolveSessionForFrame(page, parentFrameId);
|
|
63
|
+
let enriched;
|
|
64
|
+
try {
|
|
65
|
+
enriched = await enrichElementLocator(cdp, { backendDomNodeId: owner });
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
try {
|
|
69
|
+
await cdp.detach();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
/* ignore */
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (!enriched || !enriched.locator)
|
|
76
|
+
return null;
|
|
77
|
+
chain.push({ locator: enriched.locator, locatorType: enriched.locatorType ?? 'css' });
|
|
78
|
+
parentFrameId = fc.frameId;
|
|
79
|
+
}
|
|
80
|
+
return chain;
|
|
81
|
+
}
|
|
82
|
+
// Exposed for unit tests (frame-path walk over a synthetic forest).
|
|
83
|
+
export const _findFramePath = findFramePath;
|
|
43
84
|
export async function runLocatorHeal(page, actionInstruction, actionType, previousSelectors = '', confidenceFloor = 0.7) {
|
|
44
85
|
if (!config.current.smart || !VALID_ACTION_TYPES.has(actionType))
|
|
45
86
|
return null;
|
|
46
87
|
try {
|
|
47
|
-
const
|
|
48
|
-
if (
|
|
88
|
+
const forest = await captureFrameForest(page);
|
|
89
|
+
if (forest.mainTree === null)
|
|
49
90
|
return null;
|
|
50
|
-
const { doc, refTable } =
|
|
91
|
+
const { doc, refTable } = serializeAxTree(forest.mainTree, forest.frameCaptures);
|
|
51
92
|
const body = {
|
|
52
93
|
action_instruction: actionInstruction,
|
|
53
94
|
action_type: actionType,
|
|
@@ -81,9 +122,20 @@ export async function runLocatorHeal(page, actionInstruction, actionType, previo
|
|
|
81
122
|
}
|
|
82
123
|
if (!enriched || !enriched.locator)
|
|
83
124
|
return null;
|
|
125
|
+
// An iframe-resident element's selector is frame-relative and cannot
|
|
126
|
+
// resolve at the top level — rebuild the frame chain so the retry can scope
|
|
127
|
+
// into it. Fail safe (return null) if it can't be reconstructed.
|
|
128
|
+
let frameChain = [];
|
|
129
|
+
if (entry.frame_id) {
|
|
130
|
+
const built = await buildFrameChain(page, forest.frameCaptures, entry.frame_id);
|
|
131
|
+
if (built === null)
|
|
132
|
+
return null;
|
|
133
|
+
frameChain = built;
|
|
134
|
+
}
|
|
84
135
|
return {
|
|
85
136
|
locator: enriched.locator,
|
|
86
137
|
locatorType: enriched.locatorType ?? 'css',
|
|
138
|
+
frameChain,
|
|
87
139
|
confidence,
|
|
88
140
|
reasoning: typeof resp['reasoning'] === 'string' ? resp['reasoning'] : '',
|
|
89
141
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autohealAx.js","sourceRoot":"","sources":["../../src/helpers/autohealAx.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"autohealAx.js","sourceRoot":"","sources":["../../src/helpers/autohealAx.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,sBAAsB,GAEvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAE9E,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AAiB1E,SAAS,OAAO;IACd,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,sBAAsB,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,GAAW,EACX,IAA6B;IAE7B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE;YACpC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC;SAC7C,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,iBAAiB,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CACpB,aAAyC,EACzC,aAAqB;IAErB,KAAK,MAAM,EAAE,IAAI,aAAa,IAAI,EAAE,EAAE,CAAC;QACrC,IAAI,EAAE,CAAC,OAAO,KAAK,aAAa;YAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACtD,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,CAAC,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,eAAe,CAC5B,IAAU,EACV,aAA6B,EAC7B,aAAqB;IAErB,MAAM,IAAI,GAAG,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,IAAI,aAAa,GAAG,EAAE,CAAC,CAAC,mDAAmD;IAC3E,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,EAAE,CAAC,kBAAkB,CAAC;QACpC,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAC9D,IAAI,QAAyD,CAAC;QAC9D,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,KAAK,EAAE,CAAC,CAAC;QACtF,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAU,EACV,iBAAyB,EACzB,UAAkB,EAClB,iBAAiB,GAAG,EAAE,EACtB,eAAe,GAAG,GAAG;IAErB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC1C,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAEjF,MAAM,IAAI,GAAG;YACX,kBAAkB,EAAE,iBAAiB;YACrC,WAAW,EAAE,UAAU;YACvB,YAAY,EAAE,GAAG;YACjB,kBAAkB,EAAE,iBAAiB,IAAI,EAAE;SAC5C,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEvC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,IAAI,UAAU,GAAG,eAAe,EAAE,CAAC;YACjC,GAAG,CAAC,MAAM,CAAC,4BAA4B,UAAU,YAAY,eAAe,EAAE,CAAC,CAAC;YAChF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,mBAAmB,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAE7D,+EAA+E;QAC/E,MAAM,GAAG,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAI,QAAyD,CAAC;QAC9D,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,EAAE,gBAAgB,EAAE,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC9F,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAEhD,qEAAqE;QACrE,4EAA4E;QAC5E,iEAAiE;QACjE,IAAI,UAAU,GAAsB,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAChF,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAChC,UAAU,GAAG,KAAK,CAAC;QACrB,CAAC;QAED,OAAO;YACL,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,KAAK;YAC1C,UAAU;YACV,UAAU;YACV,SAAS,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,WAAW,CAAY,CAAC,CAAC,CAAC,EAAE;SACtF,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -1,29 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Frame-aware AX capture → greppable doc + per-step ref table (TS).
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* + `
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* here; this matches the v16-server's stated main-frame acceptance. The
|
|
9
|
-
* serializer (`serializeAxTree`) supports the frame-merge whole, so the
|
|
10
|
-
* `e<N>` doc + refTable format is already byte-identical to Python's
|
|
11
|
-
* frame-aware output — only the OOPIF *capture* is deferred.
|
|
12
|
-
*
|
|
13
|
-
* Plumbing mirrors `textualAnalyzer/domStructured.ts`: page.context()
|
|
14
|
-
* .newCDPSession → Accessibility.getFullAXTree → build the AxNode tree →
|
|
15
|
-
* serializeAxTree. Unlike domStructured it fetches NO bounding boxes (the
|
|
16
|
-
* serializer is a pure structural walk with no viewport filter — Python's
|
|
17
|
-
* capture passes skip_bounding_boxes=True on this path), and it normalizes
|
|
18
|
-
* CDP tri-state strings ("true"/"false"/"mixed") before rendering.
|
|
4
|
+
* Thin wrapper over `captureFrameForest` (main frame + every eligible iframe)
|
|
5
|
+
* + `serializeAxTree` (inlines each frame's content under its `iframe` node in
|
|
6
|
+
* one continuous `e<N>` ref space; iframe-resident refs carry their `frame_id`).
|
|
7
|
+
* Byte-identical to the Python `capture_ax_tree` (`_capture.py`). Never throws.
|
|
19
8
|
*/
|
|
20
9
|
import type { Page } from 'playwright';
|
|
21
10
|
import { type RefTable } from './serializeAxTree.js';
|
|
22
11
|
/**
|
|
23
|
-
* Capture the page's
|
|
12
|
+
* Capture the page's frame-aware AX document + per-step ref table.
|
|
24
13
|
*
|
|
25
|
-
* @returns `{ doc, refTable }`, or `null` when the tree is empty
|
|
26
|
-
*
|
|
14
|
+
* @returns `{ doc, refTable }`, or `null` when the main tree is empty / capture
|
|
15
|
+
* failed (never throws).
|
|
27
16
|
*/
|
|
28
17
|
export declare function captureAxTree(page: Page): Promise<{
|
|
29
18
|
doc: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captureAxTree.d.ts","sourceRoot":"","sources":["../../../src/helpers/axTree/captureAxTree.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"captureAxTree.d.ts","sourceRoot":"","sources":["../../../src/helpers/axTree/captureAxTree.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGtE;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAAG,IAAI,CAAC,CAInG"}
|
|
@@ -1,109 +1,15 @@
|
|
|
1
|
-
import { log } from '../../log.js';
|
|
2
1
|
import { serializeAxTree } from './serializeAxTree.js';
|
|
3
|
-
|
|
4
|
-
function cdpProp(properties, name) {
|
|
5
|
-
if (!properties)
|
|
6
|
-
return null;
|
|
7
|
-
for (const p of properties) {
|
|
8
|
-
if (p['name'] === name) {
|
|
9
|
-
const v = p['value'];
|
|
10
|
-
return typeof v === 'object' && v !== null ? v.value ?? null : null;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
/** A CDP AXValue's `.value` as a string. */
|
|
16
|
-
function axValue(node, key) {
|
|
17
|
-
const info = node[key];
|
|
18
|
-
return typeof info === 'object' && info !== null
|
|
19
|
-
? String(info.value ?? '')
|
|
20
|
-
: '';
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Normalize a tri-state AX value to true / false / "mixed" / null.
|
|
24
|
-
* CDP reports `checked`/`pressed` as the STRINGS "true"/"false"/"mixed"; the
|
|
25
|
-
* serializer's state rendering keys on real booleans / "mixed", so an
|
|
26
|
-
* unchecked box would otherwise render as [checked] (JS "false" is truthy).
|
|
27
|
-
* Mirrors Python `_normalize_tristate`.
|
|
28
|
-
*/
|
|
29
|
-
function normalizeTristate(value) {
|
|
30
|
-
if (typeof value === 'boolean' || value == null)
|
|
31
|
-
return value ?? null;
|
|
32
|
-
if (typeof value === 'string') {
|
|
33
|
-
const lowered = value.trim().toLowerCase();
|
|
34
|
-
if (lowered === 'true')
|
|
35
|
-
return true;
|
|
36
|
-
if (lowered === 'false')
|
|
37
|
-
return false;
|
|
38
|
-
if (lowered === 'mixed')
|
|
39
|
-
return 'mixed';
|
|
40
|
-
}
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
function parseNode(node, byId) {
|
|
44
|
-
const props = node['properties'];
|
|
45
|
-
const children = [];
|
|
46
|
-
for (const cid of node['childIds'] ?? []) {
|
|
47
|
-
const child = byId.get(cid);
|
|
48
|
-
if (child)
|
|
49
|
-
children.push(parseNode(child, byId));
|
|
50
|
-
}
|
|
51
|
-
const levelRaw = cdpProp(props, 'level');
|
|
52
|
-
return {
|
|
53
|
-
role: axValue(node, 'role'),
|
|
54
|
-
name: axValue(node, 'name'),
|
|
55
|
-
value: axValue(node, 'value') || null,
|
|
56
|
-
url: cdpProp(props, 'url') ?? null,
|
|
57
|
-
level: typeof levelRaw === 'number' ? levelRaw : levelRaw != null ? Number(levelRaw) : null,
|
|
58
|
-
checked: normalizeTristate(cdpProp(props, 'checked')),
|
|
59
|
-
pressed: normalizeTristate(cdpProp(props, 'pressed')),
|
|
60
|
-
disabled: Boolean(cdpProp(props, 'disabled')),
|
|
61
|
-
selected: cdpProp(props, 'selected') ?? null,
|
|
62
|
-
expanded: cdpProp(props, 'expanded') ?? null,
|
|
63
|
-
required: Boolean(cdpProp(props, 'required')),
|
|
64
|
-
readonly: Boolean(cdpProp(props, 'readonly')),
|
|
65
|
-
focused: Boolean(cdpProp(props, 'focused')),
|
|
66
|
-
backendDomNodeId: node['backendDOMNodeId'] ?? null,
|
|
67
|
-
children,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
2
|
+
import { captureFrameForest } from './captureFrameForest.js';
|
|
70
3
|
/**
|
|
71
|
-
* Capture the page's
|
|
4
|
+
* Capture the page's frame-aware AX document + per-step ref table.
|
|
72
5
|
*
|
|
73
|
-
* @returns `{ doc, refTable }`, or `null` when the tree is empty
|
|
74
|
-
*
|
|
6
|
+
* @returns `{ doc, refTable }`, or `null` when the main tree is empty / capture
|
|
7
|
+
* failed (never throws).
|
|
75
8
|
*/
|
|
76
9
|
export async function captureAxTree(page) {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
cdp = await page.context().newCDPSession(page);
|
|
80
|
-
const result = (await cdp.send('Accessibility.getFullAXTree', {}));
|
|
81
|
-
const nodes = result.nodes ?? [];
|
|
82
|
-
if (nodes.length === 0)
|
|
83
|
-
return null;
|
|
84
|
-
const byId = new Map();
|
|
85
|
-
for (const node of nodes) {
|
|
86
|
-
const nid = node['nodeId'];
|
|
87
|
-
if (nid)
|
|
88
|
-
byId.set(nid, node);
|
|
89
|
-
}
|
|
90
|
-
const root = nodes.find((n) => !n['parentId']) ?? nodes[0];
|
|
91
|
-
const tree = parseNode(root, byId);
|
|
92
|
-
return serializeAxTree(tree);
|
|
93
|
-
}
|
|
94
|
-
catch (e) {
|
|
95
|
-
log.warn(`[autoheal_ax] capture failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
10
|
+
const forest = await captureFrameForest(page);
|
|
11
|
+
if (forest.mainTree === null)
|
|
96
12
|
return null;
|
|
97
|
-
|
|
98
|
-
finally {
|
|
99
|
-
if (cdp) {
|
|
100
|
-
try {
|
|
101
|
-
await cdp.detach();
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
/* ignore */
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
13
|
+
return serializeAxTree(forest.mainTree, forest.frameCaptures);
|
|
108
14
|
}
|
|
109
15
|
//# sourceMappingURL=captureAxTree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captureAxTree.js","sourceRoot":"","sources":["../../../src/helpers/axTree/captureAxTree.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"captureAxTree.js","sourceRoot":"","sources":["../../../src/helpers/axTree/captureAxTree.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,eAAe,EAAiB,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAU;IAC5C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame-aware AX capture (TS) — faithful port of the Python
|
|
3
|
+
* `testmu/_helpers/ax_tree/_frame_capture.py`.
|
|
4
|
+
*
|
|
5
|
+
* Captures the main frame plus every eligible iframe (same-process via the
|
|
6
|
+
* ancestor session's `Accessibility.getFullAXTree({ frameId })`, OOPIF via a
|
|
7
|
+
* dedicated per-frame CDP session) into one `FrameForest` the serializer
|
|
8
|
+
* inlines under each `iframe` node. Discovery is driven by the captured AX
|
|
9
|
+
* tree's own `iframe` nodes, level by level (concurrent within a level).
|
|
10
|
+
* Never throws: any unrecoverable failure downgrades to main-frame-only.
|
|
11
|
+
*/
|
|
12
|
+
import type { Page, CDPSession } from 'playwright';
|
|
13
|
+
import type { AxNode, FrameCapture } from './serializeAxTree.js';
|
|
14
|
+
/** Whole-page capture: the main tree + its (possibly empty) iframe forest. */
|
|
15
|
+
export interface FrameForest {
|
|
16
|
+
mainTree: AxNode | null;
|
|
17
|
+
frameCaptures: FrameCapture[];
|
|
18
|
+
}
|
|
19
|
+
type CdpNode = Record<string, unknown>;
|
|
20
|
+
/** Build an AxNode subtree from a CDP node + its id index. */
|
|
21
|
+
export declare function parseNode(node: CdpNode, byId: Map<string, CdpNode>): AxNode;
|
|
22
|
+
/**
|
|
23
|
+
* Capture one AX tree via a CDP session. `frameId` scopes `getFullAXTree` to a
|
|
24
|
+
* same-process child frame on the ancestor session; omit it for an OOPIF's own
|
|
25
|
+
* dedicated session (its default root IS that frame). No bounding boxes.
|
|
26
|
+
* Mirrors Python `_capture_ax_tree_via_session` (skip_bounding_boxes=True path).
|
|
27
|
+
*/
|
|
28
|
+
export declare function captureTreeViaSession(session: CDPSession, frameId?: string | null): Promise<AxNode | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Capture the main frame plus every eligible iframe, merge-ready.
|
|
31
|
+
*
|
|
32
|
+
* Fast path: pages with no iframes (`page.frames().length <= 1`) skip all
|
|
33
|
+
* frame-resolution CDP calls. Never throws — downgrades to main-frame-only.
|
|
34
|
+
*/
|
|
35
|
+
export declare function captureFrameForest(page: Page): Promise<FrameForest>;
|
|
36
|
+
/**
|
|
37
|
+
* Resolve a live CDP session whose DOM domain can act on `frameId`'s nodes —
|
|
38
|
+
* the grounding counterpart to capture-time session routing. `frameId === ""`
|
|
39
|
+
* (main-frame convention) → a fresh page session. Any resolution failure falls
|
|
40
|
+
* back to a fresh main-page session (never throws). Caller owns detaching it.
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveSessionForFrame(page: Page, frameId: string): Promise<CDPSession>;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=captureFrameForest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captureFrameForest.d.ts","sourceRoot":"","sources":["../../../src/helpers/axTree/captureFrameForest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,IAAI,EAAS,UAAU,EAAkB,MAAM,YAAY,CAAC;AAE1E,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEjE,8EAA8E;AAC9E,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAUD,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAsCvC,8DAA8D;AAC9D,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAyB3E;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,UAAU,EACnB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAexB;AAsKD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CA4GzE;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAqC7F"}
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
import { log } from '../../log.js';
|
|
2
|
+
const FRAME_ROLE = 'iframe';
|
|
3
|
+
const FRAME_DEPTH_BACKSTOP = 10;
|
|
4
|
+
// Substring (lowercased) of Playwright's error when newCDPSession is called on
|
|
5
|
+
// a SAME-PROCESS frame ("This frame does not have a separate CDP session…").
|
|
6
|
+
const NO_DEDICATED_SESSION_HINT = 'separate cdp session';
|
|
7
|
+
/** Extract a CDP property's `.value.value`, or null. */
|
|
8
|
+
function cdpProp(properties, name) {
|
|
9
|
+
if (!properties)
|
|
10
|
+
return null;
|
|
11
|
+
for (const p of properties) {
|
|
12
|
+
if (p['name'] === name) {
|
|
13
|
+
const v = p['value'];
|
|
14
|
+
return typeof v === 'object' && v !== null ? v.value ?? null : null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
/** A CDP AXValue's `.value` as a string. */
|
|
20
|
+
function axValue(node, key) {
|
|
21
|
+
const info = node[key];
|
|
22
|
+
return typeof info === 'object' && info !== null
|
|
23
|
+
? String(info.value ?? '')
|
|
24
|
+
: '';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Normalize a tri-state AX value to true / false / "mixed" / null. CDP reports
|
|
28
|
+
* `checked`/`pressed` as the STRINGS "true"/"false"/"mixed". Mirrors Python
|
|
29
|
+
* `_normalize_tristate`.
|
|
30
|
+
*/
|
|
31
|
+
function normalizeTristate(value) {
|
|
32
|
+
if (typeof value === 'boolean' || value == null)
|
|
33
|
+
return value ?? null;
|
|
34
|
+
if (typeof value === 'string') {
|
|
35
|
+
const lowered = value.trim().toLowerCase();
|
|
36
|
+
if (lowered === 'true')
|
|
37
|
+
return true;
|
|
38
|
+
if (lowered === 'false')
|
|
39
|
+
return false;
|
|
40
|
+
if (lowered === 'mixed')
|
|
41
|
+
return 'mixed';
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/** Build an AxNode subtree from a CDP node + its id index. */
|
|
46
|
+
export function parseNode(node, byId) {
|
|
47
|
+
const props = node['properties'];
|
|
48
|
+
const children = [];
|
|
49
|
+
for (const cid of node['childIds'] ?? []) {
|
|
50
|
+
const child = byId.get(cid);
|
|
51
|
+
if (child)
|
|
52
|
+
children.push(parseNode(child, byId));
|
|
53
|
+
}
|
|
54
|
+
const levelRaw = cdpProp(props, 'level');
|
|
55
|
+
return {
|
|
56
|
+
role: axValue(node, 'role'),
|
|
57
|
+
name: axValue(node, 'name'),
|
|
58
|
+
value: axValue(node, 'value') || null,
|
|
59
|
+
url: cdpProp(props, 'url') ?? null,
|
|
60
|
+
level: typeof levelRaw === 'number' ? levelRaw : levelRaw != null ? Number(levelRaw) : null,
|
|
61
|
+
checked: normalizeTristate(cdpProp(props, 'checked')),
|
|
62
|
+
pressed: normalizeTristate(cdpProp(props, 'pressed')),
|
|
63
|
+
disabled: Boolean(cdpProp(props, 'disabled')),
|
|
64
|
+
selected: cdpProp(props, 'selected') ?? null,
|
|
65
|
+
expanded: cdpProp(props, 'expanded') ?? null,
|
|
66
|
+
required: Boolean(cdpProp(props, 'required')),
|
|
67
|
+
readonly: Boolean(cdpProp(props, 'readonly')),
|
|
68
|
+
focused: Boolean(cdpProp(props, 'focused')),
|
|
69
|
+
backendDomNodeId: node['backendDOMNodeId'] ?? null,
|
|
70
|
+
children,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Capture one AX tree via a CDP session. `frameId` scopes `getFullAXTree` to a
|
|
75
|
+
* same-process child frame on the ancestor session; omit it for an OOPIF's own
|
|
76
|
+
* dedicated session (its default root IS that frame). No bounding boxes.
|
|
77
|
+
* Mirrors Python `_capture_ax_tree_via_session` (skip_bounding_boxes=True path).
|
|
78
|
+
*/
|
|
79
|
+
export async function captureTreeViaSession(session, frameId) {
|
|
80
|
+
const params = {};
|
|
81
|
+
if (frameId)
|
|
82
|
+
params['frameId'] = frameId;
|
|
83
|
+
const result = (await session.send('Accessibility.getFullAXTree', params));
|
|
84
|
+
const nodes = result.nodes ?? [];
|
|
85
|
+
if (nodes.length === 0)
|
|
86
|
+
return null;
|
|
87
|
+
const byId = new Map();
|
|
88
|
+
for (const node of nodes) {
|
|
89
|
+
const nid = node['nodeId'];
|
|
90
|
+
if (nid)
|
|
91
|
+
byId.set(nid, node);
|
|
92
|
+
}
|
|
93
|
+
const root = nodes.find((n) => !n['parentId']) ?? nodes[0];
|
|
94
|
+
return parseNode(root, byId);
|
|
95
|
+
}
|
|
96
|
+
// ── Frame discovery helpers (mirror _frame_capture.py) ──────────────────────
|
|
97
|
+
/**
|
|
98
|
+
* Visibility filter: the iframe OWNER element's box model via
|
|
99
|
+
* `DOM.getBoxModel({ backendNodeId })` on the PARENT session. Fail OPEN: any
|
|
100
|
+
* failed query includes the frame; only a successful zero-area box excludes.
|
|
101
|
+
*/
|
|
102
|
+
async function isOwnerVisible(session, backendNodeId) {
|
|
103
|
+
if (backendNodeId == null)
|
|
104
|
+
return true;
|
|
105
|
+
try {
|
|
106
|
+
const result = (await session.send('DOM.getBoxModel', { backendNodeId }));
|
|
107
|
+
const model = result?.model ?? {};
|
|
108
|
+
return (model.width ?? 0) > 0 && (model.height ?? 0) > 0;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return true; // box-model failure — fail open
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Depth-first: every `iframe`-role AX node in one frame's OWN captured tree. */
|
|
115
|
+
function* iterIframeAxNodes(node) {
|
|
116
|
+
if ((node.role || '').trim().toLowerCase() === FRAME_ROLE) {
|
|
117
|
+
yield node;
|
|
118
|
+
return; // an iframe node's content is a separate captured tree
|
|
119
|
+
}
|
|
120
|
+
for (const child of node.children)
|
|
121
|
+
yield* iterIframeAxNodes(child);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Owner iframe backendNodeId → its CONTENT frame's real CDP frame id via
|
|
125
|
+
* `DOM.describeNode` on the SAME session that captured the owner's tree.
|
|
126
|
+
* Never raises: any failure returns "" ("owner resolution failed").
|
|
127
|
+
*/
|
|
128
|
+
async function resolveOwnerFrameId(session, backendNodeId) {
|
|
129
|
+
if (backendNodeId == null)
|
|
130
|
+
return '';
|
|
131
|
+
try {
|
|
132
|
+
const described = (await session.send('DOM.describeNode', { backendNodeId }));
|
|
133
|
+
return described?.node?.frameId ?? '';
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return '';
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** Recursive by-id search over one `Page.getFrameTree` node (never positional). */
|
|
140
|
+
function findCdpFrameNode(node, frameId) {
|
|
141
|
+
if (!node)
|
|
142
|
+
return null;
|
|
143
|
+
if ((node.frame?.id ?? '') === frameId)
|
|
144
|
+
return node;
|
|
145
|
+
for (const child of node.childFrames ?? []) {
|
|
146
|
+
const found = findCdpFrameNode(child, frameId);
|
|
147
|
+
if (found)
|
|
148
|
+
return found;
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Best-effort, NEVER-positional Playwright `Frame` match for a resolved
|
|
154
|
+
* `contentFrameId`: look up its `(url, name)` from the frame tree, then find
|
|
155
|
+
* the single candidate reporting the same `(url, name)`. Zero or >1 → null.
|
|
156
|
+
*/
|
|
157
|
+
function matchFrameByIdentity(frameTreeRoot, contentFrameId, candidates) {
|
|
158
|
+
if (!frameTreeRoot)
|
|
159
|
+
return null;
|
|
160
|
+
const node = findCdpFrameNode(frameTreeRoot, contentFrameId);
|
|
161
|
+
if (!node)
|
|
162
|
+
return null;
|
|
163
|
+
const targetUrl = node.frame?.url;
|
|
164
|
+
const targetName = node.frame?.name ?? '';
|
|
165
|
+
const matches = [];
|
|
166
|
+
for (const frame of candidates) {
|
|
167
|
+
try {
|
|
168
|
+
if (frame.url() === targetUrl && frame.name() === targetName)
|
|
169
|
+
matches.push(frame);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return matches.length === 1 ? matches[0] : null;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Probe whether `frame` has its own dedicated CDP session (a genuine OOPIF
|
|
179
|
+
* root). Returns `[session, true]` on success (caller owns detaching it) or
|
|
180
|
+
* `[null, false]` for a same-process frame / any other probe failure.
|
|
181
|
+
*/
|
|
182
|
+
async function probeOopifSession(context, frame) {
|
|
183
|
+
try {
|
|
184
|
+
const session = await context.newCDPSession(frame);
|
|
185
|
+
return [session, true];
|
|
186
|
+
}
|
|
187
|
+
catch (e) {
|
|
188
|
+
const msg = (e instanceof Error ? e.message : String(e)).toLowerCase();
|
|
189
|
+
if (!msg.includes(NO_DEDICATED_SESSION_HINT)) {
|
|
190
|
+
log.helper(`[frame_capture] unexpected newCDPSession error probing a frame — treating as same-process: ${msg}`);
|
|
191
|
+
}
|
|
192
|
+
return [null, false];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/** Capture-scoped, lazy OOPIF session lookup (mirrors `_LazyOopifResolver`). */
|
|
196
|
+
class LazyOopifResolver {
|
|
197
|
+
page;
|
|
198
|
+
byFrameId = new Map();
|
|
199
|
+
candidates = null;
|
|
200
|
+
constructor(page) {
|
|
201
|
+
this.page = page;
|
|
202
|
+
}
|
|
203
|
+
async resolve(contentFrameId) {
|
|
204
|
+
const cached = this.byFrameId.get(contentFrameId);
|
|
205
|
+
if (cached)
|
|
206
|
+
return cached;
|
|
207
|
+
if (this.candidates === null) {
|
|
208
|
+
try {
|
|
209
|
+
this.candidates = this.page.frames().filter((f) => f !== this.page.mainFrame());
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
this.candidates = [];
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
while (this.candidates.length) {
|
|
216
|
+
const frame = this.candidates.shift();
|
|
217
|
+
const [session, isOopif] = await probeOopifSession(this.page.context(), frame);
|
|
218
|
+
if (!isOopif || !session)
|
|
219
|
+
continue;
|
|
220
|
+
let trueId;
|
|
221
|
+
try {
|
|
222
|
+
const tree = (await session.send('Page.getFrameTree'));
|
|
223
|
+
trueId = tree?.frameTree?.frame?.id;
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
trueId = undefined;
|
|
227
|
+
}
|
|
228
|
+
if (!trueId) {
|
|
229
|
+
try {
|
|
230
|
+
await session.detach();
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
/* ignore */
|
|
234
|
+
}
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
this.byFrameId.set(trueId, session);
|
|
238
|
+
if (trueId === contentFrameId)
|
|
239
|
+
return session;
|
|
240
|
+
}
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
/** Every OOPIF session discovered so far — caller owns detaching each. */
|
|
244
|
+
sessions() {
|
|
245
|
+
return [...this.byFrameId.values()];
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// ── Public entry points ─────────────────────────────────────────────────────
|
|
249
|
+
/**
|
|
250
|
+
* Capture the main frame plus every eligible iframe, merge-ready.
|
|
251
|
+
*
|
|
252
|
+
* Fast path: pages with no iframes (`page.frames().length <= 1`) skip all
|
|
253
|
+
* frame-resolution CDP calls. Never throws — downgrades to main-frame-only.
|
|
254
|
+
*/
|
|
255
|
+
export async function captureFrameForest(page) {
|
|
256
|
+
let mainTree = null;
|
|
257
|
+
let mainSession = null;
|
|
258
|
+
try {
|
|
259
|
+
mainSession = await page.context().newCDPSession(page);
|
|
260
|
+
mainTree = await captureTreeViaSession(mainSession, null);
|
|
261
|
+
}
|
|
262
|
+
catch (e) {
|
|
263
|
+
log.warn(`[frame_capture] main capture failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
264
|
+
if (mainSession) {
|
|
265
|
+
try {
|
|
266
|
+
await mainSession.detach();
|
|
267
|
+
}
|
|
268
|
+
catch { /* ignore */ }
|
|
269
|
+
}
|
|
270
|
+
return { mainTree: null, frameCaptures: [] };
|
|
271
|
+
}
|
|
272
|
+
// Fast path / degenerate cases: no extra CDP round trips.
|
|
273
|
+
let frameCount = 2;
|
|
274
|
+
try {
|
|
275
|
+
frameCount = page.frames().length;
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
frameCount = 1;
|
|
279
|
+
}
|
|
280
|
+
if (frameCount <= 1 || mainTree === null) {
|
|
281
|
+
try {
|
|
282
|
+
await mainSession.detach();
|
|
283
|
+
}
|
|
284
|
+
catch { /* ignore */ }
|
|
285
|
+
return { mainTree, frameCaptures: [] };
|
|
286
|
+
}
|
|
287
|
+
const oopifResolver = new LazyOopifResolver(page);
|
|
288
|
+
try {
|
|
289
|
+
const captureAndRecurse = async (fc, session, contentFrameId, nextDepth) => {
|
|
290
|
+
let tree;
|
|
291
|
+
try {
|
|
292
|
+
tree = await captureTreeViaSession(session, contentFrameId);
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
tree = null;
|
|
296
|
+
}
|
|
297
|
+
let childSession = session; // same-process: subtree stays on this session
|
|
298
|
+
if (tree === null) {
|
|
299
|
+
const oopifSession = await oopifResolver.resolve(contentFrameId);
|
|
300
|
+
if (oopifSession === null)
|
|
301
|
+
return; // fc.status stays "capture_failed"
|
|
302
|
+
try {
|
|
303
|
+
tree = await captureTreeViaSession(oopifSession, null);
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
tree = null;
|
|
307
|
+
}
|
|
308
|
+
if (tree === null)
|
|
309
|
+
return; // fc.status stays "capture_failed"
|
|
310
|
+
childSession = oopifSession;
|
|
311
|
+
}
|
|
312
|
+
fc.tree = tree;
|
|
313
|
+
fc.status = 'captured';
|
|
314
|
+
fc.children = await discoverChildren(tree, childSession, nextDepth);
|
|
315
|
+
};
|
|
316
|
+
const discoverChildren = async (tree, session, depth) => {
|
|
317
|
+
const entries = [];
|
|
318
|
+
for (const axNode of iterIframeAxNodes(tree)) {
|
|
319
|
+
const ownerId = axNode.backendDomNodeId;
|
|
320
|
+
const contentFrameId = await resolveOwnerFrameId(session, ownerId);
|
|
321
|
+
if (!contentFrameId) {
|
|
322
|
+
entries.push({ fc: { frameId: '', status: 'unresolved', ownerBackendNodeId: ownerId }, coro: null });
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (depth > FRAME_DEPTH_BACKSTOP) {
|
|
326
|
+
entries.push({ fc: { frameId: contentFrameId, status: 'depth_exceeded', ownerBackendNodeId: ownerId }, coro: null });
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
let visible;
|
|
330
|
+
try {
|
|
331
|
+
visible = await isOwnerVisible(session, ownerId);
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
visible = true; // fail open
|
|
335
|
+
}
|
|
336
|
+
if (!visible) {
|
|
337
|
+
entries.push({ fc: { frameId: contentFrameId, status: 'hidden', ownerBackendNodeId: ownerId }, coro: null });
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
const fc = { frameId: contentFrameId, status: 'capture_failed', ownerBackendNodeId: ownerId };
|
|
341
|
+
entries.push({ fc, coro: captureAndRecurse(fc, session, contentFrameId, depth + 1) });
|
|
342
|
+
}
|
|
343
|
+
const coros = entries.map((e) => e.coro).filter((c) => c !== null);
|
|
344
|
+
if (coros.length)
|
|
345
|
+
await Promise.allSettled(coros);
|
|
346
|
+
return entries.map((e) => e.fc);
|
|
347
|
+
};
|
|
348
|
+
const frameCaptures = await discoverChildren(mainTree, mainSession, 1);
|
|
349
|
+
return { mainTree, frameCaptures };
|
|
350
|
+
}
|
|
351
|
+
catch (e) {
|
|
352
|
+
log.warn(`[frame_capture] forest capture failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
353
|
+
return { mainTree, frameCaptures: [] };
|
|
354
|
+
}
|
|
355
|
+
finally {
|
|
356
|
+
for (const session of oopifResolver.sessions()) {
|
|
357
|
+
try {
|
|
358
|
+
await session.detach();
|
|
359
|
+
}
|
|
360
|
+
catch { /* ignore */ }
|
|
361
|
+
}
|
|
362
|
+
try {
|
|
363
|
+
await mainSession.detach();
|
|
364
|
+
}
|
|
365
|
+
catch { /* ignore */ }
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Resolve a live CDP session whose DOM domain can act on `frameId`'s nodes —
|
|
370
|
+
* the grounding counterpart to capture-time session routing. `frameId === ""`
|
|
371
|
+
* (main-frame convention) → a fresh page session. Any resolution failure falls
|
|
372
|
+
* back to a fresh main-page session (never throws). Caller owns detaching it.
|
|
373
|
+
*/
|
|
374
|
+
export async function resolveSessionForFrame(page, frameId) {
|
|
375
|
+
if (!frameId)
|
|
376
|
+
return page.context().newCDPSession(page);
|
|
377
|
+
let frameTreeRoot = null;
|
|
378
|
+
let mainSession = null;
|
|
379
|
+
try {
|
|
380
|
+
mainSession = await page.context().newCDPSession(page);
|
|
381
|
+
const ft = (await mainSession.send('Page.getFrameTree'));
|
|
382
|
+
frameTreeRoot = ft?.frameTree ?? null;
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
frameTreeRoot = null;
|
|
386
|
+
}
|
|
387
|
+
finally {
|
|
388
|
+
if (mainSession) {
|
|
389
|
+
try {
|
|
390
|
+
await mainSession.detach();
|
|
391
|
+
}
|
|
392
|
+
catch { /* ignore */ }
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
let candidates;
|
|
396
|
+
try {
|
|
397
|
+
candidates = page.frames().filter((f) => f !== page.mainFrame());
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
candidates = [];
|
|
401
|
+
}
|
|
402
|
+
const targetFrame = matchFrameByIdentity(frameTreeRoot, frameId, candidates);
|
|
403
|
+
if (targetFrame === null)
|
|
404
|
+
return page.context().newCDPSession(page);
|
|
405
|
+
const [session, isOopif] = await probeOopifSession(page.context(), targetFrame);
|
|
406
|
+
if (isOopif && session)
|
|
407
|
+
return session;
|
|
408
|
+
let ancestor = targetFrame.parentFrame();
|
|
409
|
+
while (ancestor !== null && ancestor !== page.mainFrame()) {
|
|
410
|
+
const [ancSession, ancIsOopif] = await probeOopifSession(page.context(), ancestor);
|
|
411
|
+
if (ancIsOopif && ancSession)
|
|
412
|
+
return ancSession;
|
|
413
|
+
ancestor = ancestor.parentFrame();
|
|
414
|
+
}
|
|
415
|
+
return page.context().newCDPSession(page);
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=captureFrameForest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captureFrameForest.js","sourceRoot":"","sources":["../../../src/helpers/axTree/captureFrameForest.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,4 +5,6 @@
|
|
|
5
5
|
export { serializeAxTree, AX_DOC_MAX_CHARS, TEXT_TRUNCATE_CHARS } from './serializeAxTree.js';
|
|
6
6
|
export type { AxNode, FrameCapture, RefEntry, RefTable } from './serializeAxTree.js';
|
|
7
7
|
export { captureAxTree } from './captureAxTree.js';
|
|
8
|
+
export { captureFrameForest, resolveSessionForFrame } from './captureFrameForest.js';
|
|
9
|
+
export type { FrameForest } from './captureFrameForest.js';
|
|
8
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/helpers/axTree/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/helpers/axTree/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACrF,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -4,4 +4,5 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export { serializeAxTree, AX_DOC_MAX_CHARS, TEXT_TRUNCATE_CHARS } from './serializeAxTree.js';
|
|
6
6
|
export { captureAxTree } from './captureAxTree.js';
|
|
7
|
+
export { captureFrameForest, resolveSessionForFrame } from './captureFrameForest.js';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helpers/axTree/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helpers/axTree/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC"}
|