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
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DIAGNOSTIC_SEVERITY } from '../domain/diagnostics.js';
|
|
2
|
+
import { TARGET_LANDMARK_ROLES } from '../domain/schema.js';
|
|
2
3
|
function diagnostic(code, message, targetName) {
|
|
3
4
|
const base = { code, severity: DIAGNOSTIC_SEVERITY[code], message };
|
|
4
5
|
return targetName === undefined ? base : { ...base, targetName };
|
|
@@ -63,7 +64,12 @@ function parseAriaSnapshotFirstLine(snapshot) {
|
|
|
63
64
|
const firstLine = snapshot.split('\n')[0]?.trim();
|
|
64
65
|
if (!firstLine)
|
|
65
66
|
return undefined;
|
|
66
|
-
|
|
67
|
+
// No trailing `$` anchor: an element with no accessible name still produces
|
|
68
|
+
// a role line with unquoted trailing content (e.g. `- banner: Site Header`,
|
|
69
|
+
// verified empirically against real Chromium), which must still yield the
|
|
70
|
+
// role even though there is no quoted, genuinely-computed accessible name
|
|
71
|
+
// to report - trailing unquoted text is never treated as a name.
|
|
72
|
+
const match = /^-\s+([A-Za-z][\w-]*)\s*(?:"([^"]*)")?:?/.exec(firstLine);
|
|
67
73
|
if (!match)
|
|
68
74
|
return undefined;
|
|
69
75
|
const role = match[1];
|
|
@@ -72,130 +78,423 @@ function parseAriaSnapshotFirstLine(snapshot) {
|
|
|
72
78
|
return undefined;
|
|
73
79
|
return name !== undefined && name.length > 0 ? { role, name } : { role };
|
|
74
80
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
visibility: unavailableField(reason),
|
|
84
|
-
semantics: unavailableField(reason),
|
|
81
|
+
/** Builds the shared unresolved-target evidence record (not-found/ambiguous/unavailable) with the full ordered attempt history and no selected locator. Containment is reported separately by the caller (its own "self unresolved" reason differs from the measurement-unavailable reason used here). */
|
|
82
|
+
function unresolvedTargetRecord(selectionStatus, attempts, reason, containment) {
|
|
83
|
+
const resolution = {
|
|
84
|
+
selectionMethod: 'ordered-locators',
|
|
85
|
+
selectionStatus,
|
|
86
|
+
usedFallback: false,
|
|
87
|
+
confidence: 'none',
|
|
88
|
+
attempts,
|
|
85
89
|
};
|
|
86
|
-
}
|
|
87
|
-
function ambiguousTargetRecord(matchCount) {
|
|
88
|
-
const reason = `target selector matched ${matchCount} elements; expected exactly one`;
|
|
89
90
|
return {
|
|
90
|
-
resolution: { state: 'available', source: 'derived', value:
|
|
91
|
+
resolution: { state: 'available', source: 'derived', value: resolution, derivedFrom: ['locator-attempts'] },
|
|
91
92
|
tag: unavailableField(reason),
|
|
92
93
|
geometry: unavailableField(reason),
|
|
93
94
|
style: unavailableField(reason),
|
|
94
95
|
layout: unavailableField(reason),
|
|
95
96
|
visibility: unavailableField(reason),
|
|
96
97
|
semantics: unavailableField(reason),
|
|
98
|
+
semanticState: unavailableField(reason),
|
|
99
|
+
landmark: unavailableField(reason),
|
|
100
|
+
containment,
|
|
97
101
|
};
|
|
98
102
|
}
|
|
103
|
+
const TARGET_LANDMARK_ROLE_SET = new Set(TARGET_LANDMARK_ROLES);
|
|
99
104
|
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
* element, they
|
|
105
|
+
* Reads the resolved element's own native form-control properties and
|
|
106
|
+
* explicit `aria-*` attributes: bounded, target-local browser/ARIA state.
|
|
107
|
+
* `ariaSnapshot()`'s bracket annotations were verified empirically (real
|
|
108
|
+
* Chromium via the installed Playwright 1.62.1) to appear only for
|
|
109
|
+
* true/mixed values - they cannot distinguish an explicit false from "not
|
|
110
|
+
* applicable to this element", and they never expose `aria-current` at all.
|
|
111
|
+
* This direct property/attribute read is the investigated, honest
|
|
112
|
+
* alternative for exactly those two gaps; it still reads only real
|
|
113
|
+
* browser-native/ARIA semantics (never class names, CSS, text content, or
|
|
114
|
+
* source ownership). A key is present in the result only when the browser
|
|
115
|
+
* exposes that state as applicable to this specific element.
|
|
106
116
|
*/
|
|
107
|
-
async function
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
scrollHeight: el.scrollHeight,
|
|
122
|
-
clientWidth: el.clientWidth,
|
|
123
|
-
clientHeight: el.clientHeight,
|
|
124
|
-
scrollTop: el.scrollTop,
|
|
125
|
-
scrollLeft: el.scrollLeft,
|
|
126
|
-
},
|
|
127
|
-
computedVisibility: computed.visibility,
|
|
128
|
-
};
|
|
129
|
-
});
|
|
130
|
-
const visible = raw.style.display !== 'none' && raw.computedVisibility !== 'hidden' && raw.geometry.width > 0 && raw.geometry.height > 0;
|
|
131
|
-
let semantics;
|
|
132
|
-
try {
|
|
133
|
-
const snapshot = await page.locator(selector).ariaSnapshot();
|
|
134
|
-
const parsed = parseAriaSnapshotFirstLine(snapshot);
|
|
135
|
-
semantics = parsed ? computedField(parsed) : unavailableField('no distinct accessible role/name is exposed for this target');
|
|
117
|
+
async function captureSemanticState(handle) {
|
|
118
|
+
return handle.evaluate((el) => {
|
|
119
|
+
const result = {};
|
|
120
|
+
const ariaDisabled = el.getAttribute('aria-disabled');
|
|
121
|
+
const nativeDisabled = 'disabled' in el ? Boolean(el.disabled) : false;
|
|
122
|
+
if (nativeDisabled || ariaDisabled !== null)
|
|
123
|
+
result.disabled = nativeDisabled || ariaDisabled === 'true';
|
|
124
|
+
const ariaExpanded = el.getAttribute('aria-expanded');
|
|
125
|
+
if (ariaExpanded !== null)
|
|
126
|
+
result.expanded = ariaExpanded === 'true';
|
|
127
|
+
const ariaChecked = el.getAttribute('aria-checked');
|
|
128
|
+
const isNativeCheckable = el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio');
|
|
129
|
+
if (ariaChecked !== null) {
|
|
130
|
+
result.checked = ariaChecked === 'mixed' ? 'mixed' : ariaChecked === 'true';
|
|
136
131
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
semantics = unavailableField(`accessibility snapshot failed: ${message}`);
|
|
132
|
+
else if (isNativeCheckable) {
|
|
133
|
+
result.checked = el.indeterminate ? 'mixed' : el.checked;
|
|
140
134
|
}
|
|
135
|
+
const ariaSelected = el.getAttribute('aria-selected');
|
|
136
|
+
if (ariaSelected !== null)
|
|
137
|
+
result.selected = ariaSelected === 'true';
|
|
138
|
+
const ariaPressed = el.getAttribute('aria-pressed');
|
|
139
|
+
if (ariaPressed !== null)
|
|
140
|
+
result.pressed = ariaPressed === 'mixed' ? 'mixed' : ariaPressed === 'true';
|
|
141
|
+
const ariaCurrent = el.getAttribute('aria-current');
|
|
142
|
+
if (ariaCurrent !== null && ariaCurrent !== 'false' && ariaCurrent.length > 0) {
|
|
143
|
+
result.current = ariaCurrent === 'true' ? true : ariaCurrent;
|
|
144
|
+
}
|
|
145
|
+
return result;
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/** Wraps the raw captured state: an empty object means no supported state applies to this target ("not-applicable"), never an unexplained empty available value. */
|
|
149
|
+
function semanticStateEvidence(raw) {
|
|
150
|
+
if (Object.keys(raw).length === 0) {
|
|
151
|
+
return { state: 'not-applicable', reason: 'no supported semantic state is exposed for this target' };
|
|
152
|
+
}
|
|
153
|
+
return { state: 'available', source: 'computed-browser', value: raw };
|
|
154
|
+
}
|
|
155
|
+
/** Derives landmark identity from the already-captured browser-exposed role only - never from locator kind or HTML tag (Section 15). */
|
|
156
|
+
function landmarkEvidence(role) {
|
|
157
|
+
if (role === undefined)
|
|
158
|
+
return unavailableField('no distinct accessible role is exposed for this target');
|
|
159
|
+
if (TARGET_LANDMARK_ROLE_SET.has(role)) {
|
|
160
|
+
return { state: 'available', source: 'derived', value: role, derivedFrom: ['semantics.role'] };
|
|
161
|
+
}
|
|
162
|
+
return { state: 'not-applicable', reason: `role "${role}" is not a recognized landmark role` };
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Wraps a computed configured-target-only containment result into the
|
|
166
|
+
* persisted EvidenceField. `selfUnresolvedReason` covers the case where the
|
|
167
|
+
* current target itself never resolved (Section 18: containment is
|
|
168
|
+
* `unavailable`, not partial, when there is no resolved element to check
|
|
169
|
+
* containment for). A computed result with any `unresolvedTargetIds` is
|
|
170
|
+
* `partial` (already-proven relationships are preserved, never dropped);
|
|
171
|
+
* with none, it is `available`.
|
|
172
|
+
*/
|
|
173
|
+
function containmentEvidence(computed, selfUnresolvedReason) {
|
|
174
|
+
if (selfUnresolvedReason !== undefined)
|
|
175
|
+
return { state: 'unavailable', reason: selfUnresolvedReason };
|
|
176
|
+
if (!computed)
|
|
177
|
+
return { state: 'unavailable', reason: 'containment could not be computed' };
|
|
178
|
+
if (computed.unresolvedTargetIds.length > 0) {
|
|
141
179
|
return {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
180
|
+
state: 'partial',
|
|
181
|
+
source: 'browser',
|
|
182
|
+
value: computed,
|
|
183
|
+
reason: `containment could not be evaluated against: ${computed.unresolvedTargetIds.join(', ')}`,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
return { state: 'available', source: 'browser', value: computed };
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Captures the full target evidence for one resolved (single-match) target
|
|
190
|
+
* element, from the same live page/readiness state as the page evidence and
|
|
191
|
+
* screenshot: tag/geometry/style/layout/visibility (v0.1), role/name
|
|
192
|
+
* semantics (v0.1, via `ariaSnapshot()`), and semantic state/landmark
|
|
193
|
+
* (Batch 3). Takes an already-resolved `{ locator, handle }` pair - not a
|
|
194
|
+
* raw CSS selector, and never re-resolves - so every locator kind converges
|
|
195
|
+
* on this one measurement path and containment (computed once by the caller
|
|
196
|
+
* across every resolved target before this runs) is simply passed through.
|
|
197
|
+
*/
|
|
198
|
+
async function captureResolvedTargetRecord(target, handle, attempts, selectedLocatorIndex, containment) {
|
|
199
|
+
const raw = await handle.evaluate((el) => {
|
|
200
|
+
const rect = el.getBoundingClientRect();
|
|
201
|
+
const computed = getComputedStyle(el);
|
|
202
|
+
return {
|
|
203
|
+
tag: el.tagName.toLowerCase(),
|
|
204
|
+
geometry: { x: rect.x, y: rect.y, width: rect.width, height: rect.height, right: rect.right, bottom: rect.bottom },
|
|
205
|
+
style: { display: computed.display, position: computed.position, overflowX: computed.overflowX, overflowY: computed.overflowY },
|
|
206
|
+
layout: {
|
|
207
|
+
scrollWidth: el.scrollWidth,
|
|
208
|
+
scrollHeight: el.scrollHeight,
|
|
209
|
+
clientWidth: el.clientWidth,
|
|
210
|
+
clientHeight: el.clientHeight,
|
|
211
|
+
scrollTop: el.scrollTop,
|
|
212
|
+
scrollLeft: el.scrollLeft,
|
|
147
213
|
},
|
|
214
|
+
computedVisibility: computed.visibility,
|
|
215
|
+
};
|
|
216
|
+
});
|
|
217
|
+
const visible = raw.style.display !== 'none' && raw.computedVisibility !== 'hidden' && raw.geometry.width > 0 && raw.geometry.height > 0;
|
|
218
|
+
let semantics;
|
|
219
|
+
let resolvedRole;
|
|
220
|
+
try {
|
|
221
|
+
const snapshot = await target.ariaSnapshot();
|
|
222
|
+
const parsed = parseAriaSnapshotFirstLine(snapshot);
|
|
223
|
+
semantics = parsed ? computedField(parsed) : unavailableField('no distinct accessible role/name is exposed for this target');
|
|
224
|
+
resolvedRole = parsed?.role;
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
228
|
+
semantics = unavailableField(`accessibility snapshot failed: ${message}`);
|
|
229
|
+
}
|
|
230
|
+
let semanticState;
|
|
231
|
+
try {
|
|
232
|
+
semanticState = semanticStateEvidence(await captureSemanticState(handle));
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
236
|
+
semanticState = unavailableField(`semantic-state evaluation failed: ${message}`);
|
|
237
|
+
}
|
|
238
|
+
const resolution = {
|
|
239
|
+
selectionMethod: 'ordered-locators',
|
|
240
|
+
selectionStatus: 'matched',
|
|
241
|
+
selectedLocatorKind: attempts[selectedLocatorIndex]?.locatorKind ?? 'css',
|
|
242
|
+
selectedLocatorIndex,
|
|
243
|
+
usedFallback: selectedLocatorIndex > 0,
|
|
244
|
+
confidence: 'exact',
|
|
245
|
+
attempts,
|
|
246
|
+
};
|
|
247
|
+
return {
|
|
248
|
+
record: {
|
|
249
|
+
resolution: { state: 'available', source: 'derived', value: resolution, derivedFrom: ['locator-attempts'] },
|
|
148
250
|
tag: browserField(raw.tag),
|
|
149
251
|
geometry: browserField(raw.geometry),
|
|
150
252
|
style: computedField(raw.style),
|
|
151
253
|
layout: browserField(raw.layout),
|
|
152
254
|
visibility: derivedField({ visible }, ['style.display', 'computed-visibility', 'geometry.width', 'geometry.height']),
|
|
153
255
|
semantics,
|
|
154
|
-
|
|
256
|
+
semanticState,
|
|
257
|
+
landmark: landmarkEvidence(resolvedRole),
|
|
258
|
+
containment,
|
|
259
|
+
},
|
|
260
|
+
visible,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* A CSS quoted-string literal for an attribute selector value (`[attr="..."]`).
|
|
265
|
+
* Only backslash and double-quote need escaping inside a CSS quoted string;
|
|
266
|
+
* this keeps the configured id/data-attribute value literal - it is never
|
|
267
|
+
* reinterpreted as selector syntax (e.g. a value containing `#`, `.`, `[`,
|
|
268
|
+
* or `"` still matches exactly, it cannot escape the attribute-value
|
|
269
|
+
* position it was placed in).
|
|
270
|
+
*/
|
|
271
|
+
function cssAttributeValueLiteral(value) {
|
|
272
|
+
return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Maps one frozen v0.2 TargetLocator to the Playwright `Locator` that
|
|
276
|
+
* resolves it - the single point where locator kind becomes a real browser
|
|
277
|
+
* query. `role`/`text` use Playwright's own semantic locators (real
|
|
278
|
+
* accessibility-tree/text resolution, not a hand-rolled approximation);
|
|
279
|
+
* `id`/`data-attribute` use an exact CSS attribute-equals selector (never
|
|
280
|
+
* `#id`/bare-value syntax, so the configured value can never be
|
|
281
|
+
* reinterpreted as selector syntax); `semantic-element` uses a plain tag
|
|
282
|
+
* selector from the Batch 1 frozen tag set; `css` is unchanged v0.1
|
|
283
|
+
* behavior. Every kind converges on the same Playwright `Locator` type, so
|
|
284
|
+
* cardinality/measurement downstream never branches on locator kind again.
|
|
285
|
+
*/
|
|
286
|
+
function buildPlaywrightLocator(page, locator) {
|
|
287
|
+
switch (locator.kind) {
|
|
288
|
+
case 'css':
|
|
289
|
+
return page.locator(locator.selector);
|
|
290
|
+
case 'id':
|
|
291
|
+
return page.locator(`[id=${cssAttributeValueLiteral(locator.value)}]`);
|
|
292
|
+
case 'data-attribute':
|
|
293
|
+
return page.locator(`[${locator.attribute}=${cssAttributeValueLiteral(locator.value)}]`);
|
|
294
|
+
case 'semantic-element':
|
|
295
|
+
return page.locator(locator.tag);
|
|
296
|
+
case 'role':
|
|
297
|
+
return page.getByRole(locator.role, locator.name === undefined ? undefined : { name: locator.name, exact: true });
|
|
298
|
+
case 'text':
|
|
299
|
+
return page.getByText(locator.text, { exact: true });
|
|
155
300
|
}
|
|
156
|
-
|
|
157
|
-
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Evaluates one locator against the live page: builds its real Playwright
|
|
304
|
+
* `Locator` and measures cardinality via `.count()` (no waiting, no
|
|
305
|
+
* `.first()`/`.nth(0)` shortcut that would silently resolve an ambiguous
|
|
306
|
+
* match). A locator that cannot be constructed or counted reliably is
|
|
307
|
+
* `unavailable`, never silently treated as zero matches.
|
|
308
|
+
*/
|
|
309
|
+
async function evaluateLocatorAttempt(page, locator) {
|
|
310
|
+
try {
|
|
311
|
+
const playwrightLocator = buildPlaywrightLocator(page, locator);
|
|
312
|
+
const matchCount = await playwrightLocator.count();
|
|
313
|
+
if (matchCount === 0)
|
|
314
|
+
return { playwrightLocator, outcome: { status: 'not-found', matchCount: 0 } };
|
|
315
|
+
if (matchCount > 1)
|
|
316
|
+
return { playwrightLocator, outcome: { status: 'ambiguous', matchCount } };
|
|
317
|
+
return { playwrightLocator, outcome: { status: 'matched', matchCount: 1 } };
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return { playwrightLocator: undefined, outcome: { status: 'unavailable' } };
|
|
158
321
|
}
|
|
159
322
|
}
|
|
160
|
-
/**
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
323
|
+
/**
|
|
324
|
+
* Looks up one already-resolved configured target by its stable observer
|
|
325
|
+
* name (case-insensitively, matching the same case-insensitive comparison
|
|
326
|
+
* `request.ts#normalizeRequest` already uses for target-name uniqueness) -
|
|
327
|
+
* never a second locator/resolution algorithm, just a lookup into the
|
|
328
|
+
* `resolveConfiguredTargets` result already computed once for this
|
|
329
|
+
* observation.
|
|
330
|
+
*/
|
|
331
|
+
export function findResolvedTarget(resolved, name) {
|
|
332
|
+
const lower = name.toLowerCase();
|
|
333
|
+
return resolved.find((info) => info.name.toLowerCase() === lower);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* The one canonical target-resolution algorithm (Phase 1 of the v0.2 Batch 3
|
|
337
|
+
* three-phase design below), exported so v0.3 Batch 2 scroll-scenario
|
|
338
|
+
* runtime-snapshot capture can resolve configured targets exactly once and
|
|
339
|
+
* reuse the same live `{locator, handle}` pairs across its initial/final
|
|
340
|
+
* snapshots, instead of re-implementing resolution with different locator
|
|
341
|
+
* semantics. Callers own disposing any returned `handle`.
|
|
342
|
+
*/
|
|
343
|
+
export async function resolveConfiguredTargets(page, targets) {
|
|
344
|
+
const infos = [];
|
|
164
345
|
for (const target of targets) {
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
346
|
+
const attempts = [];
|
|
347
|
+
let stopStatus;
|
|
348
|
+
let matchedIndex;
|
|
349
|
+
let matchedPlaywrightLocator;
|
|
350
|
+
for (let index = 0; index < target.locators.length; index += 1) {
|
|
351
|
+
const locator = target.locators[index];
|
|
352
|
+
const { playwrightLocator, outcome } = await evaluateLocatorAttempt(page, locator);
|
|
353
|
+
attempts.push({
|
|
354
|
+
locatorIndex: index,
|
|
355
|
+
locatorKind: locator.kind,
|
|
356
|
+
status: outcome.status,
|
|
357
|
+
...(outcome.matchCount !== undefined ? { matchCount: outcome.matchCount } : {}),
|
|
358
|
+
});
|
|
359
|
+
if (outcome.status === 'matched' && playwrightLocator) {
|
|
360
|
+
stopStatus = 'matched';
|
|
361
|
+
matchedIndex = index;
|
|
362
|
+
matchedPlaywrightLocator = playwrightLocator;
|
|
363
|
+
break;
|
|
364
|
+
}
|
|
365
|
+
if (outcome.status === 'ambiguous') {
|
|
366
|
+
stopStatus = 'ambiguous';
|
|
367
|
+
break;
|
|
368
|
+
}
|
|
369
|
+
if (outcome.status === 'unavailable') {
|
|
370
|
+
stopStatus = 'unavailable';
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
// 'not-found': fall through to the next configured locator.
|
|
374
|
+
}
|
|
375
|
+
if (stopStatus === 'matched' && matchedPlaywrightLocator && matchedIndex !== undefined) {
|
|
376
|
+
try {
|
|
377
|
+
const handles = await matchedPlaywrightLocator.elementHandles();
|
|
378
|
+
const handle = handles[0];
|
|
379
|
+
if (handle) {
|
|
380
|
+
infos.push({
|
|
381
|
+
name: target.name,
|
|
382
|
+
attempts,
|
|
383
|
+
status: 'matched',
|
|
384
|
+
selectedIndex: matchedIndex,
|
|
385
|
+
locator: matchedPlaywrightLocator,
|
|
386
|
+
handle: handle,
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
infos.push({ name: target.name, attempts, status: 'not-found' });
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
395
|
+
infos.push({ name: target.name, attempts, status: 'unavailable', unavailableReason: `target evaluation failed: ${message}` });
|
|
396
|
+
}
|
|
170
397
|
}
|
|
171
|
-
if (
|
|
172
|
-
|
|
173
|
-
diagnostics.push(diagnostic('target-ambiguous', `${matchCount} elements matched selector for target "${target.name}"`, target.name));
|
|
174
|
-
continue;
|
|
398
|
+
else if (stopStatus === 'ambiguous') {
|
|
399
|
+
infos.push({ name: target.name, attempts, status: 'ambiguous' });
|
|
175
400
|
}
|
|
176
|
-
|
|
177
|
-
|
|
401
|
+
else if (stopStatus === 'unavailable') {
|
|
402
|
+
infos.push({ name: target.name, attempts, status: 'unavailable' });
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
infos.push({ name: target.name, attempts, status: 'not-found' });
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return infos;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Observes every explicitly configured target from the same live page,
|
|
412
|
+
* honoring the frozen ordered-locator resolution contract: 0 matches tries
|
|
413
|
+
* the next locator; exactly 1 match selects and stops; more than 1 match is
|
|
414
|
+
* ambiguous and stops (never falls through); an unevaluable locator is
|
|
415
|
+
* unavailable and stops (never falls through). Ambiguity never triggers
|
|
416
|
+
* fallback.
|
|
417
|
+
*
|
|
418
|
+
* Batch 3 restructures this into three phases over one resolved set: (1)
|
|
419
|
+
* resolve every configured target exactly once, keeping a live
|
|
420
|
+
* `{locator, handle}` for each match; (2) compute bounded pairwise DOM
|
|
421
|
+
* containment among only the resolved configured targets, reusing those
|
|
422
|
+
* same handles (never re-resolving, never a second/independent resolution
|
|
423
|
+
* algorithm); (3) measure every resolved target and assemble its evidence,
|
|
424
|
+
* attaching the phase-2 containment result. Every handle is disposed once,
|
|
425
|
+
* after all three phases, regardless of outcome.
|
|
426
|
+
*/
|
|
427
|
+
export async function captureTargetEvidence(page, targets) {
|
|
428
|
+
const targetEvidence = {};
|
|
429
|
+
const diagnostics = [];
|
|
430
|
+
// Phase 1: resolve every configured target exactly once.
|
|
431
|
+
const infos = await resolveConfiguredTargets(page, targets);
|
|
432
|
+
try {
|
|
433
|
+
// Phase 2: bounded pairwise DOM containment among the configured targets
|
|
434
|
+
// only (never unconfigured ancestors), in configured target order.
|
|
435
|
+
const containmentByName = new Map();
|
|
436
|
+
for (const info of infos) {
|
|
437
|
+
if (info.status !== 'matched' || !info.handle)
|
|
438
|
+
continue;
|
|
439
|
+
const selfHandle = info.handle;
|
|
440
|
+
const containedByTargetIds = [];
|
|
441
|
+
const evaluatedTargetIds = [];
|
|
442
|
+
const unresolvedTargetIds = [];
|
|
443
|
+
for (const other of infos) {
|
|
444
|
+
if (other.name === info.name)
|
|
445
|
+
continue;
|
|
446
|
+
if (other.status === 'matched' && other.handle) {
|
|
447
|
+
evaluatedTargetIds.push(other.name);
|
|
448
|
+
const contains = await other.handle.evaluate((elOther, elSelf) => elOther !== elSelf && elOther.contains(elSelf), selfHandle);
|
|
449
|
+
if (contains)
|
|
450
|
+
containedByTargetIds.push(other.name);
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
unresolvedTargetIds.push(other.name);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
containmentByName.set(info.name, containmentEvidence({ containedByTargetIds, evaluatedTargetIds, unresolvedTargetIds }, undefined));
|
|
178
457
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
458
|
+
// Phase 3: measure resolved targets and assemble every target's evidence.
|
|
459
|
+
for (const info of infos) {
|
|
460
|
+
if (info.status === 'matched' && info.locator && info.handle && info.selectedIndex !== undefined) {
|
|
461
|
+
try {
|
|
462
|
+
const containment = containmentByName.get(info.name) ?? containmentEvidence(undefined, 'containment could not be computed');
|
|
463
|
+
const { record, visible } = await captureResolvedTargetRecord(info.locator, info.handle, info.attempts, info.selectedIndex, containment);
|
|
464
|
+
targetEvidence[info.name] = record;
|
|
465
|
+
if (!visible) {
|
|
466
|
+
diagnostics.push(diagnostic('target-hidden', `target "${info.name}" resolved but is not visible`, info.name));
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
catch (err) {
|
|
470
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
471
|
+
const reason = `target evaluation failed: ${message}`;
|
|
472
|
+
targetEvidence[info.name] = unresolvedTargetRecord('unavailable', info.attempts, reason, containmentEvidence(undefined, `target itself could not be measured: ${reason}`));
|
|
473
|
+
diagnostics.push(diagnostic('browser-evidence-unavailable', reason, info.name));
|
|
474
|
+
}
|
|
475
|
+
continue;
|
|
476
|
+
}
|
|
477
|
+
const selfUnresolvedReason = `target itself did not resolve (status: ${info.status})`;
|
|
478
|
+
if (info.status === 'ambiguous') {
|
|
479
|
+
const lastAttempt = info.attempts[info.attempts.length - 1];
|
|
480
|
+
const matchCount = lastAttempt?.matchCount ?? 0;
|
|
481
|
+
targetEvidence[info.name] = unresolvedTargetRecord('ambiguous', info.attempts, `target locator matched ${matchCount} elements; expected exactly one`, containmentEvidence(undefined, selfUnresolvedReason));
|
|
482
|
+
diagnostics.push(diagnostic('target-ambiguous', `${matchCount} elements matched a locator for target "${info.name}"`, info.name));
|
|
483
|
+
}
|
|
484
|
+
else if (info.status === 'unavailable') {
|
|
485
|
+
const reason = info.unavailableReason ?? `target locator could not be evaluated reliably for "${info.name}"`;
|
|
486
|
+
targetEvidence[info.name] = unresolvedTargetRecord('unavailable', info.attempts, reason, containmentEvidence(undefined, selfUnresolvedReason));
|
|
487
|
+
diagnostics.push(diagnostic('browser-evidence-unavailable', reason, info.name));
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
targetEvidence[info.name] = unresolvedTargetRecord('not-found', info.attempts, 'no configured locator matched an element', containmentEvidence(undefined, selfUnresolvedReason));
|
|
491
|
+
diagnostics.push(diagnostic('target-missing', `no locator matched an element for target "${info.name}"`, info.name));
|
|
492
|
+
}
|
|
197
493
|
}
|
|
198
494
|
}
|
|
495
|
+
finally {
|
|
496
|
+
await Promise.all(infos.filter((info) => info.handle).map((info) => info.handle.dispose()));
|
|
497
|
+
}
|
|
199
498
|
return { targetEvidence, diagnostics };
|
|
200
499
|
}
|
|
201
500
|
//# sourceMappingURL=evidenceCapture.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidenceCapture.js","sourceRoot":"","sources":["../../src/browser/evidenceCapture.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evidenceCapture.js","sourceRoot":"","sources":["../../src/browser/evidenceCapture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Page } from 'playwright';
|
|
2
|
+
import type { Viewport } from '../request/request.js';
|
|
3
|
+
import type { ScrollRuntimeSnapshot } from '../domain/schema.js';
|
|
4
|
+
import type { ResolvedTargetInfo } from './evidenceCapture.js';
|
|
5
|
+
/**
|
|
6
|
+
* Captures one point-in-time bounded `ScrollRuntimeSnapshot` (Batch 1 frozen
|
|
7
|
+
* contract) from the live page, using already-resolved target handles -
|
|
8
|
+
* never re-resolving targets itself. Called twice by the scenario lifecycle
|
|
9
|
+
* (once before the scroll action, once after stabilization) against the
|
|
10
|
+
* exact same `resolved` set, so "which browser element is target X" is
|
|
11
|
+
* answered exactly once per observation's scenario capture.
|
|
12
|
+
*/
|
|
13
|
+
export declare function captureScrollRuntimeSnapshot(page: Page, resolved: readonly ResolvedTargetInfo[], viewport: Viewport): Promise<ScrollRuntimeSnapshot>;
|
|
14
|
+
/**
|
|
15
|
+
* Immediate, non-smooth window scroll using the Batch 1 normalized delta.
|
|
16
|
+
* `behavior: 'instant'` guarantees no smooth-scroll animation regardless of
|
|
17
|
+
* any `scroll-behavior: smooth` the observed page's own CSS declares - the
|
|
18
|
+
* position change is synchronous within this one `evaluate()` call.
|
|
19
|
+
*/
|
|
20
|
+
export declare function performWindowScrollBy(page: Page, deltaX: number, deltaY: number): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Immediate, non-smooth scroll of one uniquely-resolved configured target
|
|
23
|
+
* element, using the same `behavior: 'instant'` primitive as
|
|
24
|
+
* {@link performWindowScrollBy} - one stabilization/execution contract for
|
|
25
|
+
* both action kinds, never a forked one. `element.scrollBy` is a real,
|
|
26
|
+
* browser-native immediate-scroll method on every `Element` (no dependency
|
|
27
|
+
* on the target actually being scrollable - a non-overflowing target simply
|
|
28
|
+
* produces no position change, which is a valid, honestly-reported outcome).
|
|
29
|
+
*/
|
|
30
|
+
export declare function performTargetScrollBy(handle: NonNullable<ResolvedTargetInfo['handle']>, deltaX: number, deltaY: number): Promise<void>;
|
|
31
|
+
/** The Batch 1 frozen stabilization contract: exactly two `requestAnimationFrame` cycles on the live page, no timers/sleeps/network-idle substitutes. */
|
|
32
|
+
export declare function waitTwoAnimationFrames(page: Page): Promise<void>;
|