my-frontend-observer 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +82 -1
- package/README.md +30 -7
- package/dist/application/observationPersistence.js +1 -0
- package/dist/application/observationPersistence.js.map +1 -1
- package/dist/browser/chromiumAdapter.js +58 -4
- package/dist/browser/chromiumAdapter.js.map +1 -1
- package/dist/browser/evidenceCapture.d.ts +46 -3
- package/dist/browser/evidenceCapture.js +393 -94
- package/dist/browser/evidenceCapture.js.map +1 -1
- package/dist/browser/scrollCapture.d.ts +32 -0
- package/dist/browser/scrollCapture.js +163 -0
- package/dist/browser/scrollCapture.js.map +1 -0
- package/dist/browser/types.d.ts +3 -1
- package/dist/cli.js +165 -7
- package/dist/cli.js.map +1 -1
- package/dist/domain/diagnostics.d.ts +1 -1
- package/dist/domain/diagnostics.js +2 -0
- package/dist/domain/diagnostics.js.map +1 -1
- package/dist/domain/identity.d.ts +8 -3
- package/dist/domain/identity.js +10 -4
- package/dist/domain/identity.js.map +1 -1
- package/dist/domain/schema.d.ts +164 -6
- package/dist/domain/schema.js +314 -4
- package/dist/domain/schema.js.map +1 -1
- package/dist/domain/scrollEvidence.d.ts +51 -0
- package/dist/domain/scrollEvidence.js +134 -0
- package/dist/domain/scrollEvidence.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/request/request.d.ts +57 -1
- package/dist/request/request.js +292 -14
- package/dist/request/request.js.map +1 -1
- package/docs/ARCHITECTURE.md +62 -1
- package/docs/CI_CD.md +49 -8
- package/docs/COMMANDS.md +184 -9
- package/docs/CONTRACTS.md +135 -6
- package/docs/CURRENT_STATE.md +128 -6
- package/docs/DEVELOPMENT.md +41 -3
- package/docs/PROJECT_OVERVIEW.md +12 -6
- package/docs/QUICKSTART.md +3 -1
- package/docs/RELEASE.md +12 -5
- package/docs/ROADMAP.md +9 -0
- package/docs/SECURITY.md +6 -2
- package/docs/WORKFLOWS.md +41 -14
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,87 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 0.3.0 - 2026-08-12
|
|
4
|
+
|
|
5
|
+
Runtime Scrolling, Overflow, and Visibility Behavior.
|
|
6
|
+
|
|
7
|
+
- Bounded runtime scroll scenarios: an observation may configure zero or
|
|
8
|
+
one scroll action, `window-scroll-by` or `target-scroll-by` (signed
|
|
9
|
+
integer `deltaX`/`deltaY`, bounded to `[-20000, 20000]`, at least one
|
|
10
|
+
non-zero). Not a generic interaction recorder or browser automation
|
|
11
|
+
framework - exactly one bounded action per observation.
|
|
12
|
+
- Real `window-scroll-by` execution: vertical and horizontal document
|
|
13
|
+
scrolling, with browser-authoritative (not calculated) final position,
|
|
14
|
+
including natural boundary clamping and valid no-movement scenarios.
|
|
15
|
+
- Real `target-scroll-by` execution against the existing stable configured
|
|
16
|
+
target identity and the same canonical target-resolution path every
|
|
17
|
+
locator kind already uses: real nested vertical/horizontal element
|
|
18
|
+
scrolling, boundary clamping, and non-scrollable/no-movement targets. An
|
|
19
|
+
action target that cannot be uniquely resolved at runtime is never
|
|
20
|
+
scrolled and never fabricated as moved - the existing target-missing/
|
|
21
|
+
target-ambiguous/target-hidden diagnostics explain it honestly.
|
|
22
|
+
- Initial/final bounded runtime snapshots (window scroll position, the
|
|
23
|
+
browser's own scrolling-root/`documentElement`/`body` metrics, and
|
|
24
|
+
per-configured-target scroll metrics) around an immediate, non-smooth
|
|
25
|
+
scroll action and an exact two-`requestAnimationFrame` stabilization
|
|
26
|
+
wait.
|
|
27
|
+
- Actual dimensional overflow (`scrollWidth`/`scrollHeight` vs.
|
|
28
|
+
`clientWidth`/`clientHeight`) kept explicitly distinct from the computed
|
|
29
|
+
`overflow-x`/`overflow-y` CSS declaration.
|
|
30
|
+
- Real viewport-relation evidence (`above`/`intersecting`/`below`,
|
|
31
|
+
`intersectsViewport`, `fullyWithinViewport`) and `enteredViewport`/
|
|
32
|
+
`leftViewport` scenario transitions; a hidden/non-rendered target's
|
|
33
|
+
viewport relation is honestly `not-applicable`, never fabricated
|
|
34
|
+
geometry - hidden and offscreen remain distinct.
|
|
35
|
+
- Bounded before/after scenario transition evidence for window and
|
|
36
|
+
per-target scroll position, geometry, and viewport relation - not a
|
|
37
|
+
generic comparison/diff engine.
|
|
38
|
+
- Derived scroll-owner interpretation (`document` /
|
|
39
|
+
`target:<stable-target-name>` / `none` / `indeterminate`), always
|
|
40
|
+
traceable (`derivedFrom`) to the underlying observed scroll-position
|
|
41
|
+
measurements only - never from CSS overflow, bounding-rectangle movement
|
|
42
|
+
alone, target name, or DOM hierarchy.
|
|
43
|
+
- New `--scroll-scenario-file <json-file>` CLI input, usable together with
|
|
44
|
+
either `--target` or `--targets-file`; the file path is operational input
|
|
45
|
+
only, never persisted and never part of request identity, exactly like
|
|
46
|
+
`--targets-file`'s path.
|
|
47
|
+
- Observation schema `1.2.0` (additive over `1.1.0`).
|
|
48
|
+
- Cross-platform packed-candidate validation: one hash-verified npm
|
|
49
|
+
candidate tarball proven on Windows, Linux, and macOS, covering the
|
|
50
|
+
legacy `--target` CSS shorthand, the structured `--targets-file`
|
|
51
|
+
semantic-target path, and both `--scroll-scenario-file` action kinds.
|
|
52
|
+
|
|
53
|
+
## 0.2.0 - 2026-08-11
|
|
54
|
+
|
|
55
|
+
Stable Semantic Targets and Region Identity.
|
|
56
|
+
|
|
57
|
+
- Canonical `{name, locators}` target model with a stable observer-owned
|
|
58
|
+
target identity, distinct from both the browser locator that resolves a
|
|
59
|
+
target and any source-code symbol. The existing `--target id=selector`
|
|
60
|
+
CSS shorthand remains fully supported and normalizes into this model
|
|
61
|
+
unchanged.
|
|
62
|
+
- Six frozen, real-Chromium-resolved locator kinds per target, evaluated in
|
|
63
|
+
configured order with fallback on no match, immediate stop (no fallback)
|
|
64
|
+
on ambiguous or unevaluable results: `role` (+ optional exact accessible
|
|
65
|
+
name), `id`, `data-attribute`, `semantic-element`, `css`, and `text`
|
|
66
|
+
(exact match only).
|
|
67
|
+
- Explicit missing/ambiguous/unavailable resolution reporting, and hidden
|
|
68
|
+
(present-but-not-visible) target evidence, for every locator kind.
|
|
69
|
+
- Bounded semantic-region evidence per resolved target: accessibility
|
|
70
|
+
state (`disabled`/`expanded`/`checked`/`selected`/`pressed`/`current`,
|
|
71
|
+
with an explicit `false` always distinguishable from "not applicable"),
|
|
72
|
+
derived landmark identity, and configured-target-only DOM containment.
|
|
73
|
+
- Proven stable request identity: the same target configuration produces
|
|
74
|
+
the same request identity across repeated observations; changing a
|
|
75
|
+
target's locator strategy changes the request identity without changing
|
|
76
|
+
its stable name; a target's actual runtime disappearance is
|
|
77
|
+
distinguishable from a configuration change.
|
|
78
|
+
- New `--targets-file <json-file>` CLI input for structured semantic target
|
|
79
|
+
configuration, mutually exclusive with `--target`.
|
|
80
|
+
- Observation schema `1.1.0`.
|
|
81
|
+
- Cross-platform packed-candidate validation: one hash-verified npm
|
|
82
|
+
candidate tarball proven on Windows, Linux, and macOS, covering both the
|
|
83
|
+
legacy `--target` CSS shorthand and the structured `--targets-file`
|
|
84
|
+
semantic-target path.
|
|
4
85
|
|
|
5
86
|
## 0.1.0 - 2026-08-11
|
|
6
87
|
|
package/README.md
CHANGED
|
@@ -6,11 +6,12 @@ in [docs/PROJECT_DESCRIPTION.md](docs/PROJECT_DESCRIPTION.md).
|
|
|
6
6
|
|
|
7
7
|
## Current status
|
|
8
8
|
|
|
9
|
-
`v0.
|
|
10
|
-
`my-frontend-observer observe` launches a real,
|
|
11
|
-
enforces a loopback-only safety policy,
|
|
12
|
-
bounded page/target evidence, and
|
|
13
|
-
`manifest.json` + `screenshot.png` artifact
|
|
9
|
+
`v0.3.0`, Runtime Scrolling, Overflow, and Visibility Behavior, is the
|
|
10
|
+
current published release: `my-frontend-observer observe` launches a real,
|
|
11
|
+
sandboxed Chromium browser, enforces a loopback-only safety policy,
|
|
12
|
+
captures a viewport screenshot plus bounded page/target evidence, and
|
|
13
|
+
persists it as one portable `manifest.json` + `screenshot.png` artifact
|
|
14
|
+
(observation schema `1.2.0`).
|
|
14
15
|
|
|
15
16
|
Install:
|
|
16
17
|
|
|
@@ -44,6 +45,28 @@ This prints a concise result (`Observation:`/`State:`/`Artifact:`/`Targets:`/
|
|
|
44
45
|
`Diagnostics:`) and exits `0` on a successfully persisted observation. See
|
|
45
46
|
[docs/COMMANDS.md](docs/COMMANDS.md) for the full flag reference.
|
|
46
47
|
|
|
48
|
+
`--target <id=css-selector>` remains the simple CSS shorthand. A structured
|
|
49
|
+
`--targets-file <json-file>` input mode - supporting a role and accessible
|
|
50
|
+
name, a stable `id`, a `data-*` attribute, a semantic landmark element,
|
|
51
|
+
exact text, or an ordered fallback between several of those - ships
|
|
52
|
+
alongside it. See "Structured semantic targets" in
|
|
53
|
+
[docs/COMMANDS.md](docs/COMMANDS.md#structured-semantic-targets-targets-file)
|
|
54
|
+
for the exact JSON format.
|
|
55
|
+
|
|
56
|
+
### Runtime scroll scenarios
|
|
57
|
+
|
|
58
|
+
`--scroll-scenario-file <json-file>` ships in this release: a real, bounded
|
|
59
|
+
`window-scroll-by` or `target-scroll-by` action performs one immediate,
|
|
60
|
+
non-smooth scroll and captures initial/final runtime evidence - window and
|
|
61
|
+
configured-target scroll position, actual overflow, viewport relation,
|
|
62
|
+
entered/left-viewport transitions, and a derived scroll-owner
|
|
63
|
+
interpretation (`document`, `target:<stable-target-name>`, `none`, or
|
|
64
|
+
`indeterminate`), all persisted in the same `manifest.json`. It may be
|
|
65
|
+
combined with either `--target` or `--targets-file`. See "Scroll scenario"
|
|
66
|
+
in
|
|
67
|
+
[docs/COMMANDS.md](docs/COMMANDS.md#scroll-scenario---scroll-scenario-file)
|
|
68
|
+
for the exact JSON format and flag reference.
|
|
69
|
+
|
|
47
70
|
Validation:
|
|
48
71
|
|
|
49
72
|
```powershell
|
|
@@ -61,8 +84,8 @@ Planning authorities:
|
|
|
61
84
|
intent and responsibility boundaries.
|
|
62
85
|
- [Project Milestones](docs/PROJECT_MILESTONES.md): complete ordered capability
|
|
63
86
|
design and cross-milestone rules.
|
|
64
|
-
- [ROADMAP](docs/ROADMAP.md): version-level requirements; v0.1
|
|
65
|
-
v0.
|
|
87
|
+
- [ROADMAP](docs/ROADMAP.md): version-level requirements; v0.1, v0.2, and
|
|
88
|
+
v0.3 are released, v0.4 is next.
|
|
66
89
|
- [Current State](docs/CURRENT_STATE.md): retained scaffold and release state.
|
|
67
90
|
|
|
68
91
|
No sibling ecosystem repository is a runtime dependency of the retained
|
|
@@ -26,6 +26,7 @@ export function buildObservationArtifact(capture, request) {
|
|
|
26
26
|
provenance: { capturedAt: new Date().toISOString(), observationMethod: 'chromium-navigate-and-capture' },
|
|
27
27
|
pageEvidence: capture.pageEvidence,
|
|
28
28
|
targetEvidence: capture.targetEvidence,
|
|
29
|
+
...(capture.scrollScenarioEvidence ? { scrollScenarioEvidence: capture.scrollScenarioEvidence } : {}),
|
|
29
30
|
screenshot: { state: 'available', source: 'browser', value: { path: SCREENSHOT_FILENAME } },
|
|
30
31
|
completion,
|
|
31
32
|
diagnostics: capture.diagnostics,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observationPersistence.js","sourceRoot":"","sources":["../../src/application/observationPersistence.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"observationPersistence.js","sourceRoot":"","sources":["../../src/application/observationPersistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { chromium } from 'playwright';
|
|
2
2
|
import { DIAGNOSTIC_SEVERITY } from '../domain/diagnostics.js';
|
|
3
3
|
import { classifyUrl, classifyRedirect, classifySubresource, classifyPopup, classifyDownload } from '../safety/policy.js';
|
|
4
|
-
import { capturePageEvidence, captureTargetEvidence } from './evidenceCapture.js';
|
|
4
|
+
import { capturePageEvidence, captureTargetEvidence, resolveConfiguredTargets, findResolvedTarget } from './evidenceCapture.js';
|
|
5
|
+
import { captureScrollRuntimeSnapshot, performWindowScrollBy, performTargetScrollBy, waitTwoAnimationFrames } from './scrollCapture.js';
|
|
6
|
+
import { deriveScrollScenarioTransition, deriveScrollOwner } from '../domain/scrollEvidence.js';
|
|
5
7
|
function diagnostic(code, message) {
|
|
6
8
|
return { code, severity: DIAGNOSTIC_SEVERITY[code], message };
|
|
7
9
|
}
|
|
@@ -104,8 +106,52 @@ export async function captureViewportInternal(request) {
|
|
|
104
106
|
result = { ok: false, diagnostics: [...diagnostics, classifyNavigationError(navigationError, request.readiness.timeoutMs)] };
|
|
105
107
|
}
|
|
106
108
|
else {
|
|
107
|
-
//
|
|
108
|
-
//
|
|
109
|
+
// v0.3 Batch 2/3: for a scenario request, resolve configured targets
|
|
110
|
+
// exactly once (reusing the same canonical resolveConfiguredTargets
|
|
111
|
+
// algorithm captureTargetEvidence uses below), capture the initial
|
|
112
|
+
// runtime snapshot, perform the one immediate scroll action (window or
|
|
113
|
+
// the uniquely-resolved action target - same two-animation-frame
|
|
114
|
+
// stabilization either way), and capture the final runtime snapshot -
|
|
115
|
+
// all before the screenshot and ordinary page/target evidence below,
|
|
116
|
+
// so every one of those downstream captures describes only the final
|
|
117
|
+
// post-action state. No second navigation, page, or observation ever
|
|
118
|
+
// happens.
|
|
119
|
+
let scrollScenarioEvidence;
|
|
120
|
+
if (request.scrollScenario) {
|
|
121
|
+
const action = request.scrollScenario.action;
|
|
122
|
+
const resolvedForScenario = await resolveConfiguredTargets(page, request.targets);
|
|
123
|
+
try {
|
|
124
|
+
const initial = await captureScrollRuntimeSnapshot(page, resolvedForScenario, request.viewport);
|
|
125
|
+
if (action.kind === 'window-scroll-by') {
|
|
126
|
+
await performWindowScrollBy(page, action.deltaX, action.deltaY);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
const actionTarget = findResolvedTarget(resolvedForScenario, action.target);
|
|
130
|
+
if (actionTarget?.status === 'matched' && actionTarget.handle) {
|
|
131
|
+
await performTargetScrollBy(actionTarget.handle, action.deltaX, action.deltaY);
|
|
132
|
+
}
|
|
133
|
+
// else: the configured action target could not be uniquely
|
|
134
|
+
// resolved at runtime (not-found/ambiguous/unavailable) - no
|
|
135
|
+
// scroll is performed and no movement is fabricated. The
|
|
136
|
+
// existing target-missing/target-ambiguous/target-hidden/
|
|
137
|
+
// browser-evidence-unavailable diagnostic for this same target
|
|
138
|
+
// name still surfaces below from the ordinary
|
|
139
|
+
// captureTargetEvidence pass, so the unresolved action target
|
|
140
|
+
// remains honestly explained rather than silently ignored.
|
|
141
|
+
}
|
|
142
|
+
await waitTwoAnimationFrames(page);
|
|
143
|
+
const final = await captureScrollRuntimeSnapshot(page, resolvedForScenario, request.viewport);
|
|
144
|
+
const transition = deriveScrollScenarioTransition(initial, final);
|
|
145
|
+
const scrollOwner = deriveScrollOwner(transition);
|
|
146
|
+
scrollScenarioEvidence = { initial, final, transition, scrollOwner };
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
await Promise.all(resolvedForScenario.filter((info) => info.handle).map((info) => info.handle.dispose()));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Captured from the same live page, after the same readiness point (and,
|
|
153
|
+
// for a scenario request, after the scroll action above), as required by
|
|
154
|
+
// Batch 3/v0.3 Batch 2: no second browser/page is ever opened.
|
|
109
155
|
const screenshotBuffer = await page.screenshot({ type: 'png' });
|
|
110
156
|
const provenance = { engine: 'chromium', version: browser.version() };
|
|
111
157
|
let pageEvidence;
|
|
@@ -128,7 +174,15 @@ export async function captureViewportInternal(request) {
|
|
|
128
174
|
diagnostics.push(diagnostic('browser-evidence-unavailable', `target evidence collection failed: ${message}`));
|
|
129
175
|
targetEvidence = {};
|
|
130
176
|
}
|
|
131
|
-
result = {
|
|
177
|
+
result = {
|
|
178
|
+
ok: true,
|
|
179
|
+
provenance,
|
|
180
|
+
screenshot: new Uint8Array(screenshotBuffer),
|
|
181
|
+
pageEvidence,
|
|
182
|
+
targetEvidence,
|
|
183
|
+
diagnostics,
|
|
184
|
+
...(scrollScenarioEvidence ? { scrollScenarioEvidence } : {}),
|
|
185
|
+
};
|
|
132
186
|
}
|
|
133
187
|
}
|
|
134
188
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chromiumAdapter.js","sourceRoot":"","sources":["../../src/browser/chromiumAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAgB,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1H,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"chromiumAdapter.js","sourceRoot":"","sources":["../../src/browser/chromiumAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { Page } from 'playwright';
|
|
1
|
+
import type { Page, Locator, ElementHandle } from 'playwright';
|
|
2
2
|
import type { EvidenceField } from '../domain/evidence.js';
|
|
3
3
|
import type { Diagnostic } from '../domain/diagnostics.js';
|
|
4
4
|
import type { NamedTarget, Viewport } from '../request/request.js';
|
|
5
|
-
import type { TargetEvidenceRecord } from '../domain/schema.js';
|
|
5
|
+
import type { TargetEvidenceRecord, TargetLocatorAttempt, TargetResolution } from '../domain/schema.js';
|
|
6
6
|
/**
|
|
7
7
|
* Captures the v0.1 minimum page evidence (docs/PROJECT_MILESTONES.md
|
|
8
8
|
* "Minimum page evidence") from the already-navigated, already-ready page.
|
|
@@ -15,5 +15,48 @@ export interface TargetEvidenceCaptureResult {
|
|
|
15
15
|
targetEvidence: Record<string, TargetEvidenceRecord>;
|
|
16
16
|
diagnostics: Diagnostic[];
|
|
17
17
|
}
|
|
18
|
-
|
|
18
|
+
export interface ResolvedTargetInfo {
|
|
19
|
+
name: string;
|
|
20
|
+
attempts: TargetLocatorAttempt[];
|
|
21
|
+
status: TargetResolution['selectionStatus'];
|
|
22
|
+
selectedIndex?: number;
|
|
23
|
+
locator?: Locator;
|
|
24
|
+
handle?: ElementHandle<Element>;
|
|
25
|
+
unavailableReason?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Looks up one already-resolved configured target by its stable observer
|
|
29
|
+
* name (case-insensitively, matching the same case-insensitive comparison
|
|
30
|
+
* `request.ts#normalizeRequest` already uses for target-name uniqueness) -
|
|
31
|
+
* never a second locator/resolution algorithm, just a lookup into the
|
|
32
|
+
* `resolveConfiguredTargets` result already computed once for this
|
|
33
|
+
* observation.
|
|
34
|
+
*/
|
|
35
|
+
export declare function findResolvedTarget(resolved: readonly ResolvedTargetInfo[], name: string): ResolvedTargetInfo | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* The one canonical target-resolution algorithm (Phase 1 of the v0.2 Batch 3
|
|
38
|
+
* three-phase design below), exported so v0.3 Batch 2 scroll-scenario
|
|
39
|
+
* runtime-snapshot capture can resolve configured targets exactly once and
|
|
40
|
+
* reuse the same live `{locator, handle}` pairs across its initial/final
|
|
41
|
+
* snapshots, instead of re-implementing resolution with different locator
|
|
42
|
+
* semantics. Callers own disposing any returned `handle`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveConfiguredTargets(page: Page, targets: readonly NamedTarget[]): Promise<ResolvedTargetInfo[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Observes every explicitly configured target from the same live page,
|
|
47
|
+
* honoring the frozen ordered-locator resolution contract: 0 matches tries
|
|
48
|
+
* the next locator; exactly 1 match selects and stops; more than 1 match is
|
|
49
|
+
* ambiguous and stops (never falls through); an unevaluable locator is
|
|
50
|
+
* unavailable and stops (never falls through). Ambiguity never triggers
|
|
51
|
+
* fallback.
|
|
52
|
+
*
|
|
53
|
+
* Batch 3 restructures this into three phases over one resolved set: (1)
|
|
54
|
+
* resolve every configured target exactly once, keeping a live
|
|
55
|
+
* `{locator, handle}` for each match; (2) compute bounded pairwise DOM
|
|
56
|
+
* containment among only the resolved configured targets, reusing those
|
|
57
|
+
* same handles (never re-resolving, never a second/independent resolution
|
|
58
|
+
* algorithm); (3) measure every resolved target and assemble its evidence,
|
|
59
|
+
* attaching the phase-2 containment result. Every handle is disposed once,
|
|
60
|
+
* after all three phases, regardless of outcome.
|
|
61
|
+
*/
|
|
19
62
|
export declare function captureTargetEvidence(page: Page, targets: readonly NamedTarget[]): Promise<TargetEvidenceCaptureResult>;
|