@testdroid-ai/cli 0.1.2
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/adb/adb-path-resolver.d.ts +6 -0
- package/dist/adb/adb-path-resolver.d.ts.map +1 -0
- package/dist/adb/adb-path-resolver.js +93 -0
- package/dist/adb/adb-path-resolver.js.map +1 -0
- package/dist/adb/adb-shell.d.ts +29 -0
- package/dist/adb/adb-shell.d.ts.map +1 -0
- package/dist/adb/adb-shell.js +128 -0
- package/dist/adb/adb-shell.js.map +1 -0
- package/dist/adb/detector.d.ts +12 -0
- package/dist/adb/detector.d.ts.map +1 -0
- package/dist/adb/detector.js +44 -0
- package/dist/adb/detector.js.map +1 -0
- package/dist/adb/device-tracker.d.ts +23 -0
- package/dist/adb/device-tracker.d.ts.map +1 -0
- package/dist/adb/device-tracker.js +134 -0
- package/dist/adb/device-tracker.js.map +1 -0
- package/dist/adb/emulator-detector.d.ts +11 -0
- package/dist/adb/emulator-detector.d.ts.map +1 -0
- package/dist/adb/emulator-detector.js +54 -0
- package/dist/adb/emulator-detector.js.map +1 -0
- package/dist/appium/health-check.d.ts +6 -0
- package/dist/appium/health-check.d.ts.map +1 -0
- package/dist/appium/health-check.js +61 -0
- package/dist/appium/health-check.js.map +1 -0
- package/dist/appium/session-manager.d.ts +15 -0
- package/dist/appium/session-manager.d.ts.map +1 -0
- package/dist/appium/session-manager.js +82 -0
- package/dist/appium/session-manager.js.map +1 -0
- package/dist/auth/credential-store.d.ts +31 -0
- package/dist/auth/credential-store.d.ts.map +1 -0
- package/dist/auth/credential-store.js +154 -0
- package/dist/auth/credential-store.js.map +1 -0
- package/dist/auth/pairing-auth.d.ts +26 -0
- package/dist/auth/pairing-auth.d.ts.map +1 -0
- package/dist/auth/pairing-auth.js +177 -0
- package/dist/auth/pairing-auth.js.map +1 -0
- package/dist/auth/token-manager.d.ts +20 -0
- package/dist/auth/token-manager.d.ts.map +1 -0
- package/dist/auth/token-manager.js +101 -0
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/commands/connect.d.ts +9 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +270 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/devices.d.ts +2 -0
- package/dist/commands/devices.d.ts.map +1 -0
- package/dist/commands/devices.js +52 -0
- package/dist/commands/devices.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +214 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/mirror.d.ts +2 -0
- package/dist/commands/mirror.d.ts.map +1 -0
- package/dist/commands/mirror.js +77 -0
- package/dist/commands/mirror.js.map +1 -0
- package/dist/commands/prompt.d.ts +12 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +174 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/record.d.ts +7 -0
- package/dist/commands/record.d.ts.map +1 -0
- package/dist/commands/record.js +129 -0
- package/dist/commands/record.js.map +1 -0
- package/dist/commands/run.d.ts +16 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +271 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/setup.d.ts +6 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +50 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +32 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/healing/ai-adapter.d.ts +44 -0
- package/dist/healing/ai-adapter.d.ts.map +1 -0
- package/dist/healing/ai-adapter.js +87 -0
- package/dist/healing/ai-adapter.js.map +1 -0
- package/dist/healing/healer.d.ts +109 -0
- package/dist/healing/healer.d.ts.map +1 -0
- package/dist/healing/healer.js +475 -0
- package/dist/healing/healer.js.map +1 -0
- package/dist/healing/similarity.d.ts +63 -0
- package/dist/healing/similarity.d.ts.map +1 -0
- package/dist/healing/similarity.js +172 -0
- package/dist/healing/similarity.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/recording/capture-strategies/capture-strategy.interface.d.ts +6 -0
- package/dist/recording/capture-strategies/capture-strategy.interface.d.ts.map +1 -0
- package/dist/recording/capture-strategies/capture-strategy.interface.js +3 -0
- package/dist/recording/capture-strategies/capture-strategy.interface.js.map +1 -0
- package/dist/recording/capture-strategies/getevent.strategy.d.ts +27 -0
- package/dist/recording/capture-strategies/getevent.strategy.d.ts.map +1 -0
- package/dist/recording/capture-strategies/getevent.strategy.js +163 -0
- package/dist/recording/capture-strategies/getevent.strategy.js.map +1 -0
- package/dist/recording/capture-strategies/key-capture.strategy.d.ts +16 -0
- package/dist/recording/capture-strategies/key-capture.strategy.d.ts.map +1 -0
- package/dist/recording/capture-strategies/key-capture.strategy.js +67 -0
- package/dist/recording/capture-strategies/key-capture.strategy.js.map +1 -0
- package/dist/recording/capture-strategies/logcat-capture.strategy.d.ts +32 -0
- package/dist/recording/capture-strategies/logcat-capture.strategy.d.ts.map +1 -0
- package/dist/recording/capture-strategies/logcat-capture.strategy.js +176 -0
- package/dist/recording/capture-strategies/logcat-capture.strategy.js.map +1 -0
- package/dist/recording/confidence-scorer.d.ts +13 -0
- package/dist/recording/confidence-scorer.d.ts.map +1 -0
- package/dist/recording/confidence-scorer.js +34 -0
- package/dist/recording/confidence-scorer.js.map +1 -0
- package/dist/recording/event-capture.d.ts +40 -0
- package/dist/recording/event-capture.d.ts.map +1 -0
- package/dist/recording/event-capture.js +168 -0
- package/dist/recording/event-capture.js.map +1 -0
- package/dist/recording/recorder.d.ts +32 -0
- package/dist/recording/recorder.d.ts.map +1 -0
- package/dist/recording/recorder.js +107 -0
- package/dist/recording/recorder.js.map +1 -0
- package/dist/runner/adb-executor.d.ts +116 -0
- package/dist/runner/adb-executor.d.ts.map +1 -0
- package/dist/runner/adb-executor.js +323 -0
- package/dist/runner/adb-executor.js.map +1 -0
- package/dist/runner/appium-executor.d.ts +35 -0
- package/dist/runner/appium-executor.d.ts.map +1 -0
- package/dist/runner/appium-executor.js +191 -0
- package/dist/runner/appium-executor.js.map +1 -0
- package/dist/runner/parse-strategies/appium-default.strategy.d.ts +12 -0
- package/dist/runner/parse-strategies/appium-default.strategy.d.ts.map +1 -0
- package/dist/runner/parse-strategies/appium-default.strategy.js +342 -0
- package/dist/runner/parse-strategies/appium-default.strategy.js.map +1 -0
- package/dist/runner/parse-strategies/index.d.ts +7 -0
- package/dist/runner/parse-strategies/index.d.ts.map +1 -0
- package/dist/runner/parse-strategies/index.js +14 -0
- package/dist/runner/parse-strategies/index.js.map +1 -0
- package/dist/runner/parse-strategies/java.strategy.d.ts +8 -0
- package/dist/runner/parse-strategies/java.strategy.d.ts.map +1 -0
- package/dist/runner/parse-strategies/java.strategy.js +170 -0
- package/dist/runner/parse-strategies/java.strategy.js.map +1 -0
- package/dist/runner/parse-strategies/maestro.strategy.d.ts +8 -0
- package/dist/runner/parse-strategies/maestro.strategy.d.ts.map +1 -0
- package/dist/runner/parse-strategies/maestro.strategy.js +105 -0
- package/dist/runner/parse-strategies/maestro.strategy.js.map +1 -0
- package/dist/runner/parse-strategies/python.strategy.d.ts +8 -0
- package/dist/runner/parse-strategies/python.strategy.d.ts.map +1 -0
- package/dist/runner/parse-strategies/python.strategy.js +140 -0
- package/dist/runner/parse-strategies/python.strategy.js.map +1 -0
- package/dist/runner/parse-strategies/robot.strategy.d.ts +8 -0
- package/dist/runner/parse-strategies/robot.strategy.d.ts.map +1 -0
- package/dist/runner/parse-strategies/robot.strategy.js +81 -0
- package/dist/runner/parse-strategies/robot.strategy.js.map +1 -0
- package/dist/runner/parse-strategies/types.d.ts +17 -0
- package/dist/runner/parse-strategies/types.d.ts.map +1 -0
- package/dist/runner/parse-strategies/types.js +3 -0
- package/dist/runner/parse-strategies/types.js.map +1 -0
- package/dist/runner/parse-strategies/utils.d.ts +39 -0
- package/dist/runner/parse-strategies/utils.d.ts.map +1 -0
- package/dist/runner/parse-strategies/utils.js +217 -0
- package/dist/runner/parse-strategies/utils.js.map +1 -0
- package/dist/runner/script-parser.d.ts +43 -0
- package/dist/runner/script-parser.d.ts.map +1 -0
- package/dist/runner/script-parser.js +68 -0
- package/dist/runner/script-parser.js.map +1 -0
- package/dist/runner/selector-resolver.d.ts +87 -0
- package/dist/runner/selector-resolver.d.ts.map +1 -0
- package/dist/runner/selector-resolver.js +206 -0
- package/dist/runner/selector-resolver.js.map +1 -0
- package/dist/runner/step-executor.d.ts +112 -0
- package/dist/runner/step-executor.d.ts.map +1 -0
- package/dist/runner/step-executor.js +518 -0
- package/dist/runner/step-executor.js.map +1 -0
- package/dist/runner/test-runner.d.ts +89 -0
- package/dist/runner/test-runner.d.ts.map +1 -0
- package/dist/runner/test-runner.js +320 -0
- package/dist/runner/test-runner.js.map +1 -0
- package/dist/scrcpy/launcher.d.ts +16 -0
- package/dist/scrcpy/launcher.d.ts.map +1 -0
- package/dist/scrcpy/launcher.js +87 -0
- package/dist/scrcpy/launcher.js.map +1 -0
- package/dist/services/device-poller.d.ts +10 -0
- package/dist/services/device-poller.d.ts.map +1 -0
- package/dist/services/device-poller.js +44 -0
- package/dist/services/device-poller.js.map +1 -0
- package/dist/services/execution-manager.d.ts +18 -0
- package/dist/services/execution-manager.d.ts.map +1 -0
- package/dist/services/execution-manager.js +185 -0
- package/dist/services/execution-manager.js.map +1 -0
- package/dist/services/recording-manager.d.ts +13 -0
- package/dist/services/recording-manager.d.ts.map +1 -0
- package/dist/services/recording-manager.js +234 -0
- package/dist/services/recording-manager.js.map +1 -0
- package/dist/setup/adb-installer.d.ts +8 -0
- package/dist/setup/adb-installer.d.ts.map +1 -0
- package/dist/setup/adb-installer.js +115 -0
- package/dist/setup/adb-installer.js.map +1 -0
- package/dist/setup/appium-installer.d.ts +8 -0
- package/dist/setup/appium-installer.d.ts.map +1 -0
- package/dist/setup/appium-installer.js +113 -0
- package/dist/setup/appium-installer.js.map +1 -0
- package/dist/setup/base-installer.d.ts +33 -0
- package/dist/setup/base-installer.d.ts.map +1 -0
- package/dist/setup/base-installer.js +170 -0
- package/dist/setup/base-installer.js.map +1 -0
- package/dist/setup/build-tools-installer.d.ts +8 -0
- package/dist/setup/build-tools-installer.d.ts.map +1 -0
- package/dist/setup/build-tools-installer.js +109 -0
- package/dist/setup/build-tools-installer.js.map +1 -0
- package/dist/setup/java-installer.d.ts +8 -0
- package/dist/setup/java-installer.d.ts.map +1 -0
- package/dist/setup/java-installer.js +132 -0
- package/dist/setup/java-installer.js.map +1 -0
- package/dist/setup/paths.d.ts +12 -0
- package/dist/setup/paths.d.ts.map +1 -0
- package/dist/setup/paths.js +90 -0
- package/dist/setup/paths.js.map +1 -0
- package/dist/setup/scrcpy-installer.d.ts +8 -0
- package/dist/setup/scrcpy-installer.d.ts.map +1 -0
- package/dist/setup/scrcpy-installer.js +143 -0
- package/dist/setup/scrcpy-installer.js.map +1 -0
- package/dist/setup/setup-manager.d.ts +18 -0
- package/dist/setup/setup-manager.d.ts.map +1 -0
- package/dist/setup/setup-manager.js +113 -0
- package/dist/setup/setup-manager.js.map +1 -0
- package/dist/ws/socket.d.ts +38 -0
- package/dist/ws/socket.d.ts.map +1 -0
- package/dist/ws/socket.js +91 -0
- package/dist/ws/socket.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remove aspas e prefixos de seletor para extrair o valor util.
|
|
3
|
+
* Ex: "'~com.app:id/btn'" -> "com.app:id/btn"
|
|
4
|
+
* "'//*[@text=\"Login\"]'" -> '//*[@text="Login"]'
|
|
5
|
+
*/
|
|
6
|
+
export declare function cleanSelector(raw: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Encontra a proxima linha contendo um texto especifico.
|
|
9
|
+
*/
|
|
10
|
+
export declare function findLineContaining(lines: string[], currentIndex: number, text: string): string | null;
|
|
11
|
+
/**
|
|
12
|
+
* Coleta N linhas a partir do indice atual como um bloco de texto.
|
|
13
|
+
*/
|
|
14
|
+
export declare function collectBlock(lines: string[], startIndex: number, count: number): string;
|
|
15
|
+
/**
|
|
16
|
+
* Determina se uma linha deve ser ignorada (nao e uma acao).
|
|
17
|
+
*/
|
|
18
|
+
export declare function shouldSkipLine(line: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Extract the full XPath argument from an AppiumBy.xpath(...) call.
|
|
21
|
+
* Handles concat() expressions that contain internal double-quotes.
|
|
22
|
+
* Returns the content between the outermost quotes, supporting nested parens.
|
|
23
|
+
* e.g. AppiumBy.xpath("//*[@text=concat(\"Don\", \"'\", \"t\")]")
|
|
24
|
+
* -> //*[@text=concat("Don", "'", "t")]
|
|
25
|
+
*/
|
|
26
|
+
export declare function extractXpathArg(fragment: string): string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Extract text from an XPath expression, handling both @text='...' and concat().
|
|
29
|
+
* For @text='Some text' -> returns "Some text"
|
|
30
|
+
* For @text=concat("Don", "'", "t") -> returns "Don't"
|
|
31
|
+
* Returns null if no text could be extracted.
|
|
32
|
+
*/
|
|
33
|
+
export declare function extractTextFromXpath(xpath: string): string | null;
|
|
34
|
+
/**
|
|
35
|
+
* Resolve const string variables to their values.
|
|
36
|
+
* e.g. const sel = 'android=...'; await $(sel).click() -> await $('android=...').click()
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveVariables(code: string): string;
|
|
39
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/runner/parse-strategies/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUjD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAOf;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EAAE,EACf,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,MAAM,CAGR;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA2CpD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA6B/D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoBjE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAqBrD"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cleanSelector = cleanSelector;
|
|
4
|
+
exports.findLineContaining = findLineContaining;
|
|
5
|
+
exports.collectBlock = collectBlock;
|
|
6
|
+
exports.shouldSkipLine = shouldSkipLine;
|
|
7
|
+
exports.extractXpathArg = extractXpathArg;
|
|
8
|
+
exports.extractTextFromXpath = extractTextFromXpath;
|
|
9
|
+
exports.resolveVariables = resolveVariables;
|
|
10
|
+
/**
|
|
11
|
+
* Remove aspas e prefixos de seletor para extrair o valor util.
|
|
12
|
+
* Ex: "'~com.app:id/btn'" -> "com.app:id/btn"
|
|
13
|
+
* "'//*[@text=\"Login\"]'" -> '//*[@text="Login"]'
|
|
14
|
+
*/
|
|
15
|
+
function cleanSelector(raw) {
|
|
16
|
+
let s = raw.trim();
|
|
17
|
+
// Remover aspas externas
|
|
18
|
+
if ((s.startsWith("'") && s.endsWith("'")) ||
|
|
19
|
+
(s.startsWith('"') && s.endsWith('"'))) {
|
|
20
|
+
s = s.slice(1, -1);
|
|
21
|
+
}
|
|
22
|
+
return s;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Encontra a proxima linha contendo um texto especifico.
|
|
26
|
+
*/
|
|
27
|
+
function findLineContaining(lines, currentIndex, text) {
|
|
28
|
+
for (let i = currentIndex + 1; i < lines.length && i < currentIndex + 10; i++) {
|
|
29
|
+
if (lines[i].includes(text)) {
|
|
30
|
+
return lines[i].trim();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Coleta N linhas a partir do indice atual como um bloco de texto.
|
|
37
|
+
*/
|
|
38
|
+
function collectBlock(lines, startIndex, count) {
|
|
39
|
+
const end = Math.min(startIndex + count, lines.length);
|
|
40
|
+
return lines.slice(startIndex, end).join('\n');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Determina se uma linha deve ser ignorada (nao e uma acao).
|
|
44
|
+
*/
|
|
45
|
+
function shouldSkipLine(line) {
|
|
46
|
+
if (!line)
|
|
47
|
+
return true;
|
|
48
|
+
if (line.startsWith('//'))
|
|
49
|
+
return true;
|
|
50
|
+
if (line.startsWith('import '))
|
|
51
|
+
return true;
|
|
52
|
+
if (line.startsWith('const {'))
|
|
53
|
+
return true;
|
|
54
|
+
if (line.startsWith('const capabilities'))
|
|
55
|
+
return true;
|
|
56
|
+
if (line.startsWith('const wdOpts'))
|
|
57
|
+
return true;
|
|
58
|
+
if (line.startsWith('describe('))
|
|
59
|
+
return true;
|
|
60
|
+
if (line.startsWith('test.describe('))
|
|
61
|
+
return true;
|
|
62
|
+
if (line.startsWith('it('))
|
|
63
|
+
return true;
|
|
64
|
+
if (line.startsWith('test('))
|
|
65
|
+
return true;
|
|
66
|
+
if (line.startsWith('beforeAll('))
|
|
67
|
+
return true;
|
|
68
|
+
if (line.startsWith('test.beforeAll('))
|
|
69
|
+
return true;
|
|
70
|
+
if (line.startsWith('afterAll('))
|
|
71
|
+
return true;
|
|
72
|
+
if (line.startsWith('test.afterAll('))
|
|
73
|
+
return true;
|
|
74
|
+
if (line.startsWith('let '))
|
|
75
|
+
return true;
|
|
76
|
+
if (line.startsWith('driver = '))
|
|
77
|
+
return true;
|
|
78
|
+
if (line.startsWith('});'))
|
|
79
|
+
return true;
|
|
80
|
+
if (line === '});')
|
|
81
|
+
return true;
|
|
82
|
+
if (line === '{')
|
|
83
|
+
return true;
|
|
84
|
+
if (line === '}')
|
|
85
|
+
return true;
|
|
86
|
+
if (line === ']);')
|
|
87
|
+
return true;
|
|
88
|
+
if (line.startsWith('platformName'))
|
|
89
|
+
return true;
|
|
90
|
+
if (line.startsWith("'appium:"))
|
|
91
|
+
return true;
|
|
92
|
+
if (line.startsWith('hostname:'))
|
|
93
|
+
return true;
|
|
94
|
+
if (line.startsWith('port:'))
|
|
95
|
+
return true;
|
|
96
|
+
if (line.startsWith('logLevel:'))
|
|
97
|
+
return true;
|
|
98
|
+
if (line.startsWith('capabilities'))
|
|
99
|
+
return true;
|
|
100
|
+
if (line.startsWith('if (driver)'))
|
|
101
|
+
return true;
|
|
102
|
+
if (line.startsWith('if (browser)'))
|
|
103
|
+
return true;
|
|
104
|
+
if (line.startsWith('await driver.deleteSession()'))
|
|
105
|
+
return true;
|
|
106
|
+
if (line.startsWith('console.log('))
|
|
107
|
+
return true;
|
|
108
|
+
if (line.startsWith('expect('))
|
|
109
|
+
return true;
|
|
110
|
+
if (line.startsWith('const [androidDevice]'))
|
|
111
|
+
return true;
|
|
112
|
+
if (line.startsWith('device = '))
|
|
113
|
+
return true;
|
|
114
|
+
if (line.startsWith('await device.close()'))
|
|
115
|
+
return true;
|
|
116
|
+
if (line.startsWith('await device.shell('))
|
|
117
|
+
return true;
|
|
118
|
+
if (line.startsWith("'appium:noReset'"))
|
|
119
|
+
return true;
|
|
120
|
+
if (line.startsWith('driver = await remote'))
|
|
121
|
+
return true;
|
|
122
|
+
if (line.startsWith('@Test'))
|
|
123
|
+
return true;
|
|
124
|
+
if (line.startsWith('@DisplayName'))
|
|
125
|
+
return true;
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Extract the full XPath argument from an AppiumBy.xpath(...) call.
|
|
130
|
+
* Handles concat() expressions that contain internal double-quotes.
|
|
131
|
+
* Returns the content between the outermost quotes, supporting nested parens.
|
|
132
|
+
* e.g. AppiumBy.xpath("//*[@text=concat(\"Don\", \"'\", \"t\")]")
|
|
133
|
+
* -> //*[@text=concat("Don", "'", "t")]
|
|
134
|
+
*/
|
|
135
|
+
function extractXpathArg(fragment) {
|
|
136
|
+
const idx = fragment.indexOf('AppiumBy.xpath(');
|
|
137
|
+
if (idx === -1)
|
|
138
|
+
return null;
|
|
139
|
+
// Start after 'AppiumBy.xpath('
|
|
140
|
+
const start = idx + 'AppiumBy.xpath('.length;
|
|
141
|
+
// Find the quote char that opens the string argument
|
|
142
|
+
const quoteChar = fragment[start];
|
|
143
|
+
if (quoteChar !== '"' && quoteChar !== "'")
|
|
144
|
+
return null;
|
|
145
|
+
// Walk forward counting parens to find the matching close
|
|
146
|
+
let depth = 0;
|
|
147
|
+
let i = start + 1;
|
|
148
|
+
for (; i < fragment.length; i++) {
|
|
149
|
+
const ch = fragment[i];
|
|
150
|
+
if (ch === '(')
|
|
151
|
+
depth++;
|
|
152
|
+
else if (ch === ')') {
|
|
153
|
+
if (depth === 0) {
|
|
154
|
+
// We found the closing paren of xpath(...) — the quote should be just before
|
|
155
|
+
// Actually we need the closing quote before this paren
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
depth--;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// The xpath arg is from start+1 to the last quote before the closing paren
|
|
162
|
+
// Find the last occurrence of quoteChar before position i
|
|
163
|
+
let end = i - 1;
|
|
164
|
+
while (end > start && fragment[end] !== quoteChar)
|
|
165
|
+
end--;
|
|
166
|
+
if (end <= start)
|
|
167
|
+
return null;
|
|
168
|
+
return fragment.slice(start + 1, end);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Extract text from an XPath expression, handling both @text='...' and concat().
|
|
172
|
+
* For @text='Some text' -> returns "Some text"
|
|
173
|
+
* For @text=concat("Don", "'", "t") -> returns "Don't"
|
|
174
|
+
* Returns null if no text could be extracted.
|
|
175
|
+
*/
|
|
176
|
+
function extractTextFromXpath(xpath) {
|
|
177
|
+
// Try standard @text='...' first
|
|
178
|
+
const simpleMatch = xpath.match(/@text='([^']+)'/);
|
|
179
|
+
if (simpleMatch)
|
|
180
|
+
return simpleMatch[1];
|
|
181
|
+
// Try concat() pattern: @text=concat("part1", "'", "part2", ...)
|
|
182
|
+
const concatMatch = xpath.match(/@text=concat\((.+)\)/);
|
|
183
|
+
if (concatMatch) {
|
|
184
|
+
const inner = concatMatch[1];
|
|
185
|
+
// Extract all quoted string parts and join them
|
|
186
|
+
const parts = [];
|
|
187
|
+
const partRegex = /["']([^"']*)["']/g;
|
|
188
|
+
let m;
|
|
189
|
+
while ((m = partRegex.exec(inner)) !== null) {
|
|
190
|
+
parts.push(m[1]);
|
|
191
|
+
}
|
|
192
|
+
if (parts.length > 0)
|
|
193
|
+
return parts.join('');
|
|
194
|
+
}
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Resolve const string variables to their values.
|
|
199
|
+
* e.g. const sel = 'android=...'; await $(sel).click() -> await $('android=...').click()
|
|
200
|
+
*/
|
|
201
|
+
function resolveVariables(code) {
|
|
202
|
+
const vars = new Map();
|
|
203
|
+
// Find all const string declarations
|
|
204
|
+
const constRegex = /const\s+(\w+)\s*=\s*(['"`])(.*?)\2\s*;/g;
|
|
205
|
+
let match;
|
|
206
|
+
while ((match = constRegex.exec(code)) !== null) {
|
|
207
|
+
vars.set(match[1], match[3]);
|
|
208
|
+
}
|
|
209
|
+
// Replace variable references in $() calls
|
|
210
|
+
let result = code;
|
|
211
|
+
for (const [name, value] of vars) {
|
|
212
|
+
// Replace $(varName) with $('value')
|
|
213
|
+
result = result.replace(new RegExp(`\\$\\(${name}\\)`, 'g'), `$('${value}')`);
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/runner/parse-strategies/utils.ts"],"names":[],"mappings":";;AAKA,sCAUC;AAKD,gDAWC;AAKD,oCAOC;AAKD,wCA2CC;AASD,0CA6BC;AAQD,oDAoBC;AAMD,4CAqBC;AAxLD;;;;GAIG;AACH,SAAgB,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACnB,yBAAyB;IACzB,IACE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EACtC,CAAC;QACD,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAChC,KAAe,EACf,YAAoB,EACpB,IAAY;IAEZ,KAAK,IAAI,CAAC,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,YAAY,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9E,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAC1B,KAAe,EACf,UAAkB,EAClB,KAAa;IAEb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC9B,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,8BAA8B,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC;QAAE,OAAO,IAAI,CAAC;IACzD,IAAI,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IAEjD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,QAAgB;IAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChD,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,gCAAgC;IAChC,MAAM,KAAK,GAAG,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC;IAC7C,qDAAqD;IACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACxD,0DAA0D;IAC1D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;aACnB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,6EAA6E;gBAC7E,uDAAuD;gBACvD,MAAM;YACR,CAAC;YACD,KAAK,EAAE,CAAC;QACV,CAAC;IACH,CAAC;IACD,2EAA2E;IAC3E,0DAA0D;IAC1D,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,GAAG,GAAG,KAAK,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS;QAAE,GAAG,EAAE,CAAC;IACzD,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IAC9B,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,KAAa;IAChD,iCAAiC;IACjC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACnD,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IAEvC,iEAAiE;IACjE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACxD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC7B,gDAAgD;QAChD,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,mBAAmB,CAAC;QACtC,IAAI,CAAC,CAAC;QACN,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvC,qCAAqC;IACrC,MAAM,UAAU,GAAG,yCAAyC,CAAC;IAC7D,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,2CAA2C;IAC3C,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QACjC,qCAAqC;QACrC,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,IAAI,MAAM,CAAC,SAAS,IAAI,KAAK,EAAE,GAAG,CAAC,EACnC,MAAM,KAAK,IAAI,CAChB,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tipo de acao de teste reconhecida pelo parser.
|
|
3
|
+
*/
|
|
4
|
+
export type TestAction = 'tap' | 'swipe' | 'type_text' | 'press_key' | 'press_back' | 'press_home' | 'launch_app' | 'wait' | 'assert_element' | 'assert_text' | 'long_press' | 'pinch' | 'zoom' | 'rotate';
|
|
5
|
+
/**
|
|
6
|
+
* Passo individual de teste extraido do codigo gerado.
|
|
7
|
+
*/
|
|
8
|
+
export interface TestStep {
|
|
9
|
+
action: TestAction;
|
|
10
|
+
params: Record<string, any>;
|
|
11
|
+
line: number;
|
|
12
|
+
raw: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Parser que converte codigo Appium/Playwright gerado em passos executaveis.
|
|
16
|
+
*
|
|
17
|
+
* Reconhece os padroes gerados pelos templates:
|
|
18
|
+
* - appium-ts.template.ts
|
|
19
|
+
* - appium-js.template.ts
|
|
20
|
+
* - playwright.template.ts
|
|
21
|
+
* - Maestro YAML
|
|
22
|
+
* - Java Appium
|
|
23
|
+
* - Robot Framework
|
|
24
|
+
* - Python Appium
|
|
25
|
+
*/
|
|
26
|
+
export declare class ScriptParser {
|
|
27
|
+
private strategies;
|
|
28
|
+
private context;
|
|
29
|
+
constructor(screenSize?: {
|
|
30
|
+
width: number;
|
|
31
|
+
height: number;
|
|
32
|
+
});
|
|
33
|
+
/**
|
|
34
|
+
* Analisa o codigo de teste e extrai os passos executaveis.
|
|
35
|
+
* Detecta automaticamente o formato e delega para a estrategia correta.
|
|
36
|
+
*/
|
|
37
|
+
parse(code: string): TestStep[];
|
|
38
|
+
/**
|
|
39
|
+
* Calcula coordenadas de swipe relativas ao ecra do device.
|
|
40
|
+
*/
|
|
41
|
+
private calcSwipeCoords;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=script-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-parser.d.ts","sourceRoot":"","sources":["../../src/runner/script-parser.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,OAAO,GACP,WAAW,GACX,WAAW,GACX,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,MAAM,GACN,gBAAgB,GAChB,aAAa,GACb,YAAY,GACZ,OAAO,GACP,MAAM,GACN,QAAQ,CAAC;AAEb;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,OAAO,CAAe;gBAElB,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAmB1D;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE;IAS/B;;OAEG;IACH,OAAO,CAAC,eAAe;CAgBxB"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScriptParser = void 0;
|
|
4
|
+
const parse_strategies_1 = require("./parse-strategies");
|
|
5
|
+
/**
|
|
6
|
+
* Parser que converte codigo Appium/Playwright gerado em passos executaveis.
|
|
7
|
+
*
|
|
8
|
+
* Reconhece os padroes gerados pelos templates:
|
|
9
|
+
* - appium-ts.template.ts
|
|
10
|
+
* - appium-js.template.ts
|
|
11
|
+
* - playwright.template.ts
|
|
12
|
+
* - Maestro YAML
|
|
13
|
+
* - Java Appium
|
|
14
|
+
* - Robot Framework
|
|
15
|
+
* - Python Appium
|
|
16
|
+
*/
|
|
17
|
+
class ScriptParser {
|
|
18
|
+
strategies;
|
|
19
|
+
context;
|
|
20
|
+
constructor(screenSize) {
|
|
21
|
+
const w = screenSize?.width || 1080;
|
|
22
|
+
const h = screenSize?.height || 1920;
|
|
23
|
+
this.context = {
|
|
24
|
+
screenWidth: w,
|
|
25
|
+
screenHeight: h,
|
|
26
|
+
getSwipeCoords: (direction) => this.calcSwipeCoords(direction, w, h),
|
|
27
|
+
};
|
|
28
|
+
this.strategies = [
|
|
29
|
+
new parse_strategies_1.MaestroStrategy(),
|
|
30
|
+
new parse_strategies_1.JavaStrategy(),
|
|
31
|
+
new parse_strategies_1.RobotStrategy(),
|
|
32
|
+
new parse_strategies_1.PythonStrategy(),
|
|
33
|
+
new parse_strategies_1.AppiumDefaultStrategy(), // fallback — always matches
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Analisa o codigo de teste e extrai os passos executaveis.
|
|
38
|
+
* Detecta automaticamente o formato e delega para a estrategia correta.
|
|
39
|
+
*/
|
|
40
|
+
parse(code) {
|
|
41
|
+
for (const strategy of this.strategies) {
|
|
42
|
+
if (strategy.detect(code)) {
|
|
43
|
+
return strategy.parse(code, this.context);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Calcula coordenadas de swipe relativas ao ecra do device.
|
|
50
|
+
*/
|
|
51
|
+
calcSwipeCoords(direction, w, h) {
|
|
52
|
+
const cx = Math.round(w / 2);
|
|
53
|
+
const top = Math.round(h * 0.25);
|
|
54
|
+
const bottom = Math.round(h * 0.75);
|
|
55
|
+
const left = Math.round(w * 0.1);
|
|
56
|
+
const right = Math.round(w * 0.9);
|
|
57
|
+
const cy = Math.round(h / 2);
|
|
58
|
+
switch (direction) {
|
|
59
|
+
case 'UP': return { x1: cx, y1: bottom, x2: cx, y2: top };
|
|
60
|
+
case 'DOWN': return { x1: cx, y1: top, x2: cx, y2: bottom };
|
|
61
|
+
case 'LEFT': return { x1: right, y1: cy, x2: left, y2: cy };
|
|
62
|
+
case 'RIGHT': return { x1: left, y1: cy, x2: right, y2: cy };
|
|
63
|
+
default: return { x1: cx, y1: bottom, x2: cx, y2: top };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.ScriptParser = ScriptParser;
|
|
68
|
+
//# sourceMappingURL=script-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-parser.js","sourceRoot":"","sources":["../../src/runner/script-parser.ts"],"names":[],"mappings":";;;AACA,yDAAyH;AA+BzH;;;;;;;;;;;GAWG;AACH,MAAa,YAAY;IACf,UAAU,CAAkB;IAC5B,OAAO,CAAe;IAE9B,YAAY,UAA8C;QACxD,MAAM,CAAC,GAAG,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC;QACpC,MAAM,CAAC,GAAG,UAAU,EAAE,MAAM,IAAI,IAAI,CAAC;QAErC,IAAI,CAAC,OAAO,GAAG;YACb,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,cAAc,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;SACrE,CAAC;QAEF,IAAI,CAAC,UAAU,GAAG;YAChB,IAAI,kCAAe,EAAE;YACrB,IAAI,+BAAY,EAAE;YAClB,IAAI,gCAAa,EAAE;YACnB,IAAI,iCAAc,EAAE;YACpB,IAAI,wCAAqB,EAAE,EAAE,4BAA4B;SAC1D,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAY;QAChB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1B,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,SAAiB,EAAE,CAAS,EAAE,CAAS;QAC7D,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE7B,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;YAC1D,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;YAC5D,KAAK,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YAC5D,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YAC7D,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;QAC1D,CAAC;IACH,CAAC;CACF;AAvDD,oCAuDC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { AdbExecutor } from './adb-executor';
|
|
2
|
+
/**
|
|
3
|
+
* Coordenadas do centro de um elemento resolvido.
|
|
4
|
+
*/
|
|
5
|
+
export interface ResolvedElement {
|
|
6
|
+
x: number;
|
|
7
|
+
y: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Interface para resolvedores de seletores (Chain of Responsibility).
|
|
11
|
+
* Cada resolver sabe identificar e resolver um formato especifico de seletor.
|
|
12
|
+
*/
|
|
13
|
+
export interface SelectorResolver {
|
|
14
|
+
name: string;
|
|
15
|
+
canResolve(selector: string): boolean;
|
|
16
|
+
resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolve seletores por accessibility id (prefixo ~) ou contendo :id/.
|
|
20
|
+
* Ex: ~com.app:id/button, com.app:id/button
|
|
21
|
+
*
|
|
22
|
+
* @deprecated Only needed for pre-v2 test code using ~ prefix.
|
|
23
|
+
* New codegen v2 uses UiSelector().resourceId() format, handled by UiSelectorResolver.
|
|
24
|
+
* Keep for backward compatibility with existing test files.
|
|
25
|
+
*/
|
|
26
|
+
export declare class ResourceIdResolver implements SelectorResolver {
|
|
27
|
+
name: string;
|
|
28
|
+
canResolve(selector: string): boolean;
|
|
29
|
+
resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolve seletores XPath por texto: //*[@text="..."]
|
|
33
|
+
*/
|
|
34
|
+
export declare class TextXPathResolver implements SelectorResolver {
|
|
35
|
+
name: string;
|
|
36
|
+
canResolve(selector: string): boolean;
|
|
37
|
+
resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Resolve seletores Playwright por resource-id: [resource-id="..."] ou resource-id="..."
|
|
41
|
+
*/
|
|
42
|
+
export declare class PlaywrightResourceIdResolver implements SelectorResolver {
|
|
43
|
+
name: string;
|
|
44
|
+
canResolve(selector: string): boolean;
|
|
45
|
+
resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve seletores Playwright por texto: text="..."
|
|
49
|
+
*/
|
|
50
|
+
export declare class PlaywrightTextResolver implements SelectorResolver {
|
|
51
|
+
name: string;
|
|
52
|
+
canResolve(selector: string): boolean;
|
|
53
|
+
resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Resolve seletores XPath simples por classe: //android.widget.Button
|
|
57
|
+
*/
|
|
58
|
+
export declare class XPathClassResolver implements SelectorResolver {
|
|
59
|
+
name: string;
|
|
60
|
+
canResolve(selector: string): boolean;
|
|
61
|
+
resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Resolve seletores UiAutomator UiSelector.
|
|
65
|
+
* Extrai .text("..."), .resourceId("..."), .description("..."), .className("...")
|
|
66
|
+
* e tenta cada um em ordem. Como ultimo recurso, tenta o primeiro elemento clicavel.
|
|
67
|
+
*/
|
|
68
|
+
export declare class UiSelectorResolver implements SelectorResolver {
|
|
69
|
+
name: string;
|
|
70
|
+
canResolve(selector: string): boolean;
|
|
71
|
+
resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Resolver de ultimo recurso: tenta como resource-id direto, depois como texto.
|
|
75
|
+
* Aceita qualquer seletor (canResolve sempre retorna true).
|
|
76
|
+
*/
|
|
77
|
+
export declare class FallbackResolver implements SelectorResolver {
|
|
78
|
+
name: string;
|
|
79
|
+
canResolve(_selector: string): boolean;
|
|
80
|
+
resolve(selector: string, adb: AdbExecutor, xml: string): ResolvedElement | null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Cria a cadeia de resolvers na ordem correta de prioridade.
|
|
84
|
+
* A ordem importa: resolvers mais especificos primeiro, fallback por ultimo.
|
|
85
|
+
*/
|
|
86
|
+
export declare function createResolverChain(): SelectorResolver[];
|
|
87
|
+
//# sourceMappingURL=selector-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector-resolver.d.ts","sourceRoot":"","sources":["../../src/runner/selector-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IACtC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;CAClF;AA8CD;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,IAAI,SAAwB;IAE5B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAMjF;AAED;;GAEG;AACH,qBAAa,iBAAkB,YAAW,gBAAgB;IACxD,IAAI,SAAuB;IAE3B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAOjF;AAED;;GAEG;AACH,qBAAa,4BAA6B,YAAW,gBAAgB;IACnE,IAAI,SAAkC;IAEtC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAOjF;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,gBAAgB;IAC7D,IAAI,SAA4B;IAEhC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAMjF;AAED;;GAEG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,IAAI,SAAwB;IAE5B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAMjF;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB;IACzD,IAAI,SAAwB;IAE5B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CA+BjF;AAED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,IAAI,SAAsB;IAE1B,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAItC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;CAUjF;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,EAAE,CAUxD"}
|