@testmuai/playwright-bindings 0.1.2-beta.1 → 0.1.2-beta.3
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/README.md +3 -3
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +6 -1
- package/dist/config.js.map +1 -1
- package/dist/configure.d.ts +5 -1
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +1 -0
- package/dist/configure.js.map +1 -1
- package/dist/healPatch.d.ts +9 -2
- package/dist/healPatch.d.ts.map +1 -1
- package/dist/healPatch.js +25 -8
- package/dist/healPatch.js.map +1 -1
- package/dist/helpers/assertion.d.ts.map +1 -1
- package/dist/helpers/assertion.js +18 -12
- package/dist/helpers/assertion.js.map +1 -1
- package/dist/helpers/drag.d.ts.map +1 -1
- package/dist/helpers/drag.js +2 -0
- package/dist/helpers/drag.js.map +1 -1
- package/dist/helpers/executeApi.d.ts +12 -1
- package/dist/helpers/executeApi.d.ts.map +1 -1
- package/dist/helpers/executeApi.js +108 -20
- package/dist/helpers/executeApi.js.map +1 -1
- package/dist/helpers/executeDb.js +1 -1
- package/dist/helpers/executeDb.js.map +1 -1
- package/dist/helpers/kaneCli.d.ts +10 -1
- package/dist/helpers/kaneCli.d.ts.map +1 -1
- package/dist/helpers/kaneCli.js +122 -3
- package/dist/helpers/kaneCli.js.map +1 -1
- package/dist/helpers/math.d.ts +1 -1
- package/dist/helpers/math.d.ts.map +1 -1
- package/dist/helpers/math.js +8 -6
- package/dist/helpers/math.js.map +1 -1
- package/dist/helpers/network.d.ts +4 -4
- package/dist/helpers/network.d.ts.map +1 -1
- package/dist/helpers/network.js +19 -16
- package/dist/helpers/network.js.map +1 -1
- package/dist/helpers/smartui.d.ts +5 -1
- package/dist/helpers/smartui.d.ts.map +1 -1
- package/dist/helpers/smartui.js +45 -7
- package/dist/helpers/smartui.js.map +1 -1
- package/dist/helpers/tabs.d.ts.map +1 -1
- package/dist/helpers/tabs.js +2 -0
- package/dist/helpers/tabs.js.map +1 -1
- package/dist/helpers/vision.d.ts +50 -7
- package/dist/helpers/vision.d.ts.map +1 -1
- package/dist/helpers/vision.js +212 -29
- package/dist/helpers/vision.js.map +1 -1
- package/dist/helpers/wait.d.ts.map +1 -1
- package/dist/helpers/wait.js +1 -2
- package/dist/helpers/wait.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -6
- package/dist/index.js.map +1 -1
- package/dist/loadEnv.d.ts +2 -0
- package/dist/loadEnv.d.ts.map +1 -0
- package/dist/loadEnv.js +12 -0
- package/dist/loadEnv.js.map +1 -0
- package/dist/relayProxy.d.ts +46 -0
- package/dist/relayProxy.d.ts.map +1 -0
- package/dist/relayProxy.js +453 -0
- package/dist/relayProxy.js.map +1 -0
- package/dist/session.d.ts +6 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +130 -16
- package/dist/session.js.map +1 -1
- package/dist/step.d.ts +23 -6
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +23 -27
- package/dist/step.js.map +1 -1
- package/dist/vars.d.ts +9 -20
- package/dist/vars.d.ts.map +1 -1
- package/dist/vars.js +62 -26
- package/dist/vars.js.map +1 -1
- package/package.json +10 -5
package/dist/helpers/kaneCli.js
CHANGED
|
@@ -1,5 +1,124 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { chromium } from 'playwright';
|
|
2
|
+
import { spawn } from 'child_process';
|
|
3
|
+
import { config } from '../config.js';
|
|
4
|
+
import { sessionState } from '../session.js';
|
|
5
|
+
import { _getReporter } from '../step.js';
|
|
6
|
+
import { LTReporter } from '../reporters/lt.js';
|
|
7
|
+
import { TestmuConfigError } from '../errors.js';
|
|
8
|
+
import { log, preview } from '../log.js';
|
|
9
|
+
// Handoff sequence (cloud + smart only) — PY parity: kane_cli.py:22-137.
|
|
10
|
+
// JS uses browser.close() on a connected browser which only detaches the
|
|
11
|
+
// client; the remote browser stays alive via the relay proxy. No need for
|
|
12
|
+
// PY's private `_connection.stop_async()` hack — verified by A1 integration
|
|
13
|
+
// tests I3/I5.
|
|
14
|
+
export async function executeKaneCli(objective, page) {
|
|
15
|
+
if (!config.current.smart) {
|
|
16
|
+
log.helper('[execute_kane_cli] smart is OFF — branch unresolved, skipping');
|
|
17
|
+
return page;
|
|
18
|
+
}
|
|
19
|
+
if (config.current.runTarget !== 'cloud') {
|
|
20
|
+
log.helper('[execute_kane_cli] run_target is not "cloud" — kane-cli needs the relay proxy, skipping (branch unresolved)');
|
|
21
|
+
return page;
|
|
22
|
+
}
|
|
23
|
+
const relayUrl = sessionState.relayUrl;
|
|
24
|
+
if (!relayUrl) {
|
|
25
|
+
throw new TestmuConfigError('execute_kane_cli: relay proxy not initialized; ensure testmu.run() started the cloud session');
|
|
26
|
+
}
|
|
27
|
+
// NB: PY also checks `pw is None` here (kane_cli.py:60-65) because PY needs the
|
|
28
|
+
// async_playwright() handle for chromium.connect later. JS uses the module-level
|
|
29
|
+
// `chromium` import — no handle needed — so the pw gate has no JS analog.
|
|
30
|
+
const currentUrl = page.url();
|
|
31
|
+
const browser = page.context().browser();
|
|
32
|
+
if (!browser) {
|
|
33
|
+
throw new TestmuConfigError('execute_kane_cli: page has no browser (detached?)');
|
|
34
|
+
}
|
|
35
|
+
const username = process.env['LT_USERNAME'] ?? '';
|
|
36
|
+
const accessKey = process.env['LT_ACCESS_KEY'] ?? '';
|
|
37
|
+
const envName = process.env['TESTMUAI_ENV'] ?? 'prod';
|
|
38
|
+
log.helper(`[execute_kane_cli] objective=${preview(objective, 80)}`);
|
|
39
|
+
log.helper('[execute_kane_cli] handing off browser to kane-cli...');
|
|
40
|
+
// Step 1: Disconnect from the remote browser but keep it alive via the relay.
|
|
41
|
+
try {
|
|
42
|
+
await browser.close();
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
log.helper(`[execute_kane_cli] disconnect warning: ${String(e)}`);
|
|
46
|
+
}
|
|
47
|
+
// Step 2: Spawn kane-cli pointing at our relay URL.
|
|
48
|
+
const args = [
|
|
49
|
+
'run', objective,
|
|
50
|
+
'--url', currentUrl,
|
|
51
|
+
'--ws-endpoint', relayUrl,
|
|
52
|
+
'--username', username,
|
|
53
|
+
'--access-key', accessKey,
|
|
54
|
+
'--env', envName,
|
|
55
|
+
'--local',
|
|
56
|
+
'--agent',
|
|
57
|
+
];
|
|
58
|
+
const result = await runKaneCli('kane-cli', args, 600_000);
|
|
59
|
+
if (result.stdout)
|
|
60
|
+
log.helper(`[execute_kane_cli] stdout: ${preview(result.stdout, 2000)}`);
|
|
61
|
+
if (result.stderr)
|
|
62
|
+
log.helper(`[execute_kane_cli] stderr: ${preview(result.stderr, 2000)}`);
|
|
63
|
+
if (result.exitCode !== 0) {
|
|
64
|
+
throw new Error(`kane-cli failed (exit ${result.exitCode}): ${result.stderr}`);
|
|
65
|
+
}
|
|
66
|
+
// Step 3: Reconnect via the relay; proxy replays state.
|
|
67
|
+
log.helper('[execute_kane_cli] reconnecting test to relay...');
|
|
68
|
+
const newBrowser = await chromium.connect(relayUrl, { timeout: 120_000 });
|
|
69
|
+
// Step 4: Resolve a page from the reconnected browser.
|
|
70
|
+
let newPage;
|
|
71
|
+
const ctxs = newBrowser.contexts();
|
|
72
|
+
if (ctxs.length > 0) {
|
|
73
|
+
const ctx = ctxs[0];
|
|
74
|
+
const pages = ctx.pages();
|
|
75
|
+
newPage = pages.length > 0 ? pages[pages.length - 1] : await ctx.newPage();
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const ctx = await newBrowser.newContext();
|
|
79
|
+
newPage = await ctx.newPage();
|
|
80
|
+
}
|
|
81
|
+
log.helper(`[execute_kane_cli] reconnected — page URL: ${newPage.url()}`);
|
|
82
|
+
// Step 5: Re-wire LT reporter's page reference.
|
|
83
|
+
const rep = _getReporter();
|
|
84
|
+
if (rep instanceof LTReporter)
|
|
85
|
+
rep._setPage(newPage);
|
|
86
|
+
return newPage;
|
|
87
|
+
}
|
|
88
|
+
/** Spawn kane-cli as a subprocess and collect its output with a timeout. */
|
|
89
|
+
export async function runKaneCli(cmd, args, timeoutMs) {
|
|
90
|
+
return new Promise((resolve, reject) => {
|
|
91
|
+
const child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
92
|
+
const stdout = [];
|
|
93
|
+
const stderr = [];
|
|
94
|
+
child.stdout?.on('data', (chunk) => stdout.push(chunk));
|
|
95
|
+
child.stderr?.on('data', (chunk) => stderr.push(chunk));
|
|
96
|
+
let settled = false;
|
|
97
|
+
const timer = setTimeout(() => {
|
|
98
|
+
if (settled)
|
|
99
|
+
return;
|
|
100
|
+
settled = true;
|
|
101
|
+
child.kill('SIGKILL');
|
|
102
|
+
reject(new Error(`kane-cli timed out after ${timeoutMs}ms`));
|
|
103
|
+
}, timeoutMs);
|
|
104
|
+
child.on('error', (err) => {
|
|
105
|
+
if (settled)
|
|
106
|
+
return;
|
|
107
|
+
settled = true;
|
|
108
|
+
clearTimeout(timer);
|
|
109
|
+
reject(err);
|
|
110
|
+
});
|
|
111
|
+
child.on('close', (exitCode) => {
|
|
112
|
+
if (settled)
|
|
113
|
+
return;
|
|
114
|
+
settled = true;
|
|
115
|
+
clearTimeout(timer);
|
|
116
|
+
resolve({
|
|
117
|
+
stdout: Buffer.concat(stdout).toString('utf8'),
|
|
118
|
+
stderr: Buffer.concat(stderr).toString('utf8'),
|
|
119
|
+
exitCode: exitCode ?? -1,
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
});
|
|
4
123
|
}
|
|
5
124
|
//# sourceMappingURL=kaneCli.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kaneCli.js","sourceRoot":"","sources":["../../src/helpers/kaneCli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"kaneCli.js","sourceRoot":"","sources":["../../src/helpers/kaneCli.ts"],"names":[],"mappings":"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"}
|
package/dist/helpers/math.d.ts
CHANGED
|
@@ -2,5 +2,5 @@ export interface MathNode {
|
|
|
2
2
|
operator: string;
|
|
3
3
|
operands: Array<MathNode | number | string>;
|
|
4
4
|
}
|
|
5
|
-
export declare function evaluateMath(node: MathNode): number
|
|
5
|
+
export declare function evaluateMath(node: MathNode): Promise<number>;
|
|
6
6
|
//# sourceMappingURL=math.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/helpers/math.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/helpers/math.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;CAC7C;AAcD,wBAAsB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDlE"}
|
package/dist/helpers/math.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveVar } from '../vars.js';
|
|
2
|
+
import { log } from '../log.js';
|
|
2
3
|
// Matches Python's _OPERATORS frozenset
|
|
3
4
|
const OPERATORS = new Set([
|
|
4
5
|
'add', 'subtract', 'multiply', 'divide', 'mod', 'pow', 'negate', 'abs',
|
|
5
6
|
// symbolic aliases
|
|
6
7
|
'+', '-', '*', '/',
|
|
7
8
|
]);
|
|
8
|
-
function toNum(val) {
|
|
9
|
+
async function toNum(val) {
|
|
9
10
|
if (typeof val === 'number')
|
|
10
11
|
return val;
|
|
11
12
|
if (typeof val === 'string') {
|
|
12
13
|
// Resolve {{var}} / ${var} placeholders via the variable store
|
|
13
|
-
const resolved =
|
|
14
|
+
const resolved = await resolveVar(val);
|
|
14
15
|
const n = Number(typeof resolved === 'string' ? resolved.trim() : resolved);
|
|
15
16
|
if (Number.isNaN(n))
|
|
16
17
|
throw new Error(`Non-numeric operand encountered: ${JSON.stringify(val)}`);
|
|
@@ -18,15 +19,16 @@ function toNum(val) {
|
|
|
18
19
|
}
|
|
19
20
|
throw new Error(`Unsupported operand type: ${typeof val}`);
|
|
20
21
|
}
|
|
21
|
-
export function evaluateMath(node) {
|
|
22
|
+
export async function evaluateMath(node) {
|
|
22
23
|
const op = node.operator ?? 'add';
|
|
24
|
+
log.helper(`[math] operator=${op}`);
|
|
23
25
|
if (!OPERATORS.has(op))
|
|
24
26
|
throw new Error(`Unsupported math operator: ${JSON.stringify(op)}`);
|
|
25
|
-
const resolved = node.operands.map((operand) => {
|
|
27
|
+
const resolved = await Promise.all(node.operands.map(async (operand) => {
|
|
26
28
|
if (typeof operand === 'object' && operand !== null)
|
|
27
29
|
return evaluateMath(operand);
|
|
28
30
|
return toNum(operand);
|
|
29
|
-
});
|
|
31
|
+
}));
|
|
30
32
|
// Validate arity — matches Python's checks
|
|
31
33
|
if ((op === 'subtract' || op === '-' || op === 'divide' || op === '/' || op === 'mod') && resolved.length !== 2) {
|
|
32
34
|
throw new Error(`${op} requires exactly 2 operands, got ${resolved.length}`);
|
package/dist/helpers/math.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/helpers/math.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/helpers/math.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
type Operator = 'equals' | 'not_equals' | 'contains' | 'not_contains' | 'greater_than' | 'greater_than_or_equal' | 'less_than' | 'less_than_or_equal' | 'start_with' | 'end_with';
|
|
2
2
|
export interface NetworkLeaf {
|
|
3
3
|
operator: Operator;
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
left_operand: unknown;
|
|
5
|
+
right_operand: unknown;
|
|
6
6
|
}
|
|
7
7
|
export interface NetworkComposite {
|
|
8
8
|
operator: 'and' | 'or';
|
|
9
|
-
|
|
9
|
+
operands: NetworkNode[];
|
|
10
10
|
}
|
|
11
11
|
export type NetworkNode = NetworkLeaf | NetworkComposite;
|
|
12
|
-
export declare function evaluateNetworkAssertion(node: NetworkNode): boolean
|
|
12
|
+
export declare function evaluateNetworkAssertion(node: NetworkNode): Promise<boolean>;
|
|
13
13
|
export interface NetworkQueryOptions {
|
|
14
14
|
method: string;
|
|
15
15
|
url: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/helpers/network.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/helpers/network.ts"],"names":[],"mappings":"AAIA,KAAK,QAAQ,GACT,QAAQ,GAAG,YAAY,GACvB,UAAU,GAAG,cAAc,GAC3B,cAAc,GAAG,uBAAuB,GACxC,WAAW,GAAG,oBAAoB,GAClC,YAAY,GAAG,UAAU,CAAC;AAE9B,MAAM,WAAW,WAAW;IAAG,QAAQ,EAAE,QAAQ,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;CAAE;AACnG,MAAM,WAAW,gBAAgB;IAAG,QAAQ,EAAE,KAAK,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;CAAE;AACtF,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAoCzD,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAKlF;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAwB9E"}
|
package/dist/helpers/network.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveVar } from '../vars.js';
|
|
2
2
|
import { config } from '../config.js';
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import { log } from '../log.js';
|
|
4
|
+
async function resolve(val) {
|
|
5
|
+
return typeof val === 'string' ? resolveVar(val) : val;
|
|
5
6
|
}
|
|
6
|
-
function evaluateLeaf(l) {
|
|
7
|
-
const a = resolve(l.
|
|
8
|
-
const b = resolve(l.
|
|
9
|
-
switch (l.operator) {
|
|
7
|
+
async function evaluateLeaf(l) {
|
|
8
|
+
const a = await resolve(l.left_operand);
|
|
9
|
+
const b = await resolve(l.right_operand);
|
|
10
|
+
switch (l.operator.toLowerCase()) {
|
|
10
11
|
case 'equals': return a == b;
|
|
11
12
|
case 'not_equals': return a != b;
|
|
12
13
|
case 'contains': return String(a).includes(String(b));
|
|
@@ -20,23 +21,25 @@ function evaluateLeaf(l) {
|
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
23
|
function isComposite(n) {
|
|
23
|
-
|
|
24
|
+
const op = n.operator.toLowerCase();
|
|
25
|
+
return op === 'and' || op === 'or';
|
|
24
26
|
}
|
|
25
|
-
|
|
26
|
-
let result;
|
|
27
|
+
async function _evaluateNode(node) {
|
|
27
28
|
if (isComposite(node)) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
: node.children.some(evaluateNetworkAssertion);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
result = evaluateLeaf(node);
|
|
29
|
+
const childResults = await Promise.all(node.operands.map(_evaluateNode));
|
|
30
|
+
return node.operator.toLowerCase() === 'and' ? childResults.every(Boolean) : childResults.some(Boolean);
|
|
34
31
|
}
|
|
32
|
+
return evaluateLeaf(node);
|
|
33
|
+
}
|
|
34
|
+
export async function evaluateNetworkAssertion(node) {
|
|
35
|
+
log.helper(`[network_assertion] op=${node.operator}`);
|
|
36
|
+
const result = await _evaluateNode(node);
|
|
35
37
|
if (!result)
|
|
36
38
|
throw new Error(`Network assertion failed: ${JSON.stringify(node)}`);
|
|
37
39
|
return true;
|
|
38
40
|
}
|
|
39
41
|
export async function networkQuery(opts) {
|
|
42
|
+
log.helper(`[network_query] method=${opts.method} url=${opts.url} index=${opts.index}`);
|
|
40
43
|
if (config.current.runTarget !== 'cloud')
|
|
41
44
|
return null;
|
|
42
45
|
const HAR = 'http://127.0.0.1:8181';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/helpers/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/helpers/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import type { Page } from 'playwright';
|
|
2
|
-
|
|
2
|
+
type SdkSnapshot = (p: Page, n: string, o: Record<string, unknown>) => Promise<void>;
|
|
3
|
+
export declare function _resolveSdkFn(mod: unknown): SdkSnapshot | null;
|
|
4
|
+
export declare function _isModuleNotFound(e: unknown): boolean;
|
|
5
|
+
export declare function smartuiSnapshot(page: Page, name: string, options?: Record<string, unknown>): Promise<void>;
|
|
6
|
+
export {};
|
|
3
7
|
//# sourceMappingURL=smartui.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smartui.d.ts","sourceRoot":"","sources":["../../src/helpers/smartui.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"smartui.d.ts","sourceRoot":"","sources":["../../src/helpers/smartui.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIvC,KAAK,WAAW,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAGrF,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAM9D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAGrD;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
|
package/dist/helpers/smartui.js
CHANGED
|
@@ -1,11 +1,49 @@
|
|
|
1
1
|
import { config } from '../config.js';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { log } from '../log.js';
|
|
3
|
+
// exported for unit testing — pure functions, no module side effects
|
|
4
|
+
export function _resolveSdkFn(mod) {
|
|
5
|
+
// CJS in Node ESM can surface as either top-level named export or .default
|
|
6
|
+
const m = mod;
|
|
7
|
+
if (typeof m?.smartuiSnapshot === 'function')
|
|
8
|
+
return m.smartuiSnapshot;
|
|
9
|
+
if (typeof m?.default?.smartuiSnapshot === 'function')
|
|
10
|
+
return m.default.smartuiSnapshot;
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
export function _isModuleNotFound(e) {
|
|
14
|
+
const code = e?.code;
|
|
15
|
+
return code === 'ERR_MODULE_NOT_FOUND' || code === 'MODULE_NOT_FOUND';
|
|
16
|
+
}
|
|
17
|
+
export async function smartuiSnapshot(page, name, options = {}) {
|
|
18
|
+
log.helper(`[smartui_snapshot] name=${name}`);
|
|
19
|
+
if (config.current.runTarget !== 'cloud') {
|
|
20
|
+
log.helper(`[smartui_snapshot] requires cloud run target — skipping name=${name}`);
|
|
4
21
|
return;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
22
|
+
}
|
|
23
|
+
let mod;
|
|
24
|
+
try {
|
|
25
|
+
// @ts-expect-error — SDK is not a declared dep; installed at HE runtime
|
|
26
|
+
mod = await import('@lambdatest/playwright-driver');
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
if (_isModuleNotFound(e)) {
|
|
30
|
+
log.helper(`[smartui_snapshot] @lambdatest/playwright-driver not installed — install at HE runtime via code-export`);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
log.helper(`[smartui_snapshot] SDK import failed: ${String(e)}`);
|
|
34
|
+
}
|
|
35
|
+
throw e;
|
|
36
|
+
}
|
|
37
|
+
const snapshotFn = _resolveSdkFn(mod);
|
|
38
|
+
if (!snapshotFn) {
|
|
39
|
+
throw new Error('[smartui_snapshot] SDK loaded but smartuiSnapshot export not found');
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
await snapshotFn(page, name, options);
|
|
43
|
+
log.helper(`[smartui_snapshot] captured name=${name}`);
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
log.helper(`[smartui_snapshot] failed: ${String(e)}`);
|
|
47
|
+
}
|
|
10
48
|
}
|
|
11
49
|
//# sourceMappingURL=smartui.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smartui.js","sourceRoot":"","sources":["../../src/helpers/smartui.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"smartui.js","sourceRoot":"","sources":["../../src/helpers/smartui.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAIhC,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,2EAA2E;IAC3E,MAAM,CAAC,GAAG,GAA6E,CAAC;IACxF,IAAI,OAAO,CAAC,EAAE,eAAe,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,eAA8B,CAAC;IACtF,IAAI,OAAO,CAAC,EAAE,OAAO,EAAE,eAAe,KAAK,UAAU;QAAE,OAAO,CAAC,CAAC,OAAO,CAAC,eAA8B,CAAC;IACvG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAU;IAC1C,MAAM,IAAI,GAAI,CAA8B,EAAE,IAAI,CAAC;IACnD,OAAO,IAAI,KAAK,sBAAsB,IAAI,IAAI,KAAK,kBAAkB,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAU,EACV,IAAY,EACZ,UAAmC,EAAE;IAErC,GAAG,CAAC,MAAM,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QACzC,GAAG,CAAC,MAAM,CAAC,gEAAgE,IAAI,EAAE,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IACD,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,wEAAwE;QACxE,GAAG,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,MAAM,CAAC,wGAAwG,CAAC,CAAC;QACvH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,MAAM,CAAC,yCAAyC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,CAAC,CAAC;IACV,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACtC,GAAG,CAAC,MAAM,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,MAAM,CAAC,8BAA8B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/helpers/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/helpers/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvD,wBAAsB,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrF"}
|
package/dist/helpers/tabs.js
CHANGED
package/dist/helpers/tabs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/helpers/tabs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/helpers/tabs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAuB,EAAE,KAAa;IACpE,GAAG,CAAC,MAAM,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;IAC1C,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAC5B,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACxE,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,yBAAyB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACzF,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/helpers/vision.d.ts
CHANGED
|
@@ -3,6 +3,49 @@ export interface VisionCoordinates {
|
|
|
3
3
|
x: number;
|
|
4
4
|
y: number;
|
|
5
5
|
}
|
|
6
|
+
interface FlatDomElement {
|
|
7
|
+
index: number;
|
|
8
|
+
role: string;
|
|
9
|
+
name: string;
|
|
10
|
+
backend_dom_node_id?: number;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
checked?: unknown;
|
|
13
|
+
expanded?: unknown;
|
|
14
|
+
selected?: unknown;
|
|
15
|
+
pressed?: unknown;
|
|
16
|
+
focused?: unknown;
|
|
17
|
+
required?: unknown;
|
|
18
|
+
readonly?: unknown;
|
|
19
|
+
value?: unknown;
|
|
20
|
+
description?: string;
|
|
21
|
+
}
|
|
22
|
+
interface AxNode {
|
|
23
|
+
ignored?: boolean;
|
|
24
|
+
role?: {
|
|
25
|
+
value?: string;
|
|
26
|
+
} | string;
|
|
27
|
+
name?: {
|
|
28
|
+
value?: string;
|
|
29
|
+
} | string;
|
|
30
|
+
backendDOMNodeId?: number;
|
|
31
|
+
properties?: Array<{
|
|
32
|
+
name: string;
|
|
33
|
+
value?: {
|
|
34
|
+
value?: unknown;
|
|
35
|
+
} | unknown;
|
|
36
|
+
}>;
|
|
37
|
+
value?: {
|
|
38
|
+
value?: unknown;
|
|
39
|
+
} | unknown;
|
|
40
|
+
description?: {
|
|
41
|
+
value?: string;
|
|
42
|
+
} | unknown;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Convert CDP Accessibility.getFullAXTree nodes to v16 flat-DOM format.
|
|
46
|
+
* 1-based indexing to match v16-runner's full_flat_dom.py. PY parity.
|
|
47
|
+
*/
|
|
48
|
+
export declare function _buildFlatDom(a11yNodes: AxNode[]): FlatDomElement[];
|
|
6
49
|
/**
|
|
7
50
|
* Get coordinates for a described element via vision API.
|
|
8
51
|
*
|
|
@@ -22,16 +65,15 @@ export declare function getVisionCoordinates(page: Page, description: string, ac
|
|
|
22
65
|
*/
|
|
23
66
|
export declare function visionQuery(page: Page, description: string, returnType?: string): Promise<string | null>;
|
|
24
67
|
/**
|
|
25
|
-
* Extract a value from a DOM element using
|
|
68
|
+
* Extract a value from a DOM element using a 2-step DOM + analyzer API.
|
|
26
69
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* For v0.1, simplified to a single API call with mode='textual_extract'.
|
|
30
|
-
* Full CDP port deferred.
|
|
70
|
+
* Step 1: Build flat accessibility tree, identify target element via LLM.
|
|
71
|
+
* Step 2: Snapshot element via CDP, extract value via LLM.
|
|
31
72
|
*
|
|
32
|
-
* Smart-gated: returns null when smart is OFF.
|
|
73
|
+
* Smart-gated: returns null when smart is OFF. PY parity: vision.py:321.
|
|
74
|
+
* `returnType` kept for signature parity but not sent (PY doesn't send it either).
|
|
33
75
|
*/
|
|
34
|
-
export declare function textualQuery(page: Page, description: string,
|
|
76
|
+
export declare function textualQuery(page: Page, description: string, _returnType?: string): Promise<string | null>;
|
|
35
77
|
/**
|
|
36
78
|
* Poll the vision wait API until the described condition is met.
|
|
37
79
|
*
|
|
@@ -45,4 +87,5 @@ export declare function visionWait(page: Page, description: string, timeoutMs?:
|
|
|
45
87
|
* Smart-gated via getVisionCoordinates: no-ops when smart is OFF or element not found.
|
|
46
88
|
*/
|
|
47
89
|
export declare function visionAction(page: Page, description: string, actionType: string, direction?: string, amount?: number): Promise<void>;
|
|
90
|
+
export {};
|
|
48
91
|
//# sourceMappingURL=vision.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vision.d.ts","sourceRoot":"","sources":["../../src/helpers/vision.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"vision.d.ts","sourceRoot":"","sources":["../../src/helpers/vision.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,YAAY,CAAC;AAKnD,MAAM,WAAW,iBAAiB;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;CAAE;AAgE5D,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,MAAM;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC;IACnC,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,OAAO,CAAA;SAAE,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IAC5E,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;IACtC,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;CAC5C;AAUD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CAsDnE;AAgED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,CAAC,CAAC,EAAE,MAAM,EACV,CAAC,CAAC,EAAE,MAAM,GACT,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA0BnC;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsB9G;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+CxB;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBtG;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,SAAS,SAAS,EAClB,MAAM,SAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAaf"}
|