@testmuai/playwright-bindings 0.1.36 → 0.1.37-beta.1
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.
|
@@ -6,12 +6,20 @@
|
|
|
6
6
|
* stable locator → page.evaluate(wrap(code), handles).
|
|
7
7
|
*
|
|
8
8
|
* Returns a HealOutcome on success, or null on any miss (no usable code, a locator
|
|
9
|
-
* that won't resolve, or a null/empty result)
|
|
10
|
-
* (
|
|
9
|
+
* that won't resolve, or a null/empty result). A miss is retried with exponential
|
|
10
|
+
* backoff (see HEAL_MAX_ATTEMPTS); once the attempts are spent the caller FAILS the
|
|
11
|
+
* step (there is no vision fallback for a textual heal).
|
|
11
12
|
*/
|
|
12
13
|
import type { Page } from 'playwright';
|
|
13
14
|
export interface HealOutcome {
|
|
14
15
|
value: string;
|
|
15
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Heal, retrying a miss up to HEAL_MAX_ATTEMPTS times with exponential backoff.
|
|
19
|
+
*
|
|
20
|
+
* Every attempt re-captures the DOM and re-POSTs, so a page that simply had not
|
|
21
|
+
* settled by the caller's visibility gate gets another look; a transient endpoint
|
|
22
|
+
* error gets another try. Returns null once the attempts are spent.
|
|
23
|
+
*/
|
|
16
24
|
export declare function runHeal(page: Page, query: string, expectedValue: string | null, needsUnitConversion: boolean, condition?: string | null, previousCode?: string | null): Promise<HealOutcome | null>;
|
|
17
25
|
//# sourceMappingURL=heal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heal.d.ts","sourceRoot":"","sources":["../../../src/helpers/textualAnalyzer/heal.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"heal.d.ts","sourceRoot":"","sources":["../../../src/helpers/textualAnalyzer/heal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,IAAI,EAAiB,MAAM,YAAY,CAAC;AAiBtD,MAAM,WAAW,WAAW;IAK1B,KAAK,EAAE,MAAM,CAAC;CACf;AAyCD;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,EAAE,mBAAmB,EAAE,OAAO,EACrF,SAAS,GAAE,MAAM,GAAG,IAAW,EAAE,YAAY,GAAE,MAAM,GAAG,IAAW,GAClE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAuB7B"}
|
|
@@ -6,6 +6,11 @@ import { enrichElementLocator } from './locatorEnrichment.js';
|
|
|
6
6
|
import { evaluateWrapped } from './evaluate.js';
|
|
7
7
|
import { parseElReferences, wrapExtractorCode } from './extractor.js';
|
|
8
8
|
const HEAL_TIMEOUT_MS = 60_000;
|
|
9
|
+
// A heal miss is retried: the page may not have settled yet, or the endpoint may have
|
|
10
|
+
// blipped. Exponential backoff between attempts — 1s, then 2s — so a genuinely absent
|
|
11
|
+
// element costs ~3s of waiting rather than a fixed poll.
|
|
12
|
+
const HEAL_MAX_ATTEMPTS = 3;
|
|
13
|
+
const HEAL_BACKOFF_BASE_MS = 1000;
|
|
9
14
|
function healUrl() {
|
|
10
15
|
return config.current.aiApiHost.replace(/\/+$/, '') + '/api/v1/textual_analyzer/heal';
|
|
11
16
|
}
|
|
@@ -41,7 +46,33 @@ async function postHeal(query, domSnapshot, expectedValue, needsUnit, condition
|
|
|
41
46
|
return null;
|
|
42
47
|
}
|
|
43
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Heal, retrying a miss up to HEAL_MAX_ATTEMPTS times with exponential backoff.
|
|
51
|
+
*
|
|
52
|
+
* Every attempt re-captures the DOM and re-POSTs, so a page that simply had not
|
|
53
|
+
* settled by the caller's visibility gate gets another look; a transient endpoint
|
|
54
|
+
* error gets another try. Returns null once the attempts are spent.
|
|
55
|
+
*/
|
|
44
56
|
export async function runHeal(page, query, expectedValue, needsUnitConversion, condition = null, previousCode = null) {
|
|
57
|
+
for (let attempt = 1; attempt <= HEAL_MAX_ATTEMPTS; attempt++) {
|
|
58
|
+
const outcome = await attemptHeal(page, query, expectedValue, needsUnitConversion, condition, previousCode);
|
|
59
|
+
if (outcome != null) {
|
|
60
|
+
if (attempt > 1) {
|
|
61
|
+
log.helper(`[textual_analyzer] heal succeeded on attempt ${attempt}/${HEAL_MAX_ATTEMPTS}`);
|
|
62
|
+
}
|
|
63
|
+
return outcome;
|
|
64
|
+
}
|
|
65
|
+
if (attempt < HEAL_MAX_ATTEMPTS) {
|
|
66
|
+
const delayMs = HEAL_BACKOFF_BASE_MS * 2 ** (attempt - 1);
|
|
67
|
+
log.helper(`[textual_analyzer] heal attempt ${attempt}/${HEAL_MAX_ATTEMPTS} missed -> ` +
|
|
68
|
+
`retry in ${(delayMs / 1000).toFixed(1)}s`);
|
|
69
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
log.helper(`[textual_analyzer] heal missed after ${HEAL_MAX_ATTEMPTS} attempt(s)`);
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
async function attemptHeal(page, query, expectedValue, needsUnitConversion, condition = null, previousCode = null) {
|
|
45
76
|
const structured = await captureStructuredDom(page);
|
|
46
77
|
if (structured == null || !structured.text)
|
|
47
78
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heal.js","sourceRoot":"","sources":["../../../src/helpers/textualAnalyzer/heal.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"heal.js","sourceRoot":"","sources":["../../../src/helpers/textualAnalyzer/heal.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEtE,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,sFAAsF;AACtF,sFAAsF;AACtF,yDAAyD;AACzD,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAUlC,SAAS,OAAO;IACd,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,+BAA+B,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,KAAa,EAAE,WAAmB,EAAE,aAA4B,EAAE,SAAkB,EACpF,YAA2B,IAAI,EAAE,eAA8B,IAAI;IAEnE,MAAM,IAAI,GAAG;QACX,KAAK;QACL,YAAY,EAAE,WAAW;QACzB,cAAc,EAAE,aAAa;QAC7B,qBAAqB,EAAE,SAAS;QAChC,0EAA0E;QAC1E,wEAAwE;QACxE,SAAS,EAAE,SAAS,IAAI,EAAE;QAC1B,yEAAyE;QACzE,iEAAiE;QACjE,aAAa,EAAE,YAAY,IAAI,EAAE;KAClC,CAAC;IACF,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC;SAC7C,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,iEAAiE;YACjE,GAAG,CAAC,MAAM,CAAC,oCAAoC,OAAO,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAA4B,CAAC;IACxD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,wCAAwC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/F,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAU,EAAE,KAAa,EAAE,aAA4B,EAAE,mBAA4B,EACrF,YAA2B,IAAI,EAAE,eAA8B,IAAI;IAEnE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,iBAAiB,EAAE,OAAO,EAAE,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,WAAW,CAC/B,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,SAAS,EAAE,YAAY,CACzE,CAAC;QACF,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;gBAChB,GAAG,CAAC,MAAM,CAAC,gDAAgD,OAAO,IAAI,iBAAiB,EAAE,CAAC,CAAC;YAC7F,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,OAAO,GAAG,iBAAiB,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,oBAAoB,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;YAC1D,GAAG,CAAC,MAAM,CACR,mCAAmC,OAAO,IAAI,iBAAiB,aAAa;gBAC5E,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAC3C,CAAC;YACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,wCAAwC,iBAAiB,aAAa,CAAC,CAAC;IACnF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,IAAU,EAAE,KAAa,EAAE,aAA4B,EAAE,mBAA4B,EACrF,YAA2B,IAAI,EAAE,eAA8B,IAAI;IAEnE,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,UAAU,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAExD,MAAM,IAAI,GAAG,MAAM,QAAQ,CACzB,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,mBAAmB,EAAE,SAAS,EAAE,YAAY,CACpF,CAAC;IACF,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAExC,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,GAAG,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;YAClF,MAAM,GAAG,GAAG,QAAQ,EAAE,OAAO,CAAC;YAC9B,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,CAAC;YAC/D,IAAI,MAAM,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,4CAA4C,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC,CAAC,gCAAgC;IAEhF,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAClC,CAAC"}
|