@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,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FallbackResolver = exports.UiSelectorResolver = exports.XPathClassResolver = exports.PlaywrightTextResolver = exports.PlaywrightResourceIdResolver = exports.TextXPathResolver = exports.ResourceIdResolver = void 0;
|
|
4
|
+
exports.createResolverChain = createResolverChain;
|
|
5
|
+
// --- Helpers internos ---
|
|
6
|
+
/**
|
|
7
|
+
* Encontra um node XML por nome de atributo e valor.
|
|
8
|
+
*/
|
|
9
|
+
function findNodeByAttr(xml, attrName, attrValue, adb) {
|
|
10
|
+
const nodeRegex = /<node\s[^>]*>/g;
|
|
11
|
+
let match;
|
|
12
|
+
while ((match = nodeRegex.exec(xml)) !== null) {
|
|
13
|
+
const nodeStr = match[0];
|
|
14
|
+
const value = adb.extractAttr(nodeStr, attrName);
|
|
15
|
+
if (value === attrValue) {
|
|
16
|
+
return nodeStr;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Encontra o primeiro elemento clicavel no dump.
|
|
23
|
+
*/
|
|
24
|
+
function findFirstClickable(xml) {
|
|
25
|
+
const nodeRegex = /<node\s[^>]*>/g;
|
|
26
|
+
let match;
|
|
27
|
+
while ((match = nodeRegex.exec(xml)) !== null) {
|
|
28
|
+
const nodeStr = match[0];
|
|
29
|
+
if (nodeStr.includes('clickable="true"')) {
|
|
30
|
+
return nodeStr;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
// --- Resolvers ---
|
|
36
|
+
/**
|
|
37
|
+
* Resolve seletores por accessibility id (prefixo ~) ou contendo :id/.
|
|
38
|
+
* Ex: ~com.app:id/button, com.app:id/button
|
|
39
|
+
*
|
|
40
|
+
* @deprecated Only needed for pre-v2 test code using ~ prefix.
|
|
41
|
+
* New codegen v2 uses UiSelector().resourceId() format, handled by UiSelectorResolver.
|
|
42
|
+
* Keep for backward compatibility with existing test files.
|
|
43
|
+
*/
|
|
44
|
+
class ResourceIdResolver {
|
|
45
|
+
name = 'ResourceIdResolver';
|
|
46
|
+
canResolve(selector) {
|
|
47
|
+
return selector.startsWith('~');
|
|
48
|
+
}
|
|
49
|
+
resolve(selector, adb, xml) {
|
|
50
|
+
const resourceId = selector.slice(1);
|
|
51
|
+
const nodeStr = findNodeByAttr(xml, 'resource-id', resourceId, adb);
|
|
52
|
+
if (!nodeStr)
|
|
53
|
+
return null;
|
|
54
|
+
return adb.getElementCenter(nodeStr);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.ResourceIdResolver = ResourceIdResolver;
|
|
58
|
+
/**
|
|
59
|
+
* Resolve seletores XPath por texto: //*[@text="..."]
|
|
60
|
+
*/
|
|
61
|
+
class TextXPathResolver {
|
|
62
|
+
name = 'TextXPathResolver';
|
|
63
|
+
canResolve(selector) {
|
|
64
|
+
return selector.includes('@text="');
|
|
65
|
+
}
|
|
66
|
+
resolve(selector, adb, xml) {
|
|
67
|
+
const textMatch = selector.match(/@text="([^"]*)"/);
|
|
68
|
+
if (!textMatch)
|
|
69
|
+
return null;
|
|
70
|
+
const nodeStr = findNodeByAttr(xml, 'text', textMatch[1], adb);
|
|
71
|
+
if (!nodeStr)
|
|
72
|
+
return null;
|
|
73
|
+
return adb.getElementCenter(nodeStr);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.TextXPathResolver = TextXPathResolver;
|
|
77
|
+
/**
|
|
78
|
+
* Resolve seletores Playwright por resource-id: [resource-id="..."] ou resource-id="..."
|
|
79
|
+
*/
|
|
80
|
+
class PlaywrightResourceIdResolver {
|
|
81
|
+
name = 'PlaywrightResourceIdResolver';
|
|
82
|
+
canResolve(selector) {
|
|
83
|
+
return selector.includes('resource-id="');
|
|
84
|
+
}
|
|
85
|
+
resolve(selector, adb, xml) {
|
|
86
|
+
const idMatch = selector.match(/resource-id="([^"]*)"/);
|
|
87
|
+
if (!idMatch)
|
|
88
|
+
return null;
|
|
89
|
+
const nodeStr = findNodeByAttr(xml, 'resource-id', idMatch[1], adb);
|
|
90
|
+
if (!nodeStr)
|
|
91
|
+
return null;
|
|
92
|
+
return adb.getElementCenter(nodeStr);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.PlaywrightResourceIdResolver = PlaywrightResourceIdResolver;
|
|
96
|
+
/**
|
|
97
|
+
* Resolve seletores Playwright por texto: text="..."
|
|
98
|
+
*/
|
|
99
|
+
class PlaywrightTextResolver {
|
|
100
|
+
name = 'PlaywrightTextResolver';
|
|
101
|
+
canResolve(selector) {
|
|
102
|
+
return selector.startsWith('text=');
|
|
103
|
+
}
|
|
104
|
+
resolve(selector, adb, xml) {
|
|
105
|
+
const text = selector.replace(/^text="/, '').replace(/"$/, '');
|
|
106
|
+
const nodeStr = findNodeByAttr(xml, 'text', text, adb);
|
|
107
|
+
if (!nodeStr)
|
|
108
|
+
return null;
|
|
109
|
+
return adb.getElementCenter(nodeStr);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.PlaywrightTextResolver = PlaywrightTextResolver;
|
|
113
|
+
/**
|
|
114
|
+
* Resolve seletores XPath simples por classe: //android.widget.Button
|
|
115
|
+
*/
|
|
116
|
+
class XPathClassResolver {
|
|
117
|
+
name = 'XPathClassResolver';
|
|
118
|
+
canResolve(selector) {
|
|
119
|
+
return selector.startsWith('//');
|
|
120
|
+
}
|
|
121
|
+
resolve(selector, adb, xml) {
|
|
122
|
+
const className = selector.replace(/^\/\//, '');
|
|
123
|
+
const nodeStr = findNodeByAttr(xml, 'class', className, adb);
|
|
124
|
+
if (!nodeStr)
|
|
125
|
+
return null;
|
|
126
|
+
return adb.getElementCenter(nodeStr);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
exports.XPathClassResolver = XPathClassResolver;
|
|
130
|
+
/**
|
|
131
|
+
* Resolve seletores UiAutomator UiSelector.
|
|
132
|
+
* Extrai .text("..."), .resourceId("..."), .description("..."), .className("...")
|
|
133
|
+
* e tenta cada um em ordem. Como ultimo recurso, tenta o primeiro elemento clicavel.
|
|
134
|
+
*/
|
|
135
|
+
class UiSelectorResolver {
|
|
136
|
+
name = 'UiSelectorResolver';
|
|
137
|
+
canResolve(selector) {
|
|
138
|
+
return selector.includes('UiSelector');
|
|
139
|
+
}
|
|
140
|
+
resolve(selector, adb, xml) {
|
|
141
|
+
let nodeStr = null;
|
|
142
|
+
const textMatch = selector.match(/\.text\("([^"]*)"\)/);
|
|
143
|
+
if (textMatch) {
|
|
144
|
+
nodeStr = findNodeByAttr(xml, 'text', textMatch[1], adb);
|
|
145
|
+
}
|
|
146
|
+
const resIdMatch = selector.match(/\.resourceId\("([^"]*)"\)/);
|
|
147
|
+
if (!nodeStr && resIdMatch) {
|
|
148
|
+
nodeStr = findNodeByAttr(xml, 'resource-id', resIdMatch[1], adb);
|
|
149
|
+
}
|
|
150
|
+
const descMatch = selector.match(/\.description\("([^"]*)"\)/);
|
|
151
|
+
if (!nodeStr && descMatch) {
|
|
152
|
+
nodeStr = findNodeByAttr(xml, 'content-desc', descMatch[1], adb);
|
|
153
|
+
}
|
|
154
|
+
const classMatch = selector.match(/\.className\("([^"]*)"\)/);
|
|
155
|
+
if (!nodeStr && classMatch) {
|
|
156
|
+
nodeStr = findNodeByAttr(xml, 'class', classMatch[1], adb);
|
|
157
|
+
}
|
|
158
|
+
// Last resort: try first clickable
|
|
159
|
+
if (!nodeStr) {
|
|
160
|
+
nodeStr = findFirstClickable(xml);
|
|
161
|
+
}
|
|
162
|
+
if (!nodeStr)
|
|
163
|
+
return null;
|
|
164
|
+
return adb.getElementCenter(nodeStr);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
exports.UiSelectorResolver = UiSelectorResolver;
|
|
168
|
+
/**
|
|
169
|
+
* Resolver de ultimo recurso: tenta como resource-id direto, depois como texto.
|
|
170
|
+
* Aceita qualquer seletor (canResolve sempre retorna true).
|
|
171
|
+
*/
|
|
172
|
+
class FallbackResolver {
|
|
173
|
+
name = 'FallbackResolver';
|
|
174
|
+
canResolve(_selector) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
resolve(selector, adb, xml) {
|
|
178
|
+
// Tentar como resource-id direto
|
|
179
|
+
let nodeStr = findNodeByAttr(xml, 'resource-id', selector, adb);
|
|
180
|
+
if (!nodeStr) {
|
|
181
|
+
// Tentar como texto
|
|
182
|
+
nodeStr = findNodeByAttr(xml, 'text', selector, adb);
|
|
183
|
+
}
|
|
184
|
+
if (!nodeStr)
|
|
185
|
+
return null;
|
|
186
|
+
return adb.getElementCenter(nodeStr);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
exports.FallbackResolver = FallbackResolver;
|
|
190
|
+
// --- Factory ---
|
|
191
|
+
/**
|
|
192
|
+
* Cria a cadeia de resolvers na ordem correta de prioridade.
|
|
193
|
+
* A ordem importa: resolvers mais especificos primeiro, fallback por ultimo.
|
|
194
|
+
*/
|
|
195
|
+
function createResolverChain() {
|
|
196
|
+
return [
|
|
197
|
+
new ResourceIdResolver(),
|
|
198
|
+
new TextXPathResolver(),
|
|
199
|
+
new PlaywrightResourceIdResolver(),
|
|
200
|
+
new PlaywrightTextResolver(),
|
|
201
|
+
new XPathClassResolver(),
|
|
202
|
+
new UiSelectorResolver(),
|
|
203
|
+
new FallbackResolver(),
|
|
204
|
+
];
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=selector-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector-resolver.js","sourceRoot":"","sources":["../../src/runner/selector-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { AdbExecutor } from './adb-executor';
|
|
2
|
+
import { TestStep } from './script-parser';
|
|
3
|
+
import { HealingAttempt } from '@testdroid-ai/shared';
|
|
4
|
+
/**
|
|
5
|
+
* Resultado da execucao de um unico passo.
|
|
6
|
+
*/
|
|
7
|
+
export interface StepResult {
|
|
8
|
+
success: boolean;
|
|
9
|
+
error?: string;
|
|
10
|
+
healed?: boolean;
|
|
11
|
+
healingAttempt?: HealingAttempt;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Resultado completo da execucao de todos os passos.
|
|
15
|
+
*/
|
|
16
|
+
export interface TestRunResult {
|
|
17
|
+
status: 'passed' | 'failed' | 'error';
|
|
18
|
+
duration: number;
|
|
19
|
+
logs: string;
|
|
20
|
+
errorMessage?: string;
|
|
21
|
+
screenshotPath?: string;
|
|
22
|
+
stepsTotal: number;
|
|
23
|
+
stepsPassed: number;
|
|
24
|
+
stepsFailed: number;
|
|
25
|
+
healingAttempts: HealingAttempt[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Callback chamado a cada passo executado.
|
|
29
|
+
*/
|
|
30
|
+
export type OnStepCallback = (stepIndex: number, step: TestStep, result: StepResult) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Opcoes de execucao do StepExecutor.
|
|
33
|
+
*/
|
|
34
|
+
export interface StepExecutorOptions {
|
|
35
|
+
/** Desabilitar self-healing */
|
|
36
|
+
noHeal?: boolean;
|
|
37
|
+
/** ID da execucao (para tracking de healing) */
|
|
38
|
+
testRunId?: string;
|
|
39
|
+
/** Package name do app (para beforeEach/afterEach) */
|
|
40
|
+
appPackage?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Executa passos de teste parseados usando AdbExecutor.
|
|
44
|
+
*
|
|
45
|
+
* Resolve seletores (resourceId, text, xpath) para coordenadas
|
|
46
|
+
* via UI dump e executa acoes via ADB.
|
|
47
|
+
*
|
|
48
|
+
* Quando o self-healing esta habilitado, tenta encontrar
|
|
49
|
+
* elementos por estrategias alternativas quando o seletor falha.
|
|
50
|
+
*/
|
|
51
|
+
export declare class StepExecutor {
|
|
52
|
+
private adb;
|
|
53
|
+
private logs;
|
|
54
|
+
private healer;
|
|
55
|
+
private healingAttempts;
|
|
56
|
+
private options;
|
|
57
|
+
private resolvers;
|
|
58
|
+
constructor(adb: AdbExecutor, options?: StepExecutorOptions);
|
|
59
|
+
/**
|
|
60
|
+
* Executa um unico passo de teste.
|
|
61
|
+
* Resolve seletores para coordenadas usando UI dump quando necessario.
|
|
62
|
+
*/
|
|
63
|
+
executeStep(step: TestStep): Promise<StepResult>;
|
|
64
|
+
/**
|
|
65
|
+
* beforeEach: garante estado limpo antes da execucao.
|
|
66
|
+
* - Fecha dialogs abertos (back key)
|
|
67
|
+
* - Verifica se o app esta em foreground, relanca se nao estiver
|
|
68
|
+
* - Aguarda estabilizacao
|
|
69
|
+
*/
|
|
70
|
+
private beforeEach;
|
|
71
|
+
/**
|
|
72
|
+
* afterEach: cleanup apos a execucao.
|
|
73
|
+
* - Captura screenshot do estado final
|
|
74
|
+
* - Em caso de falha, tenta fechar dialogs
|
|
75
|
+
* - Regista estado final no log
|
|
76
|
+
*/
|
|
77
|
+
private afterEach;
|
|
78
|
+
/**
|
|
79
|
+
* Executa todos os passos em sequencia.
|
|
80
|
+
* Inclui beforeEach (preparacao) e afterEach (cleanup).
|
|
81
|
+
* Para na primeira falha e retorna o resultado geral.
|
|
82
|
+
* Inclui tentativas de self-healing quando habilitado.
|
|
83
|
+
*/
|
|
84
|
+
executeAll(steps: TestStep[], onStep?: OnStepCallback): Promise<TestRunResult>;
|
|
85
|
+
private executeTap;
|
|
86
|
+
private executeLongPress;
|
|
87
|
+
private executeSwipe;
|
|
88
|
+
private executeTypeText;
|
|
89
|
+
private executePressKey;
|
|
90
|
+
private executeAssertElement;
|
|
91
|
+
private executeAssertText;
|
|
92
|
+
/**
|
|
93
|
+
* Tenta curar um seletor que falhou e re-executar a acao.
|
|
94
|
+
* Retorna null se healing esta desabilitado ou falhou.
|
|
95
|
+
*/
|
|
96
|
+
private tryHeal;
|
|
97
|
+
/**
|
|
98
|
+
* Resolve um seletor (resourceId, texto, xpath) para coordenadas (x, y).
|
|
99
|
+
* Usa Chain of Responsibility: percorre a cadeia de resolvers ate encontrar
|
|
100
|
+
* um que consiga resolver o seletor.
|
|
101
|
+
*/
|
|
102
|
+
private resolveSelector;
|
|
103
|
+
/**
|
|
104
|
+
* Adiciona entrada ao log.
|
|
105
|
+
*/
|
|
106
|
+
private log;
|
|
107
|
+
/**
|
|
108
|
+
* Aguarda ms milissegundos.
|
|
109
|
+
*/
|
|
110
|
+
private sleep;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=step-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-executor.d.ts","sourceRoot":"","sources":["../../src/runner/step-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,UAAU,KACf,IAAI,CAAC;AAEV;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,+BAA+B;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,qBAAa,YAAY;IAOX,OAAO,CAAC,GAAG;IANvB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,SAAS,CAA6C;gBAE1C,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,mBAAmB;IAKnE;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IAkEtD;;;;;OAKG;YACW,UAAU;IAyCxB;;;;;OAKG;YACW,SAAS;IAmCvB;;;;;OAKG;IACG,UAAU,CACd,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC;YA+EX,UAAU;YA4CV,gBAAgB;YA4ChB,YAAY;YAwBZ,eAAe;YA0Cf,eAAe;YA2Cf,oBAAoB;YA6BpB,iBAAiB;IAkC/B;;;OAGG;YACW,OAAO;IAuGrB;;;;OAIG;YACW,eAAe;IAgB7B;;OAEG;IACH,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
|