@testmuai/playwright-bindings 0.1.26 → 0.1.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actionEngine.d.ts +37 -0
- package/dist/actionEngine.d.ts.map +1 -0
- package/dist/actionEngine.js +194 -0
- package/dist/actionEngine.js.map +1 -0
- package/dist/actionSpecs.d.ts +35 -0
- package/dist/actionSpecs.d.ts.map +1 -0
- package/dist/actionSpecs.js +354 -0
- package/dist/actionSpecs.js.map +1 -0
- package/dist/capability.d.ts +3 -5
- package/dist/capability.d.ts.map +1 -1
- package/dist/capability.js +66 -6
- package/dist/capability.js.map +1 -1
- package/dist/configure.d.ts +16 -0
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +14 -0
- package/dist/configure.js.map +1 -1
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +29 -0
- package/dist/errors.js.map +1 -1
- package/dist/healCache.d.ts +28 -0
- package/dist/healCache.d.ts.map +1 -0
- package/dist/healCache.js +17 -0
- package/dist/healCache.js.map +1 -0
- package/dist/healPatch.d.ts.map +1 -1
- package/dist/healPatch.js +45 -3
- package/dist/healPatch.js.map +1 -1
- package/dist/helpers/assertion.d.ts.map +1 -1
- package/dist/helpers/assertion.js +18 -0
- package/dist/helpers/assertion.js.map +1 -1
- package/dist/helpers/assertionV3.d.ts +67 -0
- package/dist/helpers/assertionV3.d.ts.map +1 -0
- package/dist/helpers/assertionV3.js +384 -0
- package/dist/helpers/assertionV3.js.map +1 -0
- package/dist/helpers/condition.d.ts +84 -0
- package/dist/helpers/condition.d.ts.map +1 -0
- package/dist/helpers/condition.js +292 -0
- package/dist/helpers/condition.js.map +1 -0
- package/dist/helpers/cookies.d.ts +12 -0
- package/dist/helpers/cookies.d.ts.map +1 -0
- package/dist/helpers/cookies.js +66 -0
- package/dist/helpers/cookies.js.map +1 -0
- package/dist/helpers/coordinateResolver.d.ts +29 -0
- package/dist/helpers/coordinateResolver.d.ts.map +1 -0
- package/dist/helpers/coordinateResolver.js +118 -0
- package/dist/helpers/coordinateResolver.js.map +1 -0
- package/dist/helpers/coordinateResolverRead.d.ts +36 -0
- package/dist/helpers/coordinateResolverRead.d.ts.map +1 -0
- package/dist/helpers/coordinateResolverRead.js +107 -0
- package/dist/helpers/coordinateResolverRead.js.map +1 -0
- package/dist/helpers/dialog.d.ts +29 -0
- package/dist/helpers/dialog.d.ts.map +1 -0
- package/dist/helpers/dialog.js +35 -0
- package/dist/helpers/dialog.js.map +1 -0
- package/dist/helpers/drag.d.ts +36 -1
- package/dist/helpers/drag.d.ts.map +1 -1
- package/dist/helpers/drag.js +267 -0
- package/dist/helpers/drag.js.map +1 -1
- package/dist/helpers/executeApi.d.ts +2 -0
- package/dist/helpers/executeApi.d.ts.map +1 -1
- package/dist/helpers/executeApi.js +30 -10
- package/dist/helpers/executeApi.js.map +1 -1
- package/dist/helpers/executeJs.d.ts.map +1 -1
- package/dist/helpers/executeJs.js +46 -3
- package/dist/helpers/executeJs.js.map +1 -1
- package/dist/helpers/gesture.d.ts +45 -0
- package/dist/helpers/gesture.d.ts.map +1 -0
- package/dist/helpers/gesture.js +131 -0
- package/dist/helpers/gesture.js.map +1 -0
- package/dist/helpers/healCascade.d.ts +57 -0
- package/dist/helpers/healCascade.d.ts.map +1 -0
- package/dist/helpers/healCascade.js +363 -0
- package/dist/helpers/healCascade.js.map +1 -0
- package/dist/helpers/png.d.ts +3 -0
- package/dist/helpers/png.d.ts.map +1 -0
- package/dist/helpers/png.js +18 -0
- package/dist/helpers/png.js.map +1 -0
- package/dist/helpers/screenshot.d.ts +27 -0
- package/dist/helpers/screenshot.d.ts.map +1 -1
- package/dist/helpers/screenshot.js +56 -0
- package/dist/helpers/screenshot.js.map +1 -1
- package/dist/helpers/scrollUntil.d.ts +13 -0
- package/dist/helpers/scrollUntil.d.ts.map +1 -0
- package/dist/helpers/scrollUntil.js +88 -0
- package/dist/helpers/scrollUntil.js.map +1 -0
- package/dist/helpers/tabs.d.ts +42 -1
- package/dist/helpers/tabs.d.ts.map +1 -1
- package/dist/helpers/tabs.js +259 -5
- package/dist/helpers/tabs.js.map +1 -1
- package/dist/helpers/text.d.ts +15 -0
- package/dist/helpers/text.d.ts.map +1 -0
- package/dist/helpers/text.js +24 -0
- package/dist/helpers/text.js.map +1 -0
- package/dist/helpers/textNormalize.d.ts +18 -0
- package/dist/helpers/textNormalize.d.ts.map +1 -0
- package/dist/helpers/textNormalize.js +39 -0
- package/dist/helpers/textNormalize.js.map +1 -0
- package/dist/helpers/textualRead.d.ts +37 -0
- package/dist/helpers/textualRead.d.ts.map +1 -0
- package/dist/helpers/textualRead.js +211 -0
- package/dist/helpers/textualRead.js.map +1 -0
- package/dist/helpers/vision.d.ts +2 -0
- package/dist/helpers/vision.d.ts.map +1 -1
- package/dist/helpers/vision.js +11 -0
- package/dist/helpers/vision.js.map +1 -1
- package/dist/helpers/visionV3.d.ts +38 -0
- package/dist/helpers/visionV3.d.ts.map +1 -0
- package/dist/helpers/visionV3.js +291 -0
- package/dist/helpers/visionV3.js.map +1 -0
- package/dist/helpers/wait.d.ts +14 -1
- package/dist/helpers/wait.d.ts.map +1 -1
- package/dist/helpers/wait.js +25 -0
- package/dist/helpers/wait.js.map +1 -1
- package/dist/index.d.ts +29 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -4
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts +4 -1
- package/dist/log.d.ts.map +1 -1
- package/dist/log.js +8 -3
- package/dist/log.js.map +1 -1
- package/dist/rankedLocator.d.ts +27 -0
- package/dist/rankedLocator.d.ts.map +1 -0
- package/dist/rankedLocator.js +85 -0
- package/dist/rankedLocator.js.map +1 -0
- package/dist/reporters/index.d.ts +2 -0
- package/dist/reporters/index.d.ts.map +1 -1
- package/dist/reporters/index.js.map +1 -1
- package/dist/reporters/lt.d.ts.map +1 -1
- package/dist/reporters/lt.js +7 -1
- package/dist/reporters/lt.js.map +1 -1
- package/dist/routeFailure.d.ts +9 -0
- package/dist/routeFailure.d.ts.map +1 -0
- package/dist/routeFailure.js +34 -0
- package/dist/routeFailure.js.map +1 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +21 -0
- package/dist/session.js.map +1 -1
- package/dist/step.d.ts +10 -0
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +14 -1
- package/dist/step.js.map +1 -1
- package/dist/testConfig.d.ts.map +1 -1
- package/dist/testConfig.js +8 -1
- package/dist/testConfig.js.map +1 -1
- package/dist/vars.d.ts +10 -0
- package/dist/vars.d.ts.map +1 -1
- package/dist/vars.js +30 -3
- package/dist/vars.js.map +1 -1
- package/dist/visionLocator.d.ts +53 -0
- package/dist/visionLocator.d.ts.map +1 -0
- package/dist/visionLocator.js +117 -0
- package/dist/visionLocator.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { get as configGet } from '../configure.js';
|
|
2
|
+
import { log, repr } from '../log.js';
|
|
3
|
+
import { resolveVar } from '../vars.js';
|
|
4
|
+
import { derive } from './derive.js';
|
|
5
|
+
import { captureScreenshotB64 } from './screenshot.js';
|
|
6
|
+
import { getV3DesktopLocateFullPageTarget } from './healCascade.js';
|
|
7
|
+
import { resolveCoordinateRead } from './coordinateResolverRead.js';
|
|
8
|
+
import { LOCAL_READ_ATTRS, extractValue } from './textualRead.js';
|
|
9
|
+
export const V3_HEAL_VISION_PATH = '/v1/heal/vision';
|
|
10
|
+
export const V3_HEAL_TEXTUAL_QUERY_PATH = '/v1/heal/textual_query';
|
|
11
|
+
const V3_POST_TIMEOUT_MS = 30_000;
|
|
12
|
+
// Computed styles requested on the textual_query DOMSnapshot (PY _CSS_PROPERTIES).
|
|
13
|
+
const V3_SNAPSHOT_CSS_PROPERTIES = [
|
|
14
|
+
'color', 'background-color', 'border-color',
|
|
15
|
+
'font-size', 'font-family', 'font-weight', 'font-style',
|
|
16
|
+
'display', 'visibility', 'opacity',
|
|
17
|
+
];
|
|
18
|
+
// Outer payload fields coerced to str (null -> '') for the server schema.
|
|
19
|
+
const V3_STR_FIELDS = [
|
|
20
|
+
'code_export_id', 'commit_id', 'test_id', 'username', 'accesskey', 'session_id',
|
|
21
|
+
];
|
|
22
|
+
/** bool: JSON bools + truthy strings; number: float w/ digit-filter fallback;
|
|
23
|
+
* else str ('' for null). PY _cast_v3_vision_query_result parity. */
|
|
24
|
+
export function castV3VisionQueryResult(raw, returnType) {
|
|
25
|
+
if (returnType === 'bool') {
|
|
26
|
+
if (typeof raw === 'boolean')
|
|
27
|
+
return raw;
|
|
28
|
+
return ['true', '1', 'yes'].includes(String(raw).trim().toLowerCase());
|
|
29
|
+
}
|
|
30
|
+
if (returnType === 'number') {
|
|
31
|
+
if (typeof raw === 'number')
|
|
32
|
+
return raw;
|
|
33
|
+
const s = String(raw).trim();
|
|
34
|
+
const direct = Number(s);
|
|
35
|
+
if (s !== '' && Number.isFinite(direct))
|
|
36
|
+
return direct;
|
|
37
|
+
const filtered = [...s].filter((c) => (c >= '0' && c <= '9') || c === '.').join('');
|
|
38
|
+
const parsed = Number(filtered);
|
|
39
|
+
return filtered && Number.isFinite(parsed) ? parsed : 0.0;
|
|
40
|
+
}
|
|
41
|
+
return raw === null || raw === undefined ? '' : String(raw);
|
|
42
|
+
}
|
|
43
|
+
/** Only 'number' is special-cased; ''/null pass through; '-' anywhere flips
|
|
44
|
+
* the sign of the digit-filter fallback. PY _coerce_textual_value parity. */
|
|
45
|
+
export function coerceTextualValue(value, returnType) {
|
|
46
|
+
if (returnType !== 'number')
|
|
47
|
+
return value;
|
|
48
|
+
if (value === null || value === undefined || value === '')
|
|
49
|
+
return value;
|
|
50
|
+
if (typeof value === 'number')
|
|
51
|
+
return value;
|
|
52
|
+
const direct = Number(value);
|
|
53
|
+
if (typeof value !== 'boolean' && Number.isFinite(direct) && String(value).trim() !== '') {
|
|
54
|
+
return direct;
|
|
55
|
+
}
|
|
56
|
+
const s = String(value);
|
|
57
|
+
const isNegative = s.includes('-');
|
|
58
|
+
const filtered = [...s].filter((c) => (c >= '0' && c <= '9') || c === '.').join('');
|
|
59
|
+
if (!filtered)
|
|
60
|
+
return 0.0;
|
|
61
|
+
const parsed = Number(filtered);
|
|
62
|
+
if (!Number.isFinite(parsed))
|
|
63
|
+
return 0.0;
|
|
64
|
+
return isNegative ? -parsed : parsed;
|
|
65
|
+
}
|
|
66
|
+
/** Coerce outer payload types in place: str fields via String() (null -> ''),
|
|
67
|
+
* org_id to int (unparseable -> 0). PY _normalize_v3_payload_types parity. */
|
|
68
|
+
export function normalizeV3PayloadTypes(payload) {
|
|
69
|
+
for (const key of V3_STR_FIELDS) {
|
|
70
|
+
if (key in payload) {
|
|
71
|
+
const v = payload[key];
|
|
72
|
+
payload[key] = v === null || v === undefined ? '' : String(v);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if ('org_id' in payload) {
|
|
76
|
+
const raw = payload['org_id'];
|
|
77
|
+
const parsed = parseInt(String(raw), 10);
|
|
78
|
+
payload['org_id'] = raw === null || raw === undefined || raw === '' || Number.isNaN(parsed) ? 0 : parsed;
|
|
79
|
+
}
|
|
80
|
+
return payload;
|
|
81
|
+
}
|
|
82
|
+
// Configure creds when present, LT_* env otherwise (grid runs configure only
|
|
83
|
+
// the runtime IDs; creds arrive via env — same fallback as healCascade).
|
|
84
|
+
function v3Creds() {
|
|
85
|
+
return {
|
|
86
|
+
username: String(configGet('username') ?? '') || (process.env['LT_USERNAME'] ?? ''),
|
|
87
|
+
accesskey: String(configGet('accesskey') ?? '') || (process.env['LT_ACCESS_KEY'] ?? ''),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function v3AuthHeaders() {
|
|
91
|
+
const { username, accesskey } = v3Creds();
|
|
92
|
+
return {
|
|
93
|
+
'Content-Type': 'application/json',
|
|
94
|
+
Authorization: `Basic ${Buffer.from(`${username}:${accesskey}`).toString('base64')}`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** HTTP layer separated for testability (stubbed via global fetch in tests). */
|
|
98
|
+
export async function postV3Vision(url, payload, headers) {
|
|
99
|
+
const resp = await fetch(url, {
|
|
100
|
+
method: 'POST',
|
|
101
|
+
headers,
|
|
102
|
+
body: JSON.stringify(payload),
|
|
103
|
+
signal: AbortSignal.timeout(V3_POST_TIMEOUT_MS),
|
|
104
|
+
});
|
|
105
|
+
if (resp.status >= 400) {
|
|
106
|
+
const body = await resp.text().catch(() => '');
|
|
107
|
+
log.helper(`[v3 vision] HTTP ${resp.status} body=${body.slice(0, 1000)}`);
|
|
108
|
+
throw new Error(`HTTP ${resp.status} from ${url}`);
|
|
109
|
+
}
|
|
110
|
+
return (await resp.json());
|
|
111
|
+
}
|
|
112
|
+
function buildCurrentAction(operationType, intent, operationDict) {
|
|
113
|
+
return {
|
|
114
|
+
operation_type: operationType,
|
|
115
|
+
operation_intent: intent,
|
|
116
|
+
instruction_id: '',
|
|
117
|
+
operation_id: '',
|
|
118
|
+
use_query_v2: true,
|
|
119
|
+
version: 'v3',
|
|
120
|
+
selector: [],
|
|
121
|
+
frame_info: [],
|
|
122
|
+
sub_instruction_obj: { operation_dict: operationDict },
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function baseV3Payload() {
|
|
126
|
+
const { username, accesskey } = v3Creds();
|
|
127
|
+
return {
|
|
128
|
+
code_export_id: configGet('codeExportId'),
|
|
129
|
+
commit_id: configGet('commitId'),
|
|
130
|
+
test_id: configGet('testId'),
|
|
131
|
+
username,
|
|
132
|
+
accesskey,
|
|
133
|
+
org_id: configGet('orgId'),
|
|
134
|
+
session_id: configGet('sessionId'),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* V3 vision query — POST screenshot + intent to {automind}/v1/heal/vision and
|
|
139
|
+
* read `vision_query`, cast to returnType. Throws on transport failure, error
|
|
140
|
+
* envelope, or a missing field (a junk store is worse than a loud step fail).
|
|
141
|
+
*/
|
|
142
|
+
export async function visionQueryV3(page, description, returnType, codeJs) {
|
|
143
|
+
const resolvedRaw = await resolveVar(description);
|
|
144
|
+
const resolved = resolvedRaw === null || resolvedRaw === undefined ? '' : String(resolvedRaw);
|
|
145
|
+
const baseUrl = String(configGet('automindUrl') ?? '');
|
|
146
|
+
if (!baseUrl) {
|
|
147
|
+
log.helper('[vision_query] no heal endpoint configured');
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
const screenshotB64 = await captureScreenshotB64(page);
|
|
151
|
+
const payload = normalizeV3PayloadTypes({
|
|
152
|
+
...baseV3Payload(),
|
|
153
|
+
current_action: buildCurrentAction('VISION_QUERY', resolved, {
|
|
154
|
+
queried_value: resolved,
|
|
155
|
+
result_type: returnType,
|
|
156
|
+
}),
|
|
157
|
+
untagged_image_base64: screenshotB64,
|
|
158
|
+
use_query_v2: true,
|
|
159
|
+
version: 'v3',
|
|
160
|
+
});
|
|
161
|
+
let result;
|
|
162
|
+
try {
|
|
163
|
+
result = await postV3Vision(`${baseUrl}${V3_HEAL_VISION_PATH}`, payload, v3AuthHeaders());
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
log.helper(`[vision_query] '${description.slice(0, 80)}': ${String(e)}`);
|
|
167
|
+
throw new Error(`vision_query failed: ${String(e)}`);
|
|
168
|
+
}
|
|
169
|
+
if (result['error'])
|
|
170
|
+
throw new Error(`vision_query failed: ${String(result['error'])}`);
|
|
171
|
+
const raw = result['vision_query'];
|
|
172
|
+
if (raw === null || raw === undefined) {
|
|
173
|
+
throw new Error(`vision_query response missing 'vision_query' field: ${JSON.stringify(result)}`);
|
|
174
|
+
}
|
|
175
|
+
const extracted = castV3VisionQueryResult(raw, returnType);
|
|
176
|
+
log.helper(`[vision_query] result=${repr(extracted).slice(0, 120)}`);
|
|
177
|
+
if (codeJs === undefined)
|
|
178
|
+
return extracted;
|
|
179
|
+
return await derive(page, codeJs, String(extracted));
|
|
180
|
+
}
|
|
181
|
+
/** Raw CDP a11y + DOM snapshots for the server-side textual read. Chromium
|
|
182
|
+
* only (the grid CDP path); PY's webkit/firefox runtime-asset route N/A here. */
|
|
183
|
+
async function captureV3SnapshotsWithCdp(page) {
|
|
184
|
+
const cdp = await page.context().newCDPSession(page);
|
|
185
|
+
try {
|
|
186
|
+
await cdp.send('Accessibility.enable');
|
|
187
|
+
const a11ySnapshot = await cdp.send('Accessibility.getFullAXTree');
|
|
188
|
+
const domSnapshot = await cdp.send('DOMSnapshot.captureSnapshot', {
|
|
189
|
+
computedStyles: V3_SNAPSHOT_CSS_PROPERTIES,
|
|
190
|
+
includeDOMRects: true,
|
|
191
|
+
});
|
|
192
|
+
return [a11ySnapshot, domSnapshot];
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
await cdp.detach();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/** Pin the xpath= Playwright engine for a read-resolver derived selector
|
|
199
|
+
* (PY _v3_textual_selector — a stand-in for actionEngine.engineSelector that
|
|
200
|
+
* avoids the import cycle actionEngine → healCascade → this module). */
|
|
201
|
+
function v3TextualSelector(xpath) {
|
|
202
|
+
if (xpath.startsWith('xpath=') || xpath.startsWith('css=') || xpath.startsWith('text='))
|
|
203
|
+
return xpath;
|
|
204
|
+
if (xpath.startsWith('/') || xpath.startsWith('('))
|
|
205
|
+
return `xpath=${xpath}`;
|
|
206
|
+
return xpath;
|
|
207
|
+
}
|
|
208
|
+
/** Scroll the page-space target into the viewport and return clamped viewport
|
|
209
|
+
* coords. Mirrors the tier scroll math in healCascade's full-page tier —
|
|
210
|
+
* duplicated (~10 lines, like PY) so the cascade module stays untouched. */
|
|
211
|
+
async function scrollIntoViewViewportCoords(page, coords) {
|
|
212
|
+
const px = Math.trunc(coords[0]);
|
|
213
|
+
const py = Math.trunc(coords[1]);
|
|
214
|
+
const vp = (await page.evaluate(() => [window.innerWidth, window.innerHeight]));
|
|
215
|
+
const vw = Math.trunc(vp[0]) || 1920;
|
|
216
|
+
const vh = Math.trunc(vp[1]) || 1080;
|
|
217
|
+
await page.evaluate(([x, y, w, h]) => window.scrollTo(Math.max(0, x - Math.floor(w / 2)), Math.max(0, y - Math.floor(h / 2))), [px, py, vw, vh]);
|
|
218
|
+
await new Promise((r) => setTimeout(r, 150));
|
|
219
|
+
const scroll = (await page.evaluate(() => [window.scrollX, window.scrollY]));
|
|
220
|
+
const vx = Math.max(0, Math.min(px - Math.trunc(scroll[0]), vw - 1));
|
|
221
|
+
const vy = Math.max(0, Math.min(py - Math.trunc(scroll[1]), vh - 1));
|
|
222
|
+
return [vx, vy];
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* V3 textual query — locate element locally then read the attribute, with the
|
|
226
|
+
* server POST as last-resort fallback (PY _textual_query_v3 route table):
|
|
227
|
+
* 1. no automindUrl → null (no CDP, no network);
|
|
228
|
+
* 2. attribute empty or not in LOCAL_READ_ATTRS → server straight away;
|
|
229
|
+
* 3. supported attr → DESKTOP_LOCATE_FULL_PAGE → scroll into view →
|
|
230
|
+
* read-resolver (exact hit, no up-walk) → extractValue, no server POST;
|
|
231
|
+
* 4. any locate/resolve/read failure → server fallback with the RAW
|
|
232
|
+
* description (byte-identical to the pre-existing server contract).
|
|
233
|
+
*/
|
|
234
|
+
export async function textualQueryV3(page, description, returnType, selectedAttributeName = '') {
|
|
235
|
+
const baseUrl = String(configGet('automindUrl') ?? '');
|
|
236
|
+
if (!baseUrl) {
|
|
237
|
+
log.helper('[textual_query] no heal endpoint configured');
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
if (selectedAttributeName && LOCAL_READ_ATTRS.has(selectedAttributeName)) {
|
|
241
|
+
// Locate-then-read path. resolveVar resolves {{vars}} for the locate
|
|
242
|
+
// intent only; the RAW description goes to the server fallback. Errors
|
|
243
|
+
// (including var resolution) degrade to the server, never hard-fail.
|
|
244
|
+
try {
|
|
245
|
+
const resolvedRaw = await resolveVar(description);
|
|
246
|
+
const resolvedDesc = resolvedRaw === null || resolvedRaw === undefined ? '' : String(resolvedRaw);
|
|
247
|
+
const coords = await getV3DesktopLocateFullPageTarget(page, resolvedDesc);
|
|
248
|
+
if (coords !== null) {
|
|
249
|
+
const [vx, vy] = await scrollIntoViewViewportCoords(page, coords);
|
|
250
|
+
const target = await resolveCoordinateRead(page, vx, vy);
|
|
251
|
+
if (target !== null) {
|
|
252
|
+
const loc = page.locator(v3TextualSelector(target.xpath));
|
|
253
|
+
const extracted = await extractValue(loc, selectedAttributeName, null, returnType);
|
|
254
|
+
log.helper(`[textual_query] result=${repr(extracted).slice(0, 120)}`);
|
|
255
|
+
return extracted;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
catch (e) {
|
|
260
|
+
log.helper(`[textual_query] locate-read failed (${String(e)}); server fallback`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const [a11ySnapshot, domSnapshot] = await captureV3SnapshotsWithCdp(page);
|
|
264
|
+
const payload = normalizeV3PayloadTypes({
|
|
265
|
+
...baseV3Payload(),
|
|
266
|
+
current_action: buildCurrentAction('TEXTUAL_QUERY', description, {
|
|
267
|
+
queried_value: description,
|
|
268
|
+
selected_attribute_name: selectedAttributeName,
|
|
269
|
+
}),
|
|
270
|
+
version: 'v3',
|
|
271
|
+
a11y_snapshot: a11ySnapshot,
|
|
272
|
+
dom_snapshot: domSnapshot,
|
|
273
|
+
is_browser: true,
|
|
274
|
+
is_mobile: false,
|
|
275
|
+
device_os: '',
|
|
276
|
+
});
|
|
277
|
+
let result;
|
|
278
|
+
try {
|
|
279
|
+
result = await postV3Vision(`${baseUrl}${V3_HEAL_TEXTUAL_QUERY_PATH}`, payload, v3AuthHeaders());
|
|
280
|
+
}
|
|
281
|
+
catch (e) {
|
|
282
|
+
log.helper(`[textual_query] '${description.slice(0, 80)}': ${String(e)}`);
|
|
283
|
+
throw new Error(`textual_query failed: ${String(e)}`);
|
|
284
|
+
}
|
|
285
|
+
if (result['error'])
|
|
286
|
+
throw new Error(`textual_query failed: ${String(result['error'])}`);
|
|
287
|
+
const extracted = coerceTextualValue(result['value'], returnType);
|
|
288
|
+
log.helper(`[textual_query] result=${repr(extracted).slice(0, 120)}`);
|
|
289
|
+
return extracted;
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=visionV3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visionV3.js","sourceRoot":"","sources":["../../src/helpers/visionV3.ts"],"names":[],"mappings":"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"}
|
package/dist/helpers/wait.d.ts
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import type { Page } from 'playwright';
|
|
2
|
-
|
|
2
|
+
import type { Condition } from './condition.js';
|
|
3
|
+
/**
|
|
4
|
+
* Until-loop condition check — TWO forms, selected by argument type (the V3
|
|
5
|
+
* contract's deliberate divergence: a Condition crosses the boundary as a
|
|
6
|
+
* LIVE OBJECT, never a stringified repr the binding evals):
|
|
7
|
+
*
|
|
8
|
+
* - `Condition` instance → LOCAL evaluation against the variable store. No
|
|
9
|
+
* screenshot, no vision endpoint. Unevaluable throws
|
|
10
|
+
* ConditionEvaluationError — an authoring/generation error, never a
|
|
11
|
+
* "condition not met" result (Top-15 #5: a silent false lets the retry
|
|
12
|
+
* loop exhaust its budget while masking the real problem).
|
|
13
|
+
* - `string` → the V4 vision path, byte-identical to the previous behavior.
|
|
14
|
+
*/
|
|
15
|
+
export declare function checkUntilCondition(page: Page, condition: string | Condition): Promise<boolean>;
|
|
3
16
|
//# sourceMappingURL=wait.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/helpers/wait.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAMvC,wBAAsB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/helpers/wait.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAMvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,OAAO,CAAC,CA0BlB"}
|
package/dist/helpers/wait.js
CHANGED
|
@@ -2,7 +2,32 @@ import { config } from '../config.js';
|
|
|
2
2
|
import { fetchWithAuth } from '../http.js';
|
|
3
3
|
import { log, preview } from '../log.js';
|
|
4
4
|
import { takeScreenshot } from './screenshot.js';
|
|
5
|
+
import { ConditionEvaluationError } from '../errors.js';
|
|
6
|
+
/**
|
|
7
|
+
* Until-loop condition check — TWO forms, selected by argument type (the V3
|
|
8
|
+
* contract's deliberate divergence: a Condition crosses the boundary as a
|
|
9
|
+
* LIVE OBJECT, never a stringified repr the binding evals):
|
|
10
|
+
*
|
|
11
|
+
* - `Condition` instance → LOCAL evaluation against the variable store. No
|
|
12
|
+
* screenshot, no vision endpoint. Unevaluable throws
|
|
13
|
+
* ConditionEvaluationError — an authoring/generation error, never a
|
|
14
|
+
* "condition not met" result (Top-15 #5: a silent false lets the retry
|
|
15
|
+
* loop exhaust its budget while masking the real problem).
|
|
16
|
+
* - `string` → the V4 vision path, byte-identical to the previous behavior.
|
|
17
|
+
*/
|
|
5
18
|
export async function checkUntilCondition(page, condition) {
|
|
19
|
+
if (typeof condition !== 'string') {
|
|
20
|
+
try {
|
|
21
|
+
const [ok] = await condition.evaluate();
|
|
22
|
+
log.helper(`[check_until_condition] local eval -> ${ok}`);
|
|
23
|
+
return ok;
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
if (e?.name === 'ConditionEvaluationError')
|
|
27
|
+
throw e;
|
|
28
|
+
throw new ConditionEvaluationError(JSON.stringify(condition.toDict()), e);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
6
31
|
if (!config.current.smart) {
|
|
7
32
|
log.helper(`[check_until_condition] smart is OFF — returning False (condition skipped)`);
|
|
8
33
|
return false;
|
package/dist/helpers/wait.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/helpers/wait.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/helpers/wait.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAGxD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAU,EACV,SAA6B;IAE7B,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;YACxC,GAAG,CAAC,MAAM,CAAC,yCAAyC,EAAE,EAAE,CAAC,CAAC;YAC1D,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAK,CAAW,EAAE,IAAI,KAAK,0BAA0B;gBAAE,MAAM,CAAC,CAAC;YAC/D,MAAM,IAAI,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1B,GAAG,CAAC,MAAM,CAAC,4EAA4E,CAAC,CAAC;QACzF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,qCAAqC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,0BAA0B,EAAE;QACtF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;KACjE,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA+C,CAAC;IAC/E,GAAG,CAAC,MAAM,CAAC,oDAAoD,IAAI,CAAC,OAAO,gBAAgB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9G,2FAA2F;IAC3F,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;AAC9B,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,17 @@ import { configure } from './configure.js';
|
|
|
2
2
|
import { test } from './test.js';
|
|
3
3
|
import { step } from './step.js';
|
|
4
4
|
import { run } from './session.js';
|
|
5
|
-
import { resolveVar, setVar } from './vars.js';
|
|
6
|
-
import { TestmuConfigError, AssertionFailureError } from './errors.js';
|
|
5
|
+
import { resolveVar, setVar, getVariableValue } from './vars.js';
|
|
6
|
+
import { TestmuConfigError, AssertionFailureError, AutohealExhausted, ConditionEvaluationError } from './errors.js';
|
|
7
|
+
import { routeFailure } from './routeFailure.js';
|
|
8
|
+
import { getCookies } from './helpers/cookies.js';
|
|
9
|
+
import { primeDialog } from './helpers/dialog.js';
|
|
10
|
+
import { locator, VisionLocator } from './visionLocator.js';
|
|
11
|
+
import { resolveRankedLocator } from './rankedLocator.js';
|
|
12
|
+
import { multiClick, longPress } from './helpers/gesture.js';
|
|
13
|
+
import { scrollUntilElement } from './helpers/scrollUntil.js';
|
|
14
|
+
import { newTab, closeTab, ensureActivePage } from './helpers/tabs.js';
|
|
15
|
+
import { dragDrop, elementDrag } from './helpers/drag.js';
|
|
7
16
|
import { executeJs } from './helpers/executeJs.js';
|
|
8
17
|
import { executeApi } from './helpers/executeApi.js';
|
|
9
18
|
import { executeDb } from './helpers/executeDb.js';
|
|
@@ -17,6 +26,8 @@ import { smartuiSnapshot } from './helpers/smartui.js';
|
|
|
17
26
|
import { switchTab } from './helpers/tabs.js';
|
|
18
27
|
import { clickDrag } from './helpers/drag.js';
|
|
19
28
|
import { checkUntilCondition } from './helpers/wait.js';
|
|
29
|
+
import { asText } from './helpers/text.js';
|
|
30
|
+
import { Condition, ResolvedCondition, PossibleCondition, ConcatenationOperator } from './helpers/condition.js';
|
|
20
31
|
import { executeKaneCli } from './helpers/kaneCli.js';
|
|
21
32
|
import { downloadsPath } from './downloadsPath.js';
|
|
22
33
|
import { devtoolsNetworkQuery, devtoolsConsoleQuery, devtoolsCookiesQuery, devtoolsStorageQuery, clipboardWrite, clipboardPaste, clipboardClear, devtoolsClipboardQuery, devtoolsPerformanceQuery } from './helpers/devtools.js';
|
|
@@ -47,6 +58,7 @@ declare const testmu: {
|
|
|
47
58
|
clickDrag: typeof clickDrag;
|
|
48
59
|
checkUntilCondition: typeof checkUntilCondition;
|
|
49
60
|
executeKaneCli: typeof executeKaneCli;
|
|
61
|
+
asText: typeof asText;
|
|
50
62
|
downloadsPath: typeof downloadsPath;
|
|
51
63
|
devtoolsNetworkQuery: typeof devtoolsNetworkQuery;
|
|
52
64
|
devtoolsConsoleQuery: typeof devtoolsConsoleQuery;
|
|
@@ -58,9 +70,23 @@ declare const testmu: {
|
|
|
58
70
|
devtoolsClipboardQuery: typeof devtoolsClipboardQuery;
|
|
59
71
|
devtoolsPerformanceQuery: typeof devtoolsPerformanceQuery;
|
|
60
72
|
apiCallsQuery: typeof apiCallsQuery;
|
|
73
|
+
routeFailure: typeof routeFailure;
|
|
74
|
+
getCookies: typeof getCookies;
|
|
75
|
+
primeDialog: typeof primeDialog;
|
|
76
|
+
locator: typeof locator;
|
|
77
|
+
resolveRankedLocator: typeof resolveRankedLocator;
|
|
78
|
+
multiClick: typeof multiClick;
|
|
79
|
+
longPress: typeof longPress;
|
|
80
|
+
scrollUntilElement: typeof scrollUntilElement;
|
|
81
|
+
newTab: typeof newTab;
|
|
82
|
+
closeTab: typeof closeTab;
|
|
83
|
+
ensureActivePage: typeof ensureActivePage;
|
|
84
|
+
dragDrop: typeof dragDrop;
|
|
85
|
+
elementDrag: typeof elementDrag;
|
|
61
86
|
};
|
|
62
87
|
export default testmu;
|
|
63
|
-
export { resolveVar, setVar, TestmuConfigError, AssertionFailureError };
|
|
88
|
+
export { resolveVar, setVar, TestmuConfigError, AssertionFailureError, AutohealExhausted, ConditionEvaluationError, Condition, ResolvedCondition, PossibleCondition, ConcatenationOperator, getVariableValue, VisionLocator, };
|
|
89
|
+
export type { SelectorSpec, VisionLocatorOptions } from './visionLocator.js';
|
|
64
90
|
export type { ConfigureOptions, GlobalVariable } from './configure.js';
|
|
65
91
|
export type { RunTarget, Config } from './config.js';
|
|
66
92
|
export type { Reporter } from './reporters/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EACL,iBAAiB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,wBAAwB,EACtF,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,oBAAoB,EAC1E,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EACL,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EACvE,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,oBAAoB,EAAE,oBAAoB,EAC1C,oBAAoB,EAAE,oBAAoB,EAC1C,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,sBAAsB,EACtE,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAkC,MAAM,uBAAuB,CAAC;AAEtF,QAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuBX,CAAC;AAEF,eAAe,MAAM,CAAC;AACtB,OAAO,EACL,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,qBAAqB,EAC5D,iBAAiB,EAAE,wBAAwB,EAE3C,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EACtE,gBAAgB,EAAE,aAAa,GAChC,CAAC;AACF,YAAY,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACvE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACtF,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvF,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC5G,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,YAAY,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,17 @@ import { configure } from './configure.js';
|
|
|
2
2
|
import { test } from './test.js';
|
|
3
3
|
import { step } from './step.js';
|
|
4
4
|
import { run } from './session.js';
|
|
5
|
-
import { resolveVar, setVar } from './vars.js';
|
|
6
|
-
import { TestmuConfigError, AssertionFailureError } from './errors.js';
|
|
5
|
+
import { resolveVar, setVar, getVariableValue } from './vars.js';
|
|
6
|
+
import { TestmuConfigError, AssertionFailureError, AutohealExhausted, ConditionEvaluationError, } from './errors.js';
|
|
7
|
+
import { routeFailure } from './routeFailure.js';
|
|
8
|
+
import { getCookies } from './helpers/cookies.js';
|
|
9
|
+
import { primeDialog } from './helpers/dialog.js';
|
|
10
|
+
import { locator, VisionLocator } from './visionLocator.js';
|
|
11
|
+
import { resolveRankedLocator } from './rankedLocator.js';
|
|
12
|
+
import { multiClick, longPress } from './helpers/gesture.js';
|
|
13
|
+
import { scrollUntilElement } from './helpers/scrollUntil.js';
|
|
14
|
+
import { newTab, closeTab, ensureActivePage } from './helpers/tabs.js';
|
|
15
|
+
import { dragDrop, elementDrag } from './helpers/drag.js';
|
|
7
16
|
import { executeJs } from './helpers/executeJs.js';
|
|
8
17
|
import { executeApi } from './helpers/executeApi.js';
|
|
9
18
|
import { executeDb } from './helpers/executeDb.js';
|
|
@@ -17,6 +26,8 @@ import { smartuiSnapshot } from './helpers/smartui.js';
|
|
|
17
26
|
import { switchTab } from './helpers/tabs.js';
|
|
18
27
|
import { clickDrag } from './helpers/drag.js';
|
|
19
28
|
import { checkUntilCondition } from './helpers/wait.js';
|
|
29
|
+
import { asText } from './helpers/text.js';
|
|
30
|
+
import { Condition, ResolvedCondition, PossibleCondition, ConcatenationOperator, } from './helpers/condition.js';
|
|
20
31
|
import { executeKaneCli } from './helpers/kaneCli.js';
|
|
21
32
|
import { downloadsPath } from './downloadsPath.js';
|
|
22
33
|
import { devtoolsNetworkQuery, devtoolsConsoleQuery, devtoolsCookiesQuery, devtoolsStorageQuery, clipboardWrite, clipboardPaste, clipboardClear, devtoolsClipboardQuery, devtoolsPerformanceQuery, } from './helpers/devtools.js';
|
|
@@ -31,16 +42,24 @@ const testmu = {
|
|
|
31
42
|
evaluateNetworkAssertion, networkQuery,
|
|
32
43
|
evaluateMath, smartuiSnapshot,
|
|
33
44
|
switchTab, clickDrag,
|
|
34
|
-
checkUntilCondition, executeKaneCli,
|
|
45
|
+
checkUntilCondition, executeKaneCli, asText,
|
|
35
46
|
downloadsPath,
|
|
36
47
|
devtoolsNetworkQuery, devtoolsConsoleQuery,
|
|
37
48
|
devtoolsCookiesQuery, devtoolsStorageQuery,
|
|
38
49
|
clipboardWrite, clipboardPaste, clipboardClear, devtoolsClipboardQuery,
|
|
39
50
|
devtoolsPerformanceQuery,
|
|
40
51
|
apiCallsQuery,
|
|
52
|
+
// V3 instance view — additive; inert unless configure({kaneVersion:'v3'}).
|
|
53
|
+
routeFailure, getCookies, primeDialog,
|
|
54
|
+
locator, resolveRankedLocator,
|
|
55
|
+
multiClick, longPress, scrollUntilElement,
|
|
56
|
+
newTab, closeTab, ensureActivePage,
|
|
57
|
+
dragDrop, elementDrag,
|
|
41
58
|
};
|
|
42
59
|
export default testmu;
|
|
43
|
-
export { resolveVar, setVar, TestmuConfigError, AssertionFailureError
|
|
60
|
+
export { resolveVar, setVar, TestmuConfigError, AssertionFailureError, AutohealExhausted, ConditionEvaluationError,
|
|
61
|
+
// V3 condition family + resolver — the generator emits these bare.
|
|
62
|
+
Condition, ResolvedCondition, PossibleCondition, ConcatenationOperator, getVariableValue, VisionLocator, };
|
|
44
63
|
export { getApiCallLog, clearApiCallLog } from './helpers/apiCalls.js';
|
|
45
64
|
export { ExecuteJsError } from './helpers/executeJs.js';
|
|
46
65
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/log.d.ts
CHANGED
|
@@ -18,7 +18,10 @@ export declare const log: {
|
|
|
18
18
|
/** Error. */
|
|
19
19
|
error(msg: string): void;
|
|
20
20
|
};
|
|
21
|
-
/** Preview a string capped at maxLen chars (matches Python's `description[:80]`).
|
|
21
|
+
/** Preview a string capped at maxLen chars (matches Python's `description[:80]`).
|
|
22
|
+
* JSON.stringify returns undefined (NOT a string) for undefined/functions/
|
|
23
|
+
* symbols — String() fallback so logging a valueless result never throws
|
|
24
|
+
* (dev-proven: executeJs of an empty/return-less script → setVar(undefined)). */
|
|
22
25
|
export declare function preview(s: unknown, maxLen?: number): string;
|
|
23
26
|
/**
|
|
24
27
|
* Python `repr()`-like quoting for log values. Strings come out single-quoted
|
package/dist/log.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,eAAO,MAAM,GAAG;IACd,gFAAgF;cACtE,MAAM,GAAG,IAAI;IAGvB,uEAAuE;cAC7D,MAAM,GAAG,IAAI;IAGvB,wEAAwE;gBAC5D,MAAM,GAAG,IAAI;IAGzB,eAAe;cACL,MAAM,GAAG,IAAI;IAGvB,aAAa;eACF,MAAM,GAAG,IAAI;CAGzB,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,eAAO,MAAM,GAAG;IACd,gFAAgF;cACtE,MAAM,GAAG,IAAI;IAGvB,uEAAuE;cAC7D,MAAM,GAAG,IAAI;IAGvB,wEAAwE;gBAC5D,MAAM,GAAG,IAAI;IAGzB,eAAe;cACL,MAAM,GAAG,IAAI;IAGvB,aAAa;eACF,MAAM,GAAG,IAAI;CAGzB,CAAC;AAEF;;;iFAGiF;AACjF,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,SAAK,GAAG,MAAM,CAGvD;AAED;;;;GAIG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAKvC"}
|
package/dist/log.js
CHANGED
|
@@ -34,9 +34,12 @@ export const log = {
|
|
|
34
34
|
console.error(`${ts()} ERROR ${msg}`);
|
|
35
35
|
},
|
|
36
36
|
};
|
|
37
|
-
/** Preview a string capped at maxLen chars (matches Python's `description[:80]`).
|
|
37
|
+
/** Preview a string capped at maxLen chars (matches Python's `description[:80]`).
|
|
38
|
+
* JSON.stringify returns undefined (NOT a string) for undefined/functions/
|
|
39
|
+
* symbols — String() fallback so logging a valueless result never throws
|
|
40
|
+
* (dev-proven: executeJs of an empty/return-less script → setVar(undefined)). */
|
|
38
41
|
export function preview(s, maxLen = 80) {
|
|
39
|
-
const str = typeof s === 'string' ? s : JSON.stringify(s);
|
|
42
|
+
const str = typeof s === 'string' ? s : String(JSON.stringify(s) ?? s);
|
|
40
43
|
return str.length <= maxLen ? str : str.slice(0, maxLen) + '...';
|
|
41
44
|
}
|
|
42
45
|
/**
|
|
@@ -47,6 +50,8 @@ export function preview(s, maxLen = 80) {
|
|
|
47
50
|
export function repr(v) {
|
|
48
51
|
if (typeof v === 'string')
|
|
49
52
|
return `'${v.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`;
|
|
50
|
-
|
|
53
|
+
// JSON.stringify yields undefined (not a string) for undefined/functions/
|
|
54
|
+
// symbols — String() fallback so `.slice()` at call sites never throws.
|
|
55
|
+
return String(JSON.stringify(v) ?? v);
|
|
51
56
|
}
|
|
52
57
|
//# sourceMappingURL=log.js.map
|
package/dist/log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,SAAS,EAAE;IACT,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjE,OAAO,CACL,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG;QAClE,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CACrE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,gFAAgF;IAChF,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,uEAAuE;IACvE,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,wEAAwE;IACxE,MAAM,CAAC,GAAW;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,eAAe;IACf,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,aAAa;IACb,KAAK,CAAC,GAAW;QACf,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC,CAAC;IACxC,CAAC;CACF,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../src/log.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,SAAS,EAAE;IACT,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACjE,OAAO,CACL,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG;QAClE,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CACrE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,gFAAgF;IAChF,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,uEAAuE;IACvE,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,wEAAwE;IACxE,MAAM,CAAC,GAAW;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,eAAe;IACf,IAAI,CAAC,GAAW;QACd,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,aAAa;IACb,KAAK,CAAC,GAAW;QACf,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC,CAAC;IACxC,CAAC;CACF,CAAC;AAEF;;;iFAGiF;AACjF,MAAM,UAAU,OAAO,CAAC,CAAU,EAAE,MAAM,GAAG,EAAE;IAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,OAAO,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,CAAU;IAC7B,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;IACvF,0EAA0E;IAC1E,wEAAwE;IACxE,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ranked-selector resolution + wrong-element heal — PY _ranked_locator.py port.
|
|
3
|
+
*
|
|
4
|
+
* Codegen with multiple ranked candidates emits:
|
|
5
|
+
* await testmu.resolveRankedLocator(page, [page.locator('#a'), page.locator('#b')],
|
|
6
|
+
* 'email field')
|
|
7
|
+
*
|
|
8
|
+
* Sequential rank order (Selenium semantics), NOT .or().first (DOM order).
|
|
9
|
+
* V3 (description given): a match is wrapped so a Playwright error on the
|
|
10
|
+
* wrong matched element falls through to description-based vision heal; on
|
|
11
|
+
* exhaustion returns a VisionLocator. V4 (no description): bare locator, or a
|
|
12
|
+
* TimeoutError-named Error on exhaustion.
|
|
13
|
+
*
|
|
14
|
+
* The wrapper is a Proxy, NOT a subclass — playwright's .d.ts declares
|
|
15
|
+
* Locator as an interface, there is nothing to `extends` (contract §6).
|
|
16
|
+
*/
|
|
17
|
+
import type { Locator, Page } from 'playwright';
|
|
18
|
+
import { VisionLocator } from './visionLocator.js';
|
|
19
|
+
/** Wrap a ranked MATCH so a genuine Playwright action error heals via the
|
|
20
|
+
* description (VisionLocator). Non-action members pass through bound. */
|
|
21
|
+
export declare function _makeHealingLocator(page: Page, loc: Locator, description: string): Locator;
|
|
22
|
+
/**
|
|
23
|
+
* Return the first locator whose count() > 0, in rank order.
|
|
24
|
+
* See module docstring for V3 vs V4 exhaustion semantics.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveRankedLocator(page: Page, locators: Locator[], description?: string): Promise<Locator | VisionLocator>;
|
|
27
|
+
//# sourceMappingURL=rankedLocator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rankedLocator.d.ts","sourceRoot":"","sources":["../src/rankedLocator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAW,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAgC5D;yEACyE;AACzE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAiC1F;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,OAAO,EAAE,EACnB,WAAW,SAAK,GACf,OAAO,CAAC,OAAO,GAAG,aAAa,CAAC,CAUlC"}
|