@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.
Files changed (229) hide show
  1. package/dist/adb/adb-path-resolver.d.ts +6 -0
  2. package/dist/adb/adb-path-resolver.d.ts.map +1 -0
  3. package/dist/adb/adb-path-resolver.js +93 -0
  4. package/dist/adb/adb-path-resolver.js.map +1 -0
  5. package/dist/adb/adb-shell.d.ts +29 -0
  6. package/dist/adb/adb-shell.d.ts.map +1 -0
  7. package/dist/adb/adb-shell.js +128 -0
  8. package/dist/adb/adb-shell.js.map +1 -0
  9. package/dist/adb/detector.d.ts +12 -0
  10. package/dist/adb/detector.d.ts.map +1 -0
  11. package/dist/adb/detector.js +44 -0
  12. package/dist/adb/detector.js.map +1 -0
  13. package/dist/adb/device-tracker.d.ts +23 -0
  14. package/dist/adb/device-tracker.d.ts.map +1 -0
  15. package/dist/adb/device-tracker.js +134 -0
  16. package/dist/adb/device-tracker.js.map +1 -0
  17. package/dist/adb/emulator-detector.d.ts +11 -0
  18. package/dist/adb/emulator-detector.d.ts.map +1 -0
  19. package/dist/adb/emulator-detector.js +54 -0
  20. package/dist/adb/emulator-detector.js.map +1 -0
  21. package/dist/appium/health-check.d.ts +6 -0
  22. package/dist/appium/health-check.d.ts.map +1 -0
  23. package/dist/appium/health-check.js +61 -0
  24. package/dist/appium/health-check.js.map +1 -0
  25. package/dist/appium/session-manager.d.ts +15 -0
  26. package/dist/appium/session-manager.d.ts.map +1 -0
  27. package/dist/appium/session-manager.js +82 -0
  28. package/dist/appium/session-manager.js.map +1 -0
  29. package/dist/auth/credential-store.d.ts +31 -0
  30. package/dist/auth/credential-store.d.ts.map +1 -0
  31. package/dist/auth/credential-store.js +154 -0
  32. package/dist/auth/credential-store.js.map +1 -0
  33. package/dist/auth/pairing-auth.d.ts +26 -0
  34. package/dist/auth/pairing-auth.d.ts.map +1 -0
  35. package/dist/auth/pairing-auth.js +177 -0
  36. package/dist/auth/pairing-auth.js.map +1 -0
  37. package/dist/auth/token-manager.d.ts +20 -0
  38. package/dist/auth/token-manager.d.ts.map +1 -0
  39. package/dist/auth/token-manager.js +101 -0
  40. package/dist/auth/token-manager.js.map +1 -0
  41. package/dist/commands/connect.d.ts +9 -0
  42. package/dist/commands/connect.d.ts.map +1 -0
  43. package/dist/commands/connect.js +270 -0
  44. package/dist/commands/connect.js.map +1 -0
  45. package/dist/commands/devices.d.ts +2 -0
  46. package/dist/commands/devices.d.ts.map +1 -0
  47. package/dist/commands/devices.js +52 -0
  48. package/dist/commands/devices.js.map +1 -0
  49. package/dist/commands/doctor.d.ts +2 -0
  50. package/dist/commands/doctor.d.ts.map +1 -0
  51. package/dist/commands/doctor.js +214 -0
  52. package/dist/commands/doctor.js.map +1 -0
  53. package/dist/commands/mirror.d.ts +2 -0
  54. package/dist/commands/mirror.d.ts.map +1 -0
  55. package/dist/commands/mirror.js +77 -0
  56. package/dist/commands/mirror.js.map +1 -0
  57. package/dist/commands/prompt.d.ts +12 -0
  58. package/dist/commands/prompt.d.ts.map +1 -0
  59. package/dist/commands/prompt.js +174 -0
  60. package/dist/commands/prompt.js.map +1 -0
  61. package/dist/commands/record.d.ts +7 -0
  62. package/dist/commands/record.d.ts.map +1 -0
  63. package/dist/commands/record.js +129 -0
  64. package/dist/commands/record.js.map +1 -0
  65. package/dist/commands/run.d.ts +16 -0
  66. package/dist/commands/run.d.ts.map +1 -0
  67. package/dist/commands/run.js +271 -0
  68. package/dist/commands/run.js.map +1 -0
  69. package/dist/commands/setup.d.ts +6 -0
  70. package/dist/commands/setup.d.ts.map +1 -0
  71. package/dist/commands/setup.js +50 -0
  72. package/dist/commands/setup.js.map +1 -0
  73. package/dist/commands/status.d.ts +2 -0
  74. package/dist/commands/status.d.ts.map +1 -0
  75. package/dist/commands/status.js +32 -0
  76. package/dist/commands/status.js.map +1 -0
  77. package/dist/healing/ai-adapter.d.ts +44 -0
  78. package/dist/healing/ai-adapter.d.ts.map +1 -0
  79. package/dist/healing/ai-adapter.js +87 -0
  80. package/dist/healing/ai-adapter.js.map +1 -0
  81. package/dist/healing/healer.d.ts +109 -0
  82. package/dist/healing/healer.d.ts.map +1 -0
  83. package/dist/healing/healer.js +475 -0
  84. package/dist/healing/healer.js.map +1 -0
  85. package/dist/healing/similarity.d.ts +63 -0
  86. package/dist/healing/similarity.d.ts.map +1 -0
  87. package/dist/healing/similarity.js +172 -0
  88. package/dist/healing/similarity.js.map +1 -0
  89. package/dist/index.d.ts +3 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +107 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/recording/capture-strategies/capture-strategy.interface.d.ts +6 -0
  94. package/dist/recording/capture-strategies/capture-strategy.interface.d.ts.map +1 -0
  95. package/dist/recording/capture-strategies/capture-strategy.interface.js +3 -0
  96. package/dist/recording/capture-strategies/capture-strategy.interface.js.map +1 -0
  97. package/dist/recording/capture-strategies/getevent.strategy.d.ts +27 -0
  98. package/dist/recording/capture-strategies/getevent.strategy.d.ts.map +1 -0
  99. package/dist/recording/capture-strategies/getevent.strategy.js +163 -0
  100. package/dist/recording/capture-strategies/getevent.strategy.js.map +1 -0
  101. package/dist/recording/capture-strategies/key-capture.strategy.d.ts +16 -0
  102. package/dist/recording/capture-strategies/key-capture.strategy.d.ts.map +1 -0
  103. package/dist/recording/capture-strategies/key-capture.strategy.js +67 -0
  104. package/dist/recording/capture-strategies/key-capture.strategy.js.map +1 -0
  105. package/dist/recording/capture-strategies/logcat-capture.strategy.d.ts +32 -0
  106. package/dist/recording/capture-strategies/logcat-capture.strategy.d.ts.map +1 -0
  107. package/dist/recording/capture-strategies/logcat-capture.strategy.js +176 -0
  108. package/dist/recording/capture-strategies/logcat-capture.strategy.js.map +1 -0
  109. package/dist/recording/confidence-scorer.d.ts +13 -0
  110. package/dist/recording/confidence-scorer.d.ts.map +1 -0
  111. package/dist/recording/confidence-scorer.js +34 -0
  112. package/dist/recording/confidence-scorer.js.map +1 -0
  113. package/dist/recording/event-capture.d.ts +40 -0
  114. package/dist/recording/event-capture.d.ts.map +1 -0
  115. package/dist/recording/event-capture.js +168 -0
  116. package/dist/recording/event-capture.js.map +1 -0
  117. package/dist/recording/recorder.d.ts +32 -0
  118. package/dist/recording/recorder.d.ts.map +1 -0
  119. package/dist/recording/recorder.js +107 -0
  120. package/dist/recording/recorder.js.map +1 -0
  121. package/dist/runner/adb-executor.d.ts +116 -0
  122. package/dist/runner/adb-executor.d.ts.map +1 -0
  123. package/dist/runner/adb-executor.js +323 -0
  124. package/dist/runner/adb-executor.js.map +1 -0
  125. package/dist/runner/appium-executor.d.ts +35 -0
  126. package/dist/runner/appium-executor.d.ts.map +1 -0
  127. package/dist/runner/appium-executor.js +191 -0
  128. package/dist/runner/appium-executor.js.map +1 -0
  129. package/dist/runner/parse-strategies/appium-default.strategy.d.ts +12 -0
  130. package/dist/runner/parse-strategies/appium-default.strategy.d.ts.map +1 -0
  131. package/dist/runner/parse-strategies/appium-default.strategy.js +342 -0
  132. package/dist/runner/parse-strategies/appium-default.strategy.js.map +1 -0
  133. package/dist/runner/parse-strategies/index.d.ts +7 -0
  134. package/dist/runner/parse-strategies/index.d.ts.map +1 -0
  135. package/dist/runner/parse-strategies/index.js +14 -0
  136. package/dist/runner/parse-strategies/index.js.map +1 -0
  137. package/dist/runner/parse-strategies/java.strategy.d.ts +8 -0
  138. package/dist/runner/parse-strategies/java.strategy.d.ts.map +1 -0
  139. package/dist/runner/parse-strategies/java.strategy.js +170 -0
  140. package/dist/runner/parse-strategies/java.strategy.js.map +1 -0
  141. package/dist/runner/parse-strategies/maestro.strategy.d.ts +8 -0
  142. package/dist/runner/parse-strategies/maestro.strategy.d.ts.map +1 -0
  143. package/dist/runner/parse-strategies/maestro.strategy.js +105 -0
  144. package/dist/runner/parse-strategies/maestro.strategy.js.map +1 -0
  145. package/dist/runner/parse-strategies/python.strategy.d.ts +8 -0
  146. package/dist/runner/parse-strategies/python.strategy.d.ts.map +1 -0
  147. package/dist/runner/parse-strategies/python.strategy.js +140 -0
  148. package/dist/runner/parse-strategies/python.strategy.js.map +1 -0
  149. package/dist/runner/parse-strategies/robot.strategy.d.ts +8 -0
  150. package/dist/runner/parse-strategies/robot.strategy.d.ts.map +1 -0
  151. package/dist/runner/parse-strategies/robot.strategy.js +81 -0
  152. package/dist/runner/parse-strategies/robot.strategy.js.map +1 -0
  153. package/dist/runner/parse-strategies/types.d.ts +17 -0
  154. package/dist/runner/parse-strategies/types.d.ts.map +1 -0
  155. package/dist/runner/parse-strategies/types.js +3 -0
  156. package/dist/runner/parse-strategies/types.js.map +1 -0
  157. package/dist/runner/parse-strategies/utils.d.ts +39 -0
  158. package/dist/runner/parse-strategies/utils.d.ts.map +1 -0
  159. package/dist/runner/parse-strategies/utils.js +217 -0
  160. package/dist/runner/parse-strategies/utils.js.map +1 -0
  161. package/dist/runner/script-parser.d.ts +43 -0
  162. package/dist/runner/script-parser.d.ts.map +1 -0
  163. package/dist/runner/script-parser.js +68 -0
  164. package/dist/runner/script-parser.js.map +1 -0
  165. package/dist/runner/selector-resolver.d.ts +87 -0
  166. package/dist/runner/selector-resolver.d.ts.map +1 -0
  167. package/dist/runner/selector-resolver.js +206 -0
  168. package/dist/runner/selector-resolver.js.map +1 -0
  169. package/dist/runner/step-executor.d.ts +112 -0
  170. package/dist/runner/step-executor.d.ts.map +1 -0
  171. package/dist/runner/step-executor.js +518 -0
  172. package/dist/runner/step-executor.js.map +1 -0
  173. package/dist/runner/test-runner.d.ts +89 -0
  174. package/dist/runner/test-runner.d.ts.map +1 -0
  175. package/dist/runner/test-runner.js +320 -0
  176. package/dist/runner/test-runner.js.map +1 -0
  177. package/dist/scrcpy/launcher.d.ts +16 -0
  178. package/dist/scrcpy/launcher.d.ts.map +1 -0
  179. package/dist/scrcpy/launcher.js +87 -0
  180. package/dist/scrcpy/launcher.js.map +1 -0
  181. package/dist/services/device-poller.d.ts +10 -0
  182. package/dist/services/device-poller.d.ts.map +1 -0
  183. package/dist/services/device-poller.js +44 -0
  184. package/dist/services/device-poller.js.map +1 -0
  185. package/dist/services/execution-manager.d.ts +18 -0
  186. package/dist/services/execution-manager.d.ts.map +1 -0
  187. package/dist/services/execution-manager.js +185 -0
  188. package/dist/services/execution-manager.js.map +1 -0
  189. package/dist/services/recording-manager.d.ts +13 -0
  190. package/dist/services/recording-manager.d.ts.map +1 -0
  191. package/dist/services/recording-manager.js +234 -0
  192. package/dist/services/recording-manager.js.map +1 -0
  193. package/dist/setup/adb-installer.d.ts +8 -0
  194. package/dist/setup/adb-installer.d.ts.map +1 -0
  195. package/dist/setup/adb-installer.js +115 -0
  196. package/dist/setup/adb-installer.js.map +1 -0
  197. package/dist/setup/appium-installer.d.ts +8 -0
  198. package/dist/setup/appium-installer.d.ts.map +1 -0
  199. package/dist/setup/appium-installer.js +113 -0
  200. package/dist/setup/appium-installer.js.map +1 -0
  201. package/dist/setup/base-installer.d.ts +33 -0
  202. package/dist/setup/base-installer.d.ts.map +1 -0
  203. package/dist/setup/base-installer.js +170 -0
  204. package/dist/setup/base-installer.js.map +1 -0
  205. package/dist/setup/build-tools-installer.d.ts +8 -0
  206. package/dist/setup/build-tools-installer.d.ts.map +1 -0
  207. package/dist/setup/build-tools-installer.js +109 -0
  208. package/dist/setup/build-tools-installer.js.map +1 -0
  209. package/dist/setup/java-installer.d.ts +8 -0
  210. package/dist/setup/java-installer.d.ts.map +1 -0
  211. package/dist/setup/java-installer.js +132 -0
  212. package/dist/setup/java-installer.js.map +1 -0
  213. package/dist/setup/paths.d.ts +12 -0
  214. package/dist/setup/paths.d.ts.map +1 -0
  215. package/dist/setup/paths.js +90 -0
  216. package/dist/setup/paths.js.map +1 -0
  217. package/dist/setup/scrcpy-installer.d.ts +8 -0
  218. package/dist/setup/scrcpy-installer.d.ts.map +1 -0
  219. package/dist/setup/scrcpy-installer.js +143 -0
  220. package/dist/setup/scrcpy-installer.js.map +1 -0
  221. package/dist/setup/setup-manager.d.ts +18 -0
  222. package/dist/setup/setup-manager.d.ts.map +1 -0
  223. package/dist/setup/setup-manager.js +113 -0
  224. package/dist/setup/setup-manager.js.map +1 -0
  225. package/dist/ws/socket.d.ts +38 -0
  226. package/dist/ws/socket.d.ts.map +1 -0
  227. package/dist/ws/socket.js +91 -0
  228. package/dist/ws/socket.js.map +1 -0
  229. package/package.json +53 -0
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Executor direto de acoes via ADB no dispositivo Android.
3
+ * Modo A (MVP) - nao requer Appium instalado.
4
+ */
5
+ export declare class AdbExecutor {
6
+ private serial;
7
+ constructor(serial: string);
8
+ private validateSerial;
9
+ /**
10
+ * Verifica se o dispositivo esta conectado e disponivel.
11
+ */
12
+ isConnected(): boolean;
13
+ /**
14
+ * Executa um toque na posicao (x, y) da tela.
15
+ */
16
+ tap(x: number, y: number): Promise<void>;
17
+ /**
18
+ * Executa um swipe de (x1,y1) para (x2,y2) com duracao em ms.
19
+ */
20
+ swipe(x1: number, y1: number, x2: number, y2: number, duration?: number): Promise<void>;
21
+ /**
22
+ * Digita texto no campo focado.
23
+ * ADB input text trata %s como espaco e nao aceita espacos literais.
24
+ * Caracteres especiais do shell sao escapados individualmente.
25
+ */
26
+ typeText(text: string): Promise<void>;
27
+ /**
28
+ * Pressiona uma tecla pelo keycode Android.
29
+ */
30
+ pressKey(keycode: number): Promise<void>;
31
+ /**
32
+ * Pressiona o botao Voltar (keyevent 4).
33
+ */
34
+ pressBack(): Promise<void>;
35
+ /**
36
+ * Pressiona o botao Home (keyevent 3).
37
+ */
38
+ pressHome(): Promise<void>;
39
+ /**
40
+ * Pressiona Enter (keyevent 66).
41
+ */
42
+ pressEnter(): Promise<void>;
43
+ /**
44
+ * Abre um app pelo package name.
45
+ * Se a activity for fornecida, usa am start. Caso contrario, usa monkey.
46
+ * Valida o formato do packageName para prevenir shell injection.
47
+ */
48
+ launchApp(packageName: string, activity?: string): Promise<void>;
49
+ /**
50
+ * Captura screenshot e salva no caminho especificado.
51
+ */
52
+ takeScreenshot(outputPath: string): Promise<void>;
53
+ /**
54
+ * Faz dump da hierarquia UI via uiautomator e retorna o XML.
55
+ */
56
+ dumpUi(): string;
57
+ /**
58
+ * Aguarda um elemento com o resourceId especificado aparecer na tela.
59
+ * Faz polling do UI dump ate encontrar ou atingir o timeout.
60
+ */
61
+ waitForElement(resourceId: string, timeout?: number): Promise<boolean>;
62
+ /**
63
+ * Retorna o texto de um elemento identificado pelo resourceId.
64
+ */
65
+ getElementText(resourceId: string): Promise<string | null>;
66
+ /**
67
+ * Verifica se um elemento com o resourceId existe na tela.
68
+ * Usa findElementInXml para tratar entidades XML corretamente.
69
+ */
70
+ isElementPresent(resourceId: string): Promise<boolean>;
71
+ /**
72
+ * Encontra um elemento no XML por texto exibido.
73
+ */
74
+ findElementByText(xml: string, text: string): string | null;
75
+ /**
76
+ * Encontra um elemento no XML por content-desc.
77
+ */
78
+ findElementByContentDesc(xml: string, desc: string): string | null;
79
+ /**
80
+ * Extrai as coordenadas centrais (x, y) de um node XML de elemento.
81
+ */
82
+ getElementCenter(nodeStr: string): {
83
+ x: number;
84
+ y: number;
85
+ } | null;
86
+ /**
87
+ * Encontra um elemento no XML do UI dump por atributo e valor.
88
+ */
89
+ private findElementInXml;
90
+ /**
91
+ * Decodifica entidades XML comuns para texto normal.
92
+ */
93
+ private decodeXmlEntities;
94
+ /**
95
+ * Extrai o valor de um atributo XML de uma string de node.
96
+ * Decodifica entidades XML para comparacao correta.
97
+ */
98
+ extractAttr(nodeStr: string, attrName: string): string;
99
+ /**
100
+ * Retorna a resolucao do ecra do dispositivo (largura x altura).
101
+ * Usado para calcular coordenadas relativas de swipe/scroll.
102
+ */
103
+ getScreenSize(): {
104
+ width: number;
105
+ height: number;
106
+ };
107
+ /**
108
+ * Executa um comando shell no dispositivo via ADB.
109
+ */
110
+ private exec;
111
+ /**
112
+ * Aguarda ms milissegundos.
113
+ */
114
+ private sleep;
115
+ }
116
+ //# sourceMappingURL=adb-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adb-executor.d.ts","sourceRoot":"","sources":["../../src/runner/adb-executor.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,qBAAa,WAAW;IACV,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAIlC,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,WAAW,IAAI,OAAO;IAatB;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C;;OAEG;IACG,KAAK,CACT,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,QAAQ,SAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAMhB;;;;OAIG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B3C;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCtE;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvD;;OAEG;IACH,MAAM,IAAI,MAAM;IAyBhB;;;OAGG;IACG,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,OAAO,SAAQ,GACd,OAAO,CAAC,OAAO,CAAC;IAcnB;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUhE;;;OAGG;IACG,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO5D;;OAEG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI3D;;OAEG;IACH,wBAAwB,CACtB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,IAAI;IAIhB;;OAEG;IACH,gBAAgB,CACd,OAAO,EAAE,MAAM,GACd;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAiBlC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAmBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAMtD;;;OAGG;IACH,aAAa,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAmBlD;;OAEG;IACH,OAAO,CAAC,IAAI;IAcZ;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,323 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdbExecutor = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const fs_1 = require("fs");
6
+ const shared_1 = require("@testdroid-ai/shared");
7
+ /**
8
+ * Executor direto de acoes via ADB no dispositivo Android.
9
+ * Modo A (MVP) - nao requer Appium instalado.
10
+ */
11
+ class AdbExecutor {
12
+ serial;
13
+ constructor(serial) {
14
+ this.serial = serial;
15
+ this.validateSerial();
16
+ }
17
+ validateSerial() {
18
+ if (!/^[a-zA-Z0-9._:\-]+$/.test(this.serial)) {
19
+ throw new Error(`Device serial invalido: ${this.serial}`);
20
+ }
21
+ }
22
+ /**
23
+ * Verifica se o dispositivo esta conectado e disponivel.
24
+ */
25
+ isConnected() {
26
+ try {
27
+ const output = (0, child_process_1.execFileSync)('adb', ['-s', this.serial, 'get-state'], {
28
+ encoding: 'utf-8',
29
+ stdio: 'pipe',
30
+ timeout: 5000,
31
+ });
32
+ return output.trim() === 'device';
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ /**
39
+ * Executa um toque na posicao (x, y) da tela.
40
+ */
41
+ async tap(x, y) {
42
+ this.exec(`input tap ${Math.round(x)} ${Math.round(y)}`);
43
+ }
44
+ /**
45
+ * Executa um swipe de (x1,y1) para (x2,y2) com duracao em ms.
46
+ */
47
+ async swipe(x1, y1, x2, y2, duration = 300) {
48
+ this.exec(`input swipe ${Math.round(x1)} ${Math.round(y1)} ${Math.round(x2)} ${Math.round(y2)} ${duration}`);
49
+ }
50
+ /**
51
+ * Digita texto no campo focado.
52
+ * ADB input text trata %s como espaco e nao aceita espacos literais.
53
+ * Caracteres especiais do shell sao escapados individualmente.
54
+ */
55
+ async typeText(text) {
56
+ if (!text)
57
+ return;
58
+ // Remove [] wrapper from accessibility service: "[hello]" → "hello"
59
+ let clean = text.replace(/^\[/, '').replace(/\]$/, '');
60
+ // Skip password placeholders — user must fill manually
61
+ if (clean === '<PASSWORD>' || clean.includes('•') || clean.includes('●')) {
62
+ return;
63
+ }
64
+ // Escapar caracteres especiais do shell e substituir espacos por %s
65
+ const escaped = clean
66
+ .replace(/\\/g, '\\\\')
67
+ .replace(/"/g, '\\"')
68
+ .replace(/'/g, "\\'")
69
+ .replace(/`/g, '\\`')
70
+ .replace(/\$/g, '\\$')
71
+ .replace(/&/g, '\\&')
72
+ .replace(/;/g, '\\;')
73
+ .replace(/\(/g, '\\(')
74
+ .replace(/\)/g, '\\)')
75
+ .replace(/\|/g, '\\|')
76
+ .replace(/</g, '\\<')
77
+ .replace(/>/g, '\\>')
78
+ .replace(/ /g, '%s');
79
+ // SEM aspas — %s so e interpretado como espaco pelo ADB sem quotes
80
+ this.exec(`input text ${escaped}`);
81
+ }
82
+ /**
83
+ * Pressiona uma tecla pelo keycode Android.
84
+ */
85
+ async pressKey(keycode) {
86
+ this.exec(`input keyevent ${keycode}`);
87
+ }
88
+ /**
89
+ * Pressiona o botao Voltar (keyevent 4).
90
+ */
91
+ async pressBack() {
92
+ await this.pressKey(4);
93
+ }
94
+ /**
95
+ * Pressiona o botao Home (keyevent 3).
96
+ */
97
+ async pressHome() {
98
+ await this.pressKey(3);
99
+ }
100
+ /**
101
+ * Pressiona Enter (keyevent 66).
102
+ */
103
+ async pressEnter() {
104
+ await this.pressKey(66);
105
+ }
106
+ /**
107
+ * Abre um app pelo package name.
108
+ * Se a activity for fornecida, usa am start. Caso contrario, usa monkey.
109
+ * Valida o formato do packageName para prevenir shell injection.
110
+ */
111
+ async launchApp(packageName, activity) {
112
+ // Validar formato: package name so pode conter letras, numeros, pontos e underscores
113
+ const validPkg = /^[a-zA-Z0-9._]+$/;
114
+ if (!validPkg.test(packageName)) {
115
+ throw new Error(`Package name invalido: ${packageName}`);
116
+ }
117
+ if (activity && !validPkg.test(activity)) {
118
+ throw new Error(`Activity invalida: ${activity}`);
119
+ }
120
+ // Skip launcher packages — they are already the home screen
121
+ if (shared_1.LAUNCHER_PACKAGES.includes(packageName)) {
122
+ return; // Already on home screen, nothing to launch
123
+ }
124
+ if (activity) {
125
+ this.exec(`am start -n ${packageName}/${activity}`);
126
+ }
127
+ else {
128
+ try {
129
+ this.exec(`monkey -p ${packageName} -c android.intent.category.LAUNCHER 1`);
130
+ }
131
+ catch {
132
+ // Fallback: try am start with intent
133
+ try {
134
+ this.exec(`am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER ${packageName}`);
135
+ }
136
+ catch {
137
+ // App may already be in foreground, continue execution
138
+ }
139
+ }
140
+ }
141
+ }
142
+ /**
143
+ * Captura screenshot e salva no caminho especificado.
144
+ */
145
+ async takeScreenshot(outputPath) {
146
+ try {
147
+ const buffer = (0, child_process_1.execFileSync)('adb', ['-s', this.serial, 'exec-out', 'screencap', '-p'], {
148
+ stdio: 'pipe',
149
+ maxBuffer: 20 * 1024 * 1024,
150
+ timeout: 10000,
151
+ });
152
+ (0, fs_1.writeFileSync)(outputPath, buffer);
153
+ }
154
+ catch (err) {
155
+ console.error(`Falha ao capturar screenshot: ${err.message}`);
156
+ }
157
+ }
158
+ /**
159
+ * Faz dump da hierarquia UI via uiautomator e retorna o XML.
160
+ */
161
+ dumpUi() {
162
+ try {
163
+ (0, child_process_1.execFileSync)('adb', ['-s', this.serial, 'shell', 'uiautomator', 'dump', '/sdcard/ui_dump.xml'], {
164
+ encoding: 'utf-8',
165
+ stdio: 'pipe',
166
+ timeout: 10000,
167
+ });
168
+ return (0, child_process_1.execFileSync)('adb', ['-s', this.serial, 'shell', 'cat', '/sdcard/ui_dump.xml'], {
169
+ encoding: 'utf-8',
170
+ stdio: 'pipe',
171
+ timeout: 5000,
172
+ });
173
+ }
174
+ catch (err) {
175
+ console.error(`Falha ao dumpar UI: ${err.message}`);
176
+ return '';
177
+ }
178
+ }
179
+ /**
180
+ * Aguarda um elemento com o resourceId especificado aparecer na tela.
181
+ * Faz polling do UI dump ate encontrar ou atingir o timeout.
182
+ */
183
+ async waitForElement(resourceId, timeout = 10000) {
184
+ const startTime = Date.now();
185
+ const pollInterval = 1000;
186
+ while (Date.now() - startTime < timeout) {
187
+ const found = await this.isElementPresent(resourceId);
188
+ if (found)
189
+ return true;
190
+ await this.sleep(pollInterval);
191
+ }
192
+ return false;
193
+ }
194
+ /**
195
+ * Retorna o texto de um elemento identificado pelo resourceId.
196
+ */
197
+ async getElementText(resourceId) {
198
+ const xml = this.dumpUi();
199
+ if (!xml)
200
+ return null;
201
+ const element = this.findElementInXml(xml, 'resource-id', resourceId);
202
+ if (!element)
203
+ return null;
204
+ return this.extractAttr(element, 'text') || null;
205
+ }
206
+ /**
207
+ * Verifica se um elemento com o resourceId existe na tela.
208
+ * Usa findElementInXml para tratar entidades XML corretamente.
209
+ */
210
+ async isElementPresent(resourceId) {
211
+ const xml = this.dumpUi();
212
+ if (!xml)
213
+ return false;
214
+ return this.findElementInXml(xml, 'resource-id', resourceId) !== null;
215
+ }
216
+ /**
217
+ * Encontra um elemento no XML por texto exibido.
218
+ */
219
+ findElementByText(xml, text) {
220
+ return this.findElementInXml(xml, 'text', text);
221
+ }
222
+ /**
223
+ * Encontra um elemento no XML por content-desc.
224
+ */
225
+ findElementByContentDesc(xml, desc) {
226
+ return this.findElementInXml(xml, 'content-desc', desc);
227
+ }
228
+ /**
229
+ * Extrai as coordenadas centrais (x, y) de um node XML de elemento.
230
+ */
231
+ getElementCenter(nodeStr) {
232
+ const boundsMatch = nodeStr.match(/bounds="\[(\d+),(\d+)\]\[(\d+),(\d+)\]"/);
233
+ if (!boundsMatch)
234
+ return null;
235
+ const x1 = parseInt(boundsMatch[1], 10);
236
+ const y1 = parseInt(boundsMatch[2], 10);
237
+ const x2 = parseInt(boundsMatch[3], 10);
238
+ const y2 = parseInt(boundsMatch[4], 10);
239
+ return {
240
+ x: Math.round((x1 + x2) / 2),
241
+ y: Math.round((y1 + y2) / 2),
242
+ };
243
+ }
244
+ /**
245
+ * Encontra um elemento no XML do UI dump por atributo e valor.
246
+ */
247
+ findElementInXml(xml, attrName, attrValue) {
248
+ const nodeRegex = /<node\s[^>]*>/g;
249
+ let match;
250
+ while ((match = nodeRegex.exec(xml)) !== null) {
251
+ const nodeStr = match[0];
252
+ const value = this.extractAttr(nodeStr, attrName);
253
+ if (value === attrValue) {
254
+ return nodeStr;
255
+ }
256
+ }
257
+ return null;
258
+ }
259
+ /**
260
+ * Decodifica entidades XML comuns para texto normal.
261
+ */
262
+ decodeXmlEntities(str) {
263
+ return str
264
+ .replace(/&amp;/g, '&')
265
+ .replace(/&lt;/g, '<')
266
+ .replace(/&gt;/g, '>')
267
+ .replace(/&quot;/g, '"')
268
+ .replace(/&apos;/g, "'");
269
+ }
270
+ /**
271
+ * Extrai o valor de um atributo XML de uma string de node.
272
+ * Decodifica entidades XML para comparacao correta.
273
+ */
274
+ extractAttr(nodeStr, attrName) {
275
+ const regex = new RegExp(`${attrName}="([^"]*)"`);
276
+ const match = nodeStr.match(regex);
277
+ return match ? this.decodeXmlEntities(match[1]) : '';
278
+ }
279
+ /**
280
+ * Retorna a resolucao do ecra do dispositivo (largura x altura).
281
+ * Usado para calcular coordenadas relativas de swipe/scroll.
282
+ */
283
+ getScreenSize() {
284
+ try {
285
+ const output = (0, child_process_1.execFileSync)('adb', ['-s', this.serial, 'shell', 'wm', 'size'], { encoding: 'utf-8', stdio: 'pipe', timeout: 5000 });
286
+ const match = output.match(/(\d+)x(\d+)/);
287
+ if (match) {
288
+ return {
289
+ width: parseInt(match[1], 10),
290
+ height: parseInt(match[2], 10),
291
+ };
292
+ }
293
+ }
294
+ catch (err) {
295
+ console.error(`Falha ao obter tamanho da tela: ${err.message}`);
296
+ }
297
+ return { width: 1080, height: 1920 }; // fallback padrao
298
+ }
299
+ /**
300
+ * Executa um comando shell no dispositivo via ADB.
301
+ */
302
+ exec(shellCommand) {
303
+ try {
304
+ return (0, child_process_1.execFileSync)('adb', ['-s', this.serial, 'shell', shellCommand], {
305
+ encoding: 'utf-8',
306
+ stdio: 'pipe',
307
+ timeout: 15000,
308
+ });
309
+ }
310
+ catch (err) {
311
+ const message = err instanceof Error ? err.message : String(err);
312
+ throw new Error(`Erro ADB: ${message}`);
313
+ }
314
+ }
315
+ /**
316
+ * Aguarda ms milissegundos.
317
+ */
318
+ sleep(ms) {
319
+ return new Promise((resolve) => setTimeout(resolve, ms));
320
+ }
321
+ }
322
+ exports.AdbExecutor = AdbExecutor;
323
+ //# sourceMappingURL=adb-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adb-executor.js","sourceRoot":"","sources":["../../src/runner/adb-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { TestStep } from './script-parser';
2
+ /**
3
+ * Executor de passos de teste via Appium/WebDriverIO.
4
+ *
5
+ * Conecta a um Appium server e executa acoes usando W3C WebDriver protocol.
6
+ * Todos os imports de webdriverio sao dinamicos (Decision D2).
7
+ */
8
+ export declare class AppiumExecutor {
9
+ private serial;
10
+ private appiumUrl;
11
+ private driver;
12
+ constructor(serial: string, appiumUrl: string);
13
+ /**
14
+ * Conecta ao Appium server e cria sessao WebDriver.
15
+ */
16
+ connect(): Promise<void>;
17
+ /**
18
+ * Executa um passo de teste individual via WebDriverIO.
19
+ * Acessa parametros via step.params (Decision D4).
20
+ */
21
+ executeStep(step: TestStep): Promise<{
22
+ success: boolean;
23
+ error?: string;
24
+ duration: number;
25
+ }>;
26
+ /**
27
+ * Retorna a instancia do driver WebDriverIO (ou null se nao conectado).
28
+ */
29
+ getDriver(): any | null;
30
+ /**
31
+ * Encerra a sessao WebDriver.
32
+ */
33
+ disconnect(): Promise<void>;
34
+ }
35
+ //# sourceMappingURL=appium-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appium-executor.d.ts","sourceRoot":"","sources":["../../src/runner/appium-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C;;;;;GAKG;AACH,qBAAa,cAAc;IAGb,OAAO,CAAC,MAAM;IAAU,OAAO,CAAC,SAAS;IAFrD,OAAO,CAAC,MAAM,CAAa;gBAEP,MAAM,EAAE,MAAM,EAAU,SAAS,EAAE,MAAM;IAE7D;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9B;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IA4GlG;;OAEG;IACH,SAAS,IAAI,GAAG,GAAG,IAAI;IAIvB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAMlC"}