@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.
@@ -1 +1 @@
1
- {"version":3,"file":"healPatch.d.ts","sourceRoot":"","sources":["../src/healPatch.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAgB,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAmPrD;;;;;;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"}
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
- const fresh = page.locator(selector);
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)}`);
@@ -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,EAAc,MAAM,YAAY,CAAC;AAUnD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AA0CD,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,CAiD7B"}
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 { captureAxTree } from './axTree/index.js';
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
- * Resolve a live CDP session that can act on `frameId`'s nodes.
32
- *
33
- * v1 is main-frame-only (`captureAxTree` never inlines OOPIF content, so every
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
- async function resolveSessionForFrame(page, _frameId) {
41
- return page.context().newCDPSession(page);
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 captured = await captureAxTree(page);
48
- if (captured === null)
88
+ const forest = await captureFrameForest(page);
89
+ if (forest.mainTree === null)
49
90
  return null;
50
- const { doc, refTable } = captured;
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":"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"}
1
+ {"version":3,"file":"autohealAx.js","sourceRoot":"","sources":["../../src/helpers/autohealAx.ts"],"names":[],"mappings":"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"}
@@ -1,29 +1,18 @@
1
1
  /**
2
- * Main-frame AX capture → greppable doc + per-step ref table (TS).
2
+ * Frame-aware AX capture → greppable doc + per-step ref table (TS).
3
3
  *
4
- * Mirrors the Python `testmu/_helpers/ax_tree/_capture.py` (`capture_ax_tree`)
5
- * + `_accessibility.py` CDP path, but MAIN-FRAME ONLY for v1. The Python
6
- * design's frame-aware capture (`_frame_capture.py` same-process + OOPIF
7
- * iframes inlined into one continuous ref space) is a documented follow-up
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 main-frame AX document + per-step ref table.
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 or capture
26
- * fails (never throws).
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;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAgC,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAqEnF;;;;;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,CA+BnG"}
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
- /** Extract a CDP property's `.value.value`, or null. */
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 main-frame AX document + per-step ref table.
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 or capture
74
- * fails (never throws).
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
- let cdp = null;
78
- try {
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":"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"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testmuai/playwright-bindings",
3
- "version": "0.1.25",
3
+ "version": "0.1.26",
4
4
  "description": "Testmu binding for Playwright — thin runtime for LambdaTest exports",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",