@limrun/appium-xcuitest-driver 10.4.3-lim.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/CHANGELOG.md +2600 -0
  2. package/LICENSE +201 -0
  3. package/README.md +55 -0
  4. package/build/index.d.ts +5 -0
  5. package/build/index.js +41 -0
  6. package/build/lib/app-infos-cache.d.ts +62 -0
  7. package/build/lib/app-infos-cache.d.ts.map +1 -0
  8. package/build/lib/app-infos-cache.js +180 -0
  9. package/build/lib/app-infos-cache.js.map +1 -0
  10. package/build/lib/app-utils.d.ts +89 -0
  11. package/build/lib/app-utils.d.ts.map +1 -0
  12. package/build/lib/app-utils.js +657 -0
  13. package/build/lib/app-utils.js.map +1 -0
  14. package/build/lib/commands/active-app-info.d.ts +9 -0
  15. package/build/lib/commands/active-app-info.d.ts.map +1 -0
  16. package/build/lib/commands/active-app-info.js +14 -0
  17. package/build/lib/commands/active-app-info.js.map +1 -0
  18. package/build/lib/commands/advanced-battery-types.d.ts +444 -0
  19. package/build/lib/commands/advanced-battery-types.d.ts.map +1 -0
  20. package/build/lib/commands/advanced-battery-types.js +8 -0
  21. package/build/lib/commands/advanced-battery-types.js.map +1 -0
  22. package/build/lib/commands/alert.d.ts +45 -0
  23. package/build/lib/commands/alert.d.ts.map +1 -0
  24. package/build/lib/commands/alert.js +87 -0
  25. package/build/lib/commands/alert.js.map +1 -0
  26. package/build/lib/commands/app-management.d.ts +153 -0
  27. package/build/lib/commands/app-management.d.ts.map +1 -0
  28. package/build/lib/commands/app-management.js +323 -0
  29. package/build/lib/commands/app-management.js.map +1 -0
  30. package/build/lib/commands/app-strings.d.ts +16 -0
  31. package/build/lib/commands/app-strings.d.ts.map +1 -0
  32. package/build/lib/commands/app-strings.js +30 -0
  33. package/build/lib/commands/app-strings.js.map +1 -0
  34. package/build/lib/commands/appearance.d.ts +22 -0
  35. package/build/lib/commands/appearance.d.ts.map +1 -0
  36. package/build/lib/commands/appearance.js +74 -0
  37. package/build/lib/commands/appearance.js.map +1 -0
  38. package/build/lib/commands/audit.d.ts +43 -0
  39. package/build/lib/commands/audit.d.ts.map +1 -0
  40. package/build/lib/commands/audit.js +31 -0
  41. package/build/lib/commands/audit.js.map +1 -0
  42. package/build/lib/commands/battery.d.ts +13 -0
  43. package/build/lib/commands/battery.d.ts.map +1 -0
  44. package/build/lib/commands/battery.js +49 -0
  45. package/build/lib/commands/battery.js.map +1 -0
  46. package/build/lib/commands/bidi/constants.d.ts +6 -0
  47. package/build/lib/commands/bidi/constants.d.ts.map +1 -0
  48. package/build/lib/commands/bidi/constants.js +10 -0
  49. package/build/lib/commands/bidi/constants.js.map +1 -0
  50. package/build/lib/commands/bidi/models.d.ts +9 -0
  51. package/build/lib/commands/bidi/models.d.ts.map +1 -0
  52. package/build/lib/commands/bidi/models.js +54 -0
  53. package/build/lib/commands/bidi/models.js.map +1 -0
  54. package/build/lib/commands/bidi/types.d.ts +26 -0
  55. package/build/lib/commands/bidi/types.d.ts.map +1 -0
  56. package/build/lib/commands/bidi/types.js +4 -0
  57. package/build/lib/commands/bidi/types.js.map +1 -0
  58. package/build/lib/commands/biometric.d.ts +32 -0
  59. package/build/lib/commands/biometric.d.ts.map +1 -0
  60. package/build/lib/commands/biometric.js +54 -0
  61. package/build/lib/commands/biometric.js.map +1 -0
  62. package/build/lib/commands/certificate.d.ts +50 -0
  63. package/build/lib/commands/certificate.d.ts.map +1 -0
  64. package/build/lib/commands/certificate.js +454 -0
  65. package/build/lib/commands/certificate.js.map +1 -0
  66. package/build/lib/commands/clipboard.d.ts +21 -0
  67. package/build/lib/commands/clipboard.d.ts.map +1 -0
  68. package/build/lib/commands/clipboard.js +36 -0
  69. package/build/lib/commands/clipboard.js.map +1 -0
  70. package/build/lib/commands/condition.d.ts +102 -0
  71. package/build/lib/commands/condition.d.ts.map +1 -0
  72. package/build/lib/commands/condition.js +146 -0
  73. package/build/lib/commands/condition.js.map +1 -0
  74. package/build/lib/commands/content-size.d.ts +30 -0
  75. package/build/lib/commands/content-size.d.ts.map +1 -0
  76. package/build/lib/commands/content-size.js +67 -0
  77. package/build/lib/commands/content-size.js.map +1 -0
  78. package/build/lib/commands/context.d.ts +191 -0
  79. package/build/lib/commands/context.d.ts.map +1 -0
  80. package/build/lib/commands/context.js +625 -0
  81. package/build/lib/commands/context.js.map +1 -0
  82. package/build/lib/commands/deviceInfo.d.ts +12 -0
  83. package/build/lib/commands/deviceInfo.d.ts.map +1 -0
  84. package/build/lib/commands/deviceInfo.js +25 -0
  85. package/build/lib/commands/deviceInfo.js.map +1 -0
  86. package/build/lib/commands/element.d.ts +108 -0
  87. package/build/lib/commands/element.d.ts.map +1 -0
  88. package/build/lib/commands/element.js +395 -0
  89. package/build/lib/commands/element.js.map +1 -0
  90. package/build/lib/commands/enum.d.ts +105 -0
  91. package/build/lib/commands/enum.d.ts.map +1 -0
  92. package/build/lib/commands/enum.js +113 -0
  93. package/build/lib/commands/enum.js.map +1 -0
  94. package/build/lib/commands/execute.d.ts +33 -0
  95. package/build/lib/commands/execute.d.ts.map +1 -0
  96. package/build/lib/commands/execute.js +142 -0
  97. package/build/lib/commands/execute.js.map +1 -0
  98. package/build/lib/commands/file-movement.d.ts +90 -0
  99. package/build/lib/commands/file-movement.d.ts.map +1 -0
  100. package/build/lib/commands/file-movement.js +477 -0
  101. package/build/lib/commands/file-movement.js.map +1 -0
  102. package/build/lib/commands/find.d.ts +21 -0
  103. package/build/lib/commands/find.d.ts.map +1 -0
  104. package/build/lib/commands/find.js +199 -0
  105. package/build/lib/commands/find.js.map +1 -0
  106. package/build/lib/commands/general.d.ts +137 -0
  107. package/build/lib/commands/general.d.ts.map +1 -0
  108. package/build/lib/commands/general.js +270 -0
  109. package/build/lib/commands/general.js.map +1 -0
  110. package/build/lib/commands/geolocation.d.ts +57 -0
  111. package/build/lib/commands/geolocation.d.ts.map +1 -0
  112. package/build/lib/commands/geolocation.js +58 -0
  113. package/build/lib/commands/geolocation.js.map +1 -0
  114. package/build/lib/commands/gesture.d.ts +283 -0
  115. package/build/lib/commands/gesture.d.ts.map +1 -0
  116. package/build/lib/commands/gesture.js +565 -0
  117. package/build/lib/commands/gesture.js.map +1 -0
  118. package/build/lib/commands/hid-event.d.ts +2773 -0
  119. package/build/lib/commands/hid-event.d.ts.map +1 -0
  120. package/build/lib/commands/hid-event.js +1633 -0
  121. package/build/lib/commands/hid-event.js.map +1 -0
  122. package/build/lib/commands/increase-contrast.d.ts +24 -0
  123. package/build/lib/commands/increase-contrast.d.ts.map +1 -0
  124. package/build/lib/commands/increase-contrast.js +49 -0
  125. package/build/lib/commands/increase-contrast.js.map +1 -0
  126. package/build/lib/commands/iohid.d.ts +1372 -0
  127. package/build/lib/commands/iohid.d.ts.map +1 -0
  128. package/build/lib/commands/iohid.js +63 -0
  129. package/build/lib/commands/iohid.js.map +1 -0
  130. package/build/lib/commands/keyboard.d.ts +32 -0
  131. package/build/lib/commands/keyboard.d.ts.map +1 -0
  132. package/build/lib/commands/keyboard.js +67 -0
  133. package/build/lib/commands/keyboard.js.map +1 -0
  134. package/build/lib/commands/keychains.d.ts +10 -0
  135. package/build/lib/commands/keychains.d.ts.map +1 -0
  136. package/build/lib/commands/keychains.js +22 -0
  137. package/build/lib/commands/keychains.js.map +1 -0
  138. package/build/lib/commands/localization.d.ts +17 -0
  139. package/build/lib/commands/localization.d.ts.map +1 -0
  140. package/build/lib/commands/localization.js +34 -0
  141. package/build/lib/commands/localization.js.map +1 -0
  142. package/build/lib/commands/location.d.ts +40 -0
  143. package/build/lib/commands/location.d.ts.map +1 -0
  144. package/build/lib/commands/location.js +121 -0
  145. package/build/lib/commands/location.js.map +1 -0
  146. package/build/lib/commands/lock.d.ts +23 -0
  147. package/build/lib/commands/lock.d.ts.map +1 -0
  148. package/build/lib/commands/lock.js +49 -0
  149. package/build/lib/commands/lock.js.map +1 -0
  150. package/build/lib/commands/log.d.ts +68 -0
  151. package/build/lib/commands/log.d.ts.map +1 -0
  152. package/build/lib/commands/log.js +287 -0
  153. package/build/lib/commands/log.js.map +1 -0
  154. package/build/lib/commands/memory.d.ts +11 -0
  155. package/build/lib/commands/memory.d.ts.map +1 -0
  156. package/build/lib/commands/memory.js +49 -0
  157. package/build/lib/commands/memory.js.map +1 -0
  158. package/build/lib/commands/navigation.d.ts +44 -0
  159. package/build/lib/commands/navigation.d.ts.map +1 -0
  160. package/build/lib/commands/navigation.js +121 -0
  161. package/build/lib/commands/navigation.js.map +1 -0
  162. package/build/lib/commands/notifications.d.ts +28 -0
  163. package/build/lib/commands/notifications.d.ts.map +1 -0
  164. package/build/lib/commands/notifications.js +64 -0
  165. package/build/lib/commands/notifications.js.map +1 -0
  166. package/build/lib/commands/pasteboard.d.ts +23 -0
  167. package/build/lib/commands/pasteboard.d.ts.map +1 -0
  168. package/build/lib/commands/pasteboard.js +43 -0
  169. package/build/lib/commands/pasteboard.js.map +1 -0
  170. package/build/lib/commands/pcap.d.ts +54 -0
  171. package/build/lib/commands/pcap.d.ts.map +1 -0
  172. package/build/lib/commands/pcap.js +149 -0
  173. package/build/lib/commands/pcap.js.map +1 -0
  174. package/build/lib/commands/performance.d.ts +85 -0
  175. package/build/lib/commands/performance.d.ts.map +1 -0
  176. package/build/lib/commands/performance.js +331 -0
  177. package/build/lib/commands/performance.js.map +1 -0
  178. package/build/lib/commands/permissions.d.ts +36 -0
  179. package/build/lib/commands/permissions.d.ts.map +1 -0
  180. package/build/lib/commands/permissions.js +80 -0
  181. package/build/lib/commands/permissions.js.map +1 -0
  182. package/build/lib/commands/proxy-helper.d.ts +15 -0
  183. package/build/lib/commands/proxy-helper.d.ts.map +1 -0
  184. package/build/lib/commands/proxy-helper.js +117 -0
  185. package/build/lib/commands/proxy-helper.js.map +1 -0
  186. package/build/lib/commands/record-audio.d.ts +69 -0
  187. package/build/lib/commands/record-audio.d.ts.map +1 -0
  188. package/build/lib/commands/record-audio.js +228 -0
  189. package/build/lib/commands/record-audio.js.map +1 -0
  190. package/build/lib/commands/recordscreen.d.ts +89 -0
  191. package/build/lib/commands/recordscreen.d.ts.map +1 -0
  192. package/build/lib/commands/recordscreen.js +326 -0
  193. package/build/lib/commands/recordscreen.js.map +1 -0
  194. package/build/lib/commands/screenshots.d.ts +16 -0
  195. package/build/lib/commands/screenshots.d.ts.map +1 -0
  196. package/build/lib/commands/screenshots.js +129 -0
  197. package/build/lib/commands/screenshots.js.map +1 -0
  198. package/build/lib/commands/simctl.d.ts +27 -0
  199. package/build/lib/commands/simctl.d.ts.map +1 -0
  200. package/build/lib/commands/simctl.js +65 -0
  201. package/build/lib/commands/simctl.js.map +1 -0
  202. package/build/lib/commands/source.d.ts +16 -0
  203. package/build/lib/commands/source.d.ts.map +1 -0
  204. package/build/lib/commands/source.js +128 -0
  205. package/build/lib/commands/source.js.map +1 -0
  206. package/build/lib/commands/timeouts.d.ts +53 -0
  207. package/build/lib/commands/timeouts.d.ts.map +1 -0
  208. package/build/lib/commands/timeouts.js +71 -0
  209. package/build/lib/commands/timeouts.js.map +1 -0
  210. package/build/lib/commands/types.d.ts +539 -0
  211. package/build/lib/commands/types.d.ts.map +1 -0
  212. package/build/lib/commands/types.js +3 -0
  213. package/build/lib/commands/types.js.map +1 -0
  214. package/build/lib/commands/web.d.ts +297 -0
  215. package/build/lib/commands/web.d.ts.map +1 -0
  216. package/build/lib/commands/web.js +1029 -0
  217. package/build/lib/commands/web.js.map +1 -0
  218. package/build/lib/commands/xctest-record-screen.d.ts +92 -0
  219. package/build/lib/commands/xctest-record-screen.d.ts.map +1 -0
  220. package/build/lib/commands/xctest-record-screen.js +193 -0
  221. package/build/lib/commands/xctest-record-screen.js.map +1 -0
  222. package/build/lib/commands/xctest.d.ts +71 -0
  223. package/build/lib/commands/xctest.d.ts.map +1 -0
  224. package/build/lib/commands/xctest.js +257 -0
  225. package/build/lib/commands/xctest.js.map +1 -0
  226. package/build/lib/css-converter.d.ts +10 -0
  227. package/build/lib/css-converter.d.ts.map +1 -0
  228. package/build/lib/css-converter.js +258 -0
  229. package/build/lib/css-converter.js.map +1 -0
  230. package/build/lib/desired-caps.d.ts +506 -0
  231. package/build/lib/desired-caps.d.ts.map +1 -0
  232. package/build/lib/desired-caps.js +400 -0
  233. package/build/lib/desired-caps.js.map +1 -0
  234. package/build/lib/device-connections-factory.d.ts +13 -0
  235. package/build/lib/device-connections-factory.d.ts.map +1 -0
  236. package/build/lib/device-connections-factory.js +244 -0
  237. package/build/lib/device-connections-factory.js.map +1 -0
  238. package/build/lib/device-log/helpers.d.ts +10 -0
  239. package/build/lib/device-log/helpers.d.ts.map +1 -0
  240. package/build/lib/device-log/helpers.js +37 -0
  241. package/build/lib/device-log/helpers.js.map +1 -0
  242. package/build/lib/device-log/ios-crash-log.d.ts +34 -0
  243. package/build/lib/device-log/ios-crash-log.d.ts.map +1 -0
  244. package/build/lib/device-log/ios-crash-log.js +141 -0
  245. package/build/lib/device-log/ios-crash-log.js.map +1 -0
  246. package/build/lib/device-log/ios-device-log.d.ts +19 -0
  247. package/build/lib/device-log/ios-device-log.d.ts.map +1 -0
  248. package/build/lib/device-log/ios-device-log.js +42 -0
  249. package/build/lib/device-log/ios-device-log.js.map +1 -0
  250. package/build/lib/device-log/ios-log.d.ts +24 -0
  251. package/build/lib/device-log/ios-log.d.ts.map +1 -0
  252. package/build/lib/device-log/ios-log.js +50 -0
  253. package/build/lib/device-log/ios-log.js.map +1 -0
  254. package/build/lib/device-log/ios-performance-log.d.ts +18 -0
  255. package/build/lib/device-log/ios-performance-log.d.ts.map +1 -0
  256. package/build/lib/device-log/ios-performance-log.js +43 -0
  257. package/build/lib/device-log/ios-performance-log.js.map +1 -0
  258. package/build/lib/device-log/ios-simulator-log.d.ts +38 -0
  259. package/build/lib/device-log/ios-simulator-log.d.ts.map +1 -0
  260. package/build/lib/device-log/ios-simulator-log.js +184 -0
  261. package/build/lib/device-log/ios-simulator-log.js.map +1 -0
  262. package/build/lib/device-log/line-consuming-log.d.ts +9 -0
  263. package/build/lib/device-log/line-consuming-log.d.ts.map +1 -0
  264. package/build/lib/device-log/line-consuming-log.js +16 -0
  265. package/build/lib/device-log/line-consuming-log.js.map +1 -0
  266. package/build/lib/device-log/safari-console-log.d.ts +67 -0
  267. package/build/lib/device-log/safari-console-log.d.ts.map +1 -0
  268. package/build/lib/device-log/safari-console-log.js +81 -0
  269. package/build/lib/device-log/safari-console-log.js.map +1 -0
  270. package/build/lib/device-log/safari-network-log.d.ts +75 -0
  271. package/build/lib/device-log/safari-network-log.d.ts.map +1 -0
  272. package/build/lib/device-log/safari-network-log.js +47 -0
  273. package/build/lib/device-log/safari-network-log.js.map +1 -0
  274. package/build/lib/doctor/checks.d.ts +3 -0
  275. package/build/lib/doctor/checks.d.ts.map +1 -0
  276. package/build/lib/doctor/checks.js +39 -0
  277. package/build/lib/doctor/checks.js.map +1 -0
  278. package/build/lib/doctor/optional-checks.d.ts +46 -0
  279. package/build/lib/doctor/optional-checks.d.ts.map +1 -0
  280. package/build/lib/doctor/optional-checks.js +129 -0
  281. package/build/lib/doctor/optional-checks.js.map +1 -0
  282. package/build/lib/doctor/required-checks.d.ts +42 -0
  283. package/build/lib/doctor/required-checks.d.ts.map +1 -0
  284. package/build/lib/doctor/required-checks.js +94 -0
  285. package/build/lib/doctor/required-checks.js.map +1 -0
  286. package/build/lib/doctor/utils.d.ts +8 -0
  287. package/build/lib/doctor/utils.d.ts.map +1 -0
  288. package/build/lib/doctor/utils.js +21 -0
  289. package/build/lib/doctor/utils.js.map +1 -0
  290. package/build/lib/driver.d.ts +2429 -0
  291. package/build/lib/driver.d.ts.map +1 -0
  292. package/build/lib/driver.js +1967 -0
  293. package/build/lib/driver.js.map +1 -0
  294. package/build/lib/execute-method-map.d.ts +552 -0
  295. package/build/lib/execute-method-map.d.ts.map +1 -0
  296. package/build/lib/execute-method-map.js +586 -0
  297. package/build/lib/execute-method-map.js.map +1 -0
  298. package/build/lib/ios-fs-helpers.d.ts +75 -0
  299. package/build/lib/ios-fs-helpers.d.ts.map +1 -0
  300. package/build/lib/ios-fs-helpers.js +370 -0
  301. package/build/lib/ios-fs-helpers.js.map +1 -0
  302. package/build/lib/ios-generic-simulators.d.ts +6 -0
  303. package/build/lib/ios-generic-simulators.d.ts.map +1 -0
  304. package/build/lib/ios-generic-simulators.js +14 -0
  305. package/build/lib/ios-generic-simulators.js.map +1 -0
  306. package/build/lib/logger.d.ts +3 -0
  307. package/build/lib/logger.d.ts.map +1 -0
  308. package/build/lib/logger.js +6 -0
  309. package/build/lib/logger.js.map +1 -0
  310. package/build/lib/method-map.d.ts +229 -0
  311. package/build/lib/method-map.d.ts.map +1 -0
  312. package/build/lib/method-map.js +200 -0
  313. package/build/lib/method-map.js.map +1 -0
  314. package/build/lib/real-device-clients/base-device-client.d.ts +22 -0
  315. package/build/lib/real-device-clients/base-device-client.d.ts.map +1 -0
  316. package/build/lib/real-device-clients/base-device-client.js +14 -0
  317. package/build/lib/real-device-clients/base-device-client.js.map +1 -0
  318. package/build/lib/real-device-clients/py-ios-device-client.d.ts +21 -0
  319. package/build/lib/real-device-clients/py-ios-device-client.d.ts.map +1 -0
  320. package/build/lib/real-device-clients/py-ios-device-client.js +125 -0
  321. package/build/lib/real-device-clients/py-ios-device-client.js.map +1 -0
  322. package/build/lib/real-device-management.d.ts +53 -0
  323. package/build/lib/real-device-management.d.ts.map +1 -0
  324. package/build/lib/real-device-management.js +128 -0
  325. package/build/lib/real-device-management.js.map +1 -0
  326. package/build/lib/real-device.d.ts +112 -0
  327. package/build/lib/real-device.d.ts.map +1 -0
  328. package/build/lib/real-device.js +352 -0
  329. package/build/lib/real-device.js.map +1 -0
  330. package/build/lib/simulator-management.d.ts +96 -0
  331. package/build/lib/simulator-management.d.ts.map +1 -0
  332. package/build/lib/simulator-management.js +278 -0
  333. package/build/lib/simulator-management.js.map +1 -0
  334. package/build/lib/stubs.d.ts +3 -0
  335. package/build/lib/stubs.d.ts.map +1 -0
  336. package/build/lib/stubs.js +3 -0
  337. package/build/lib/stubs.js.map +1 -0
  338. package/build/lib/types.d.ts +31 -0
  339. package/build/lib/types.d.ts.map +1 -0
  340. package/build/lib/types.js +3 -0
  341. package/build/lib/types.js.map +1 -0
  342. package/build/lib/utils.d.ts +191 -0
  343. package/build/lib/utils.d.ts.map +1 -0
  344. package/build/lib/utils.js +549 -0
  345. package/build/lib/utils.js.map +1 -0
  346. package/build/lib/xcrun.d.ts +3 -0
  347. package/build/lib/xcrun.d.ts.map +1 -0
  348. package/build/lib/xcrun.js +17 -0
  349. package/build/lib/xcrun.js.map +1 -0
  350. package/index.js +7 -0
  351. package/lib/app-infos-cache.js +187 -0
  352. package/lib/app-utils.js +710 -0
  353. package/lib/commands/active-app-info.js +12 -0
  354. package/lib/commands/advanced-battery-types.ts +454 -0
  355. package/lib/commands/alert.js +88 -0
  356. package/lib/commands/app-management.js +346 -0
  357. package/lib/commands/app-strings.js +30 -0
  358. package/lib/commands/appearance.js +71 -0
  359. package/lib/commands/audit.js +31 -0
  360. package/lib/commands/battery.js +45 -0
  361. package/lib/commands/bidi/constants.ts +6 -0
  362. package/lib/commands/bidi/models.ts +55 -0
  363. package/lib/commands/bidi/types.ts +31 -0
  364. package/lib/commands/biometric.js +53 -0
  365. package/lib/commands/certificate.js +497 -0
  366. package/lib/commands/clipboard.js +35 -0
  367. package/lib/commands/condition.js +155 -0
  368. package/lib/commands/content-size.js +68 -0
  369. package/lib/commands/context.js +705 -0
  370. package/lib/commands/deviceInfo.js +27 -0
  371. package/lib/commands/element.js +423 -0
  372. package/lib/commands/enum.ts +108 -0
  373. package/lib/commands/execute.js +153 -0
  374. package/lib/commands/file-movement.js +510 -0
  375. package/lib/commands/find.js +205 -0
  376. package/lib/commands/general.js +278 -0
  377. package/lib/commands/geolocation.js +56 -0
  378. package/lib/commands/gesture.js +596 -0
  379. package/lib/commands/hid-event.ts +1634 -0
  380. package/lib/commands/increase-contrast.js +50 -0
  381. package/lib/commands/iohid.js +64 -0
  382. package/lib/commands/keyboard.js +62 -0
  383. package/lib/commands/keychains.js +18 -0
  384. package/lib/commands/localization.js +30 -0
  385. package/lib/commands/location.js +131 -0
  386. package/lib/commands/lock.js +46 -0
  387. package/lib/commands/log.js +327 -0
  388. package/lib/commands/memory.js +51 -0
  389. package/lib/commands/navigation.js +125 -0
  390. package/lib/commands/notifications.js +66 -0
  391. package/lib/commands/pasteboard.js +42 -0
  392. package/lib/commands/pcap.js +168 -0
  393. package/lib/commands/performance.js +392 -0
  394. package/lib/commands/permissions.js +85 -0
  395. package/lib/commands/proxy-helper.js +122 -0
  396. package/lib/commands/record-audio.js +264 -0
  397. package/lib/commands/recordscreen.js +391 -0
  398. package/lib/commands/screenshots.js +137 -0
  399. package/lib/commands/simctl.js +71 -0
  400. package/lib/commands/source.js +131 -0
  401. package/lib/commands/timeouts.js +68 -0
  402. package/lib/commands/types.ts +648 -0
  403. package/lib/commands/web.js +1113 -0
  404. package/lib/commands/xctest-record-screen.js +204 -0
  405. package/lib/commands/xctest.js +285 -0
  406. package/lib/css-converter.js +311 -0
  407. package/lib/desired-caps.js +396 -0
  408. package/lib/device-connections-factory.js +269 -0
  409. package/lib/device-log/helpers.ts +40 -0
  410. package/lib/device-log/ios-crash-log.ts +166 -0
  411. package/lib/device-log/ios-device-log.ts +51 -0
  412. package/lib/device-log/ios-log.ts +70 -0
  413. package/lib/device-log/ios-performance-log.ts +50 -0
  414. package/lib/device-log/ios-simulator-log.ts +202 -0
  415. package/lib/device-log/line-consuming-log.ts +16 -0
  416. package/lib/device-log/safari-console-log.ts +117 -0
  417. package/lib/device-log/safari-network-log.ts +120 -0
  418. package/lib/doctor/checks.ts +3 -0
  419. package/lib/doctor/optional-checks.ts +173 -0
  420. package/lib/doctor/required-checks.ts +120 -0
  421. package/lib/doctor/utils.ts +18 -0
  422. package/lib/driver.js +2316 -0
  423. package/lib/execute-method-map.ts +585 -0
  424. package/lib/ios-fs-helpers.js +355 -0
  425. package/lib/ios-generic-simulators.js +11 -0
  426. package/lib/logger.js +5 -0
  427. package/lib/method-map.js +196 -0
  428. package/lib/real-device-clients/base-device-client.ts +34 -0
  429. package/lib/real-device-clients/py-ios-device-client.ts +149 -0
  430. package/lib/real-device-management.js +133 -0
  431. package/lib/real-device.js +347 -0
  432. package/lib/simulator-management.js +324 -0
  433. package/lib/stubs.ts +3 -0
  434. package/lib/types.ts +33 -0
  435. package/lib/utils.js +551 -0
  436. package/lib/xcrun.js +16 -0
  437. package/package.json +175 -0
  438. package/scripts/build-docs.js +56 -0
  439. package/scripts/build-wda.js +42 -0
  440. package/scripts/download-wda-sim.mjs +68 -0
  441. package/scripts/image-mounter.mjs +239 -0
  442. package/scripts/open-wda.mjs +15 -0
  443. package/scripts/tunnel-creation.mjs +359 -0
  444. package/scripts/utils.js +16 -0
@@ -0,0 +1,149 @@
1
+ import {exec, SubProcess} from 'teen_process';
2
+ import {fs, util, tempDir} from 'appium/support';
3
+ import path from 'path';
4
+ import { BaseDeviceClient } from './base-device-client';
5
+ import type { BaseDeviceClientOptions, InstallProfileArgs } from './base-device-client';
6
+ import type { TeenProcessExecResult } from 'teen_process';
7
+ import type { CertificateList } from '../commands/types';
8
+
9
+ // https://github.com/YueChen-C/py-ios-device
10
+
11
+ const BINARY_NAME = 'pyidevice';
12
+ const CRASH_REPORT_EXT = '.ips';
13
+
14
+ export interface PyideviceOptions extends BaseDeviceClientOptions {
15
+ udid: string;
16
+ }
17
+
18
+ interface ExecuteOptions {
19
+ cwd?: string;
20
+ format?: string | null;
21
+ logStdout?: boolean;
22
+ asynchronous?: boolean;
23
+ }
24
+
25
+ export class Pyidevice extends BaseDeviceClient {
26
+ private readonly _udid: string;
27
+ private _binaryPath: string | null;
28
+
29
+ constructor(opts: PyideviceOptions) {
30
+ super({log: opts.log});
31
+ this._udid = opts.udid;
32
+ this._binaryPath = null;
33
+ }
34
+
35
+ override async assertExists(isStrict = true): Promise<boolean> {
36
+ if (this._binaryPath) {
37
+ return true;
38
+ }
39
+
40
+ try {
41
+ this._binaryPath = await fs.which(BINARY_NAME);
42
+ return true;
43
+ } catch {
44
+ if (isStrict) {
45
+ throw new Error(
46
+ `${BINARY_NAME} binary cannot be found in PATH. ` +
47
+ `Please make sure it is installed. Visit https://github.com/YueChen-C/py-ios-device for ` +
48
+ `more details.`,
49
+ );
50
+ }
51
+ return false;
52
+ }
53
+ }
54
+
55
+ override async listProfiles(): Promise<CertificateList> {
56
+ const {stdout} = await this.execute(['profiles', 'list']) as TeenProcessExecResult<string>;
57
+ return JSON.parse(stdout);
58
+ }
59
+
60
+ override async installProfile(args: InstallProfileArgs): Promise<void> {
61
+ const {profilePath, payload} = args;
62
+ if (!profilePath && !payload) {
63
+ throw new Error('Either the full path to the profile or its payload must be provided');
64
+ }
65
+
66
+ let tmpRoot: string | undefined;
67
+ let srcPath = profilePath;
68
+ try {
69
+ if (!srcPath) {
70
+ tmpRoot = await tempDir.openDir();
71
+ srcPath = path.join(tmpRoot, 'cert.pem');
72
+ if (Buffer.isBuffer(payload)) {
73
+ await fs.writeFile(srcPath, payload);
74
+ } else {
75
+ await fs.writeFile(srcPath, payload as string, 'utf8');
76
+ }
77
+ }
78
+ await this.execute(['profiles', 'install', '--path', srcPath], {
79
+ logStdout: true,
80
+ });
81
+ } finally {
82
+ if (tmpRoot) {
83
+ await fs.rimraf(tmpRoot);
84
+ }
85
+ }
86
+ }
87
+
88
+ override async removeProfile(name: string): Promise<string> {
89
+ return (
90
+ await this.execute(['profiles', 'remove', '--name', name], {logStdout: true}) as TeenProcessExecResult<string>
91
+ ).stdout;
92
+ }
93
+
94
+ override async listCrashes(): Promise<string[]> {
95
+ const {stdout} = await this.execute(['crash', 'list']) as TeenProcessExecResult<string>;
96
+ // Example output:
97
+ // ['.', '..', 'SiriSearchFeedback-2023-12-06-144043.ips', '
98
+ // SiriSearchFeedback-2024-05-22-194219.ips', 'JetsamEvent-2024-05-23-225056.ips',
99
+ // 'JetsamEvent-2023-09-18-090920.ips', 'JetsamEvent-2024-05-16-054529.ips',
100
+ // 'Assistant']
101
+ return JSON.parse(stdout.replace(/'/g, '"'))
102
+ .filter((x: string) => x.endsWith(CRASH_REPORT_EXT));
103
+ }
104
+
105
+ override async exportCrash(name: string, dstFolder: string): Promise<void> {
106
+ await this.execute(['crash', 'export', '--name', name], {
107
+ logStdout: true,
108
+ // The tool exports crash reports to the current working dir
109
+ cwd: dstFolder,
110
+ });
111
+ }
112
+
113
+ override async collectPcap(dstFile: string): Promise<SubProcess> {
114
+ return await this.execute(['pcapd', dstFile], {
115
+ format: null,
116
+ asynchronous: true,
117
+ }) as SubProcess;
118
+ }
119
+
120
+ private async execute(
121
+ args: string[],
122
+ opts: ExecuteOptions = {}
123
+ ): Promise<TeenProcessExecResult<string> | SubProcess> {
124
+ await this.assertExists();
125
+ const {cwd, format = 'json', logStdout = false, asynchronous = false} = opts;
126
+
127
+ const finalArgs = [...args, '--udid', this._udid, '--network'];
128
+ if (format) {
129
+ finalArgs.push('--format', format);
130
+ }
131
+ const binaryPath = this._binaryPath as string;
132
+ const cmdStr = util.quote([binaryPath, ...finalArgs]);
133
+ this.log.debug(`Executing ${cmdStr}`);
134
+ try {
135
+ if (asynchronous) {
136
+ const result = new SubProcess(binaryPath, finalArgs, {cwd});
137
+ await result.start(0);
138
+ return result;
139
+ }
140
+ const result = await exec(binaryPath, finalArgs, {cwd});
141
+ if (logStdout) {
142
+ this.log.debug(`Command output: ${result.stdout}`);
143
+ }
144
+ return result;
145
+ } catch (e) {
146
+ throw new Error(`'${cmdStr}' failed. Original error: ${e.stderr || e.stdout || e.message}`);
147
+ }
148
+ }
149
+ }
@@ -0,0 +1,133 @@
1
+ import _ from 'lodash';
2
+ import {buildSafariPreferences} from './app-utils';
3
+ import { getConnectedDevices } from './real-device';
4
+
5
+ const DEFAULT_APP_INSTALLATION_TIMEOUT_MS = 8 * 60 * 1000;
6
+
7
+ /**
8
+ * @typedef {Object} InstallOptions
9
+ *
10
+ * @property {boolean} [skipUninstall] Whether to skip app uninstall before installing it
11
+ * @property {number} [timeout=480000] App install timeout
12
+ * @property {boolean} [shouldEnforceUninstall] Whether to enforce the app uninstallation. e.g. fullReset, or enforceAppInstall is true
13
+ */
14
+
15
+ /**
16
+ * @this {import('./driver').XCUITestDriver}
17
+ * @param {string} [app] The app to the path
18
+ * @param {string} [bundleId] The bundle id to ensure it is already installed and uninstall it
19
+ * @param {InstallOptions} [opts={}]
20
+ */
21
+ export async function installToRealDevice(app, bundleId, opts = {}) {
22
+ const device = /** @type {RealDevice} */ (this.device);
23
+
24
+ if (!device.udid || !app || !bundleId) {
25
+ this.log.debug('No device id, app or bundle id, not installing to real device.');
26
+ return;
27
+ }
28
+
29
+ const {
30
+ skipUninstall,
31
+ timeout = DEFAULT_APP_INSTALLATION_TIMEOUT_MS,
32
+ } = opts;
33
+
34
+ if (!skipUninstall) {
35
+ this.log.info(`Reset requested. Removing app with id '${bundleId}' from the device`);
36
+ await device.remove(bundleId);
37
+ }
38
+ this.log.debug(`Installing '${app}' on the device with UUID '${device.udid}'`);
39
+
40
+ try {
41
+ await device.install(app, bundleId, {
42
+ timeoutMs: timeout,
43
+ });
44
+ this.log.debug('The app has been installed successfully.');
45
+ } catch (e) {
46
+ // Want to clarify the device's application installation state in this situation.
47
+
48
+ if (!skipUninstall || !e.message.includes('MismatchedApplicationIdentifierEntitlement')) {
49
+ // Other error cases that could not be recoverable by here.
50
+ // Exact error will be in the log.
51
+
52
+ // We cannot recover 'ApplicationVerificationFailed' situation since this reason is clearly the app's provisioning profile was invalid.
53
+ // [XCUITest] Error installing app '/path/to.app': Unexpected data: {"Error":"ApplicationVerificationFailed","ErrorDetail":-402620395,"ErrorDescription":"Failed to verify code signature of /path/to.app : 0xe8008015 (A valid provisioning profile for this executable was not found.)"}
54
+ throw e;
55
+ }
56
+
57
+ // If the error was by below error case, we could recover the situation
58
+ // by uninstalling the device's app bundle id explicitly regard less the app exists on the device or not (e.g. offload app).
59
+ // [XCUITest] Error installing app '/path/to.app': Unexpected data: {"Error":"MismatchedApplicationIdentifierEntitlement","ErrorDescription":"Upgrade's application-identifier entitlement string (TEAM_ID.com.kazucocoa.example) does not match installed application's application-identifier string (ANOTHER_TEAM_ID.com.kazucocoa.example); rejecting upgrade."}
60
+ this.log.info(`The application identified by '${bundleId}' cannot be installed because it might ` +
61
+ `be already cached on the device, probably with a different signature. ` +
62
+ `Will try to remove it and install a new copy. Original error: ${e.message}`);
63
+ await device.remove(bundleId);
64
+ await device.install(app, bundleId, {
65
+ timeoutMs: timeout,
66
+ });
67
+ this.log.debug('The app has been installed after one retrial.');
68
+ }
69
+ }
70
+
71
+ /**
72
+ * @this {import('./driver').XCUITestDriver}
73
+ * @returns {Promise<void>}
74
+ */
75
+ export async function runRealDeviceReset() {
76
+ if (!this.opts.noReset || this.opts.fullReset) {
77
+ this.log.debug('Reset: running ios real device reset flow');
78
+ if (!this.opts.noReset) {
79
+ await /** @type {RealDevice} */ (this.device).reset(this.opts);
80
+ }
81
+ } else {
82
+ this.log.debug('Reset: fullReset not set. Leaving as is');
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Configures Safari startup options based on the given session capabilities.
88
+ *
89
+ * !!! This method mutates driver options.
90
+ *
91
+ * @this {import('./driver').XCUITestDriver}
92
+ * @return {boolean} true if process arguments have been modified
93
+ */
94
+ export function applySafariStartupArgs() {
95
+ const prefs = buildSafariPreferences(this.opts);
96
+ if (_.isEmpty(prefs)) {
97
+ return false;
98
+ }
99
+
100
+ const args = _.toPairs(prefs)
101
+ .flatMap(([key, value]) => [_.startsWith(key, '-') ? key : `-${key}`, String(value)]);
102
+ this.log.debug(`Generated Safari command line arguments: ${args.join(' ')}`);
103
+ if (_.isPlainObject(this.opts.processArguments)) {
104
+ this.opts.processArguments.args = [...(this.opts.processArguments.args ?? []), ...args];
105
+ } else {
106
+ this.opts.processArguments = {args};
107
+ }
108
+ return true;
109
+ }
110
+
111
+ /**
112
+ * @this {XCUITestDriver}
113
+ * @returns {Promise<string>}
114
+ */
115
+ export async function detectUdid() {
116
+ this.log.debug('Auto-detecting real device udid...');
117
+ const udids = await getConnectedDevices();
118
+ if (_.isEmpty(udids)) {
119
+ throw new Error('No real devices are connected to the host');
120
+ }
121
+ const udid = udids[udids.length - 1];
122
+ if (udids.length > 1) {
123
+ this.log.info(`Multiple devices found: ${udids.join(', ')}`);
124
+ this.log.info(`Choosing '${udid}'. Consider settings the 'udid' capability if another device must be selected`);
125
+ }
126
+ this.log.debug(`Detected real device udid: '${udid}'`);
127
+ return udid;
128
+ }
129
+
130
+ /**
131
+ * @typedef {import('./real-device').RealDevice} RealDevice}
132
+ * @typedef {import('./driver').XCUITestDriver} XCUITestDriver
133
+ */
@@ -0,0 +1,347 @@
1
+ import {timing, util, fs} from 'appium/support';
2
+ import path from 'path';
3
+ import {services, utilities, INSTRUMENT_CHANNEL} from 'appium-ios-device';
4
+ import B, {TimeoutError} from 'bluebird';
5
+ import defaultLogger from './logger';
6
+ import _ from 'lodash';
7
+ import {SAFARI_BUNDLE_ID} from './app-utils';
8
+ import {pushFile, pushFolder, IO_TIMEOUT_MS} from './ios-fs-helpers';
9
+ import { Devicectl } from 'node-devicectl';
10
+
11
+ const APPLICATION_INSTALLED_NOTIFICATION = 'com.apple.mobile.application_installed';
12
+ const APPLICATION_NOTIFICATION_TIMEOUT_MS = 30 * 1000;
13
+ const INSTALLATION_STAGING_DIR = 'PublicStaging';
14
+
15
+ /**
16
+ * @returns {Promise<string[]>}
17
+ */
18
+ export async function getConnectedDevices() {
19
+ if (['yes', 'true', '1'].includes(_.toLower(process.env.APPIUM_XCUITEST_PREFER_DEVICECTL))) {
20
+ return (await new Devicectl('').listDevices())
21
+ .map(({hardwareProperties}) => hardwareProperties?.udid)
22
+ .filter(Boolean);
23
+ }
24
+ return await utilities.getConnectedDevices();
25
+ }
26
+
27
+ /**
28
+ * @typedef {Object} InstallOptions
29
+ * @param {number} [timeoutMs=240000] Application installation timeout in milliseconds
30
+ */
31
+
32
+ /**
33
+ * @typedef {Object} InstallOrUpgradeOptions
34
+ * @property {number} timeout Install/upgrade timeout in milliseconds
35
+ * @property {boolean} isUpgrade Whether it is an app upgrade or a new install
36
+ */
37
+
38
+ export class RealDevice {
39
+ /**
40
+ * @param {string} udid
41
+ * @param {import('@appium/types').AppiumLogger} [logger]
42
+ */
43
+ constructor(udid, logger) {
44
+ this.udid = udid;
45
+ this._log = logger ?? defaultLogger;
46
+ this.devicectl = new Devicectl(this.udid);
47
+ }
48
+
49
+ /**
50
+ * @returns {import('@appium/types').AppiumLogger}
51
+ */
52
+ get log() {
53
+ return this._log;
54
+ }
55
+
56
+ /**
57
+ * @param {string} bundleId
58
+ */
59
+ async remove(bundleId) {
60
+ const service = await services.startInstallationProxyService(this.udid);
61
+ try {
62
+ await service.uninstallApplication(bundleId);
63
+ } finally {
64
+ service.close();
65
+ }
66
+ }
67
+
68
+ /**
69
+ * @param {string} bundleId
70
+ */
71
+ async removeApp(bundleId) {
72
+ await this.remove(bundleId);
73
+ }
74
+
75
+ /**
76
+ *
77
+ * @param {string} appPath
78
+ * @param {string} bundleId
79
+ * @param {InstallOptions} [opts={}]
80
+ */
81
+ async install(appPath, bundleId, opts = {}) {
82
+ const {
83
+ timeoutMs = IO_TIMEOUT_MS,
84
+ } = opts;
85
+ const timer = new timing.Timer().start();
86
+ const afcService = await services.startAfcService(this.udid);
87
+ try {
88
+ let bundlePathOnPhone;
89
+ if ((await fs.stat(appPath)).isFile()) {
90
+ // https://github.com/doronz88/pymobiledevice3/blob/6ff5001f5776e03b610363254e82d7fbcad4ef5f/pymobiledevice3/services/installation_proxy.py#L75
91
+ bundlePathOnPhone = `/${path.basename(appPath)}`;
92
+ await pushFile(afcService, appPath, bundlePathOnPhone, {
93
+ timeoutMs,
94
+ });
95
+ } else {
96
+ bundlePathOnPhone = `${INSTALLATION_STAGING_DIR}/${bundleId}`;
97
+ await pushFolder(afcService, appPath, bundlePathOnPhone, {
98
+ enableParallelPush: true,
99
+ timeoutMs,
100
+ });
101
+ }
102
+ await this.installOrUpgradeApplication(
103
+ bundlePathOnPhone,
104
+ {
105
+ timeout: Math.max(timeoutMs - timer.getDuration().asMilliSeconds, 60000),
106
+ isUpgrade: await this.isAppInstalled(bundleId),
107
+ }
108
+ );
109
+ } catch (err) {
110
+ this.log.debug(err.stack);
111
+ let errMessage = `Cannot install the ${bundleId} application`;
112
+ if (err instanceof TimeoutError) {
113
+ errMessage += `. Consider increasing the value of 'appPushTimeout' capability (the current value equals to ${timeoutMs}ms)`;
114
+ }
115
+ errMessage += `. Original error: ${err.message}`;
116
+ throw new Error(errMessage);
117
+ } finally {
118
+ afcService.close();
119
+ }
120
+ this.log.info(
121
+ `The installation of '${bundleId}' succeeded after ${timer.getDuration().asMilliSeconds.toFixed(0)}ms`
122
+ );
123
+ }
124
+
125
+ /**
126
+ * @param {string} bundlePathOnPhone
127
+ * @param {InstallOrUpgradeOptions} opts
128
+ */
129
+ async installOrUpgradeApplication(bundlePathOnPhone, {isUpgrade, timeout}) {
130
+ const notificationService = await services.startNotificationProxyService(this.udid);
131
+ const installationService = await services.startInstallationProxyService(this.udid);
132
+ const appInstalledNotification = new B((resolve) => {
133
+ notificationService.observeNotification(APPLICATION_INSTALLED_NOTIFICATION, {
134
+ notification: resolve,
135
+ });
136
+ });
137
+ const clientOptions = {PackageType: 'Developer'};
138
+ try {
139
+ if (isUpgrade) {
140
+ this.log.debug(
141
+ `An upgrade of the existing application is going to be performed. ` +
142
+ `Will timeout in ${timeout.toFixed(0)} ms`
143
+ );
144
+ await installationService.upgradeApplication(bundlePathOnPhone, clientOptions, timeout);
145
+ } else {
146
+ this.log.debug(
147
+ `A new application installation is going to be performed. ` +
148
+ `Will timeout in ${timeout.toFixed(0)} ms`
149
+ );
150
+ await installationService.installApplication(bundlePathOnPhone, clientOptions, timeout);
151
+ }
152
+ try {
153
+ await appInstalledNotification.timeout(
154
+ APPLICATION_NOTIFICATION_TIMEOUT_MS,
155
+ `Could not get the application installed notification within ` +
156
+ `${APPLICATION_NOTIFICATION_TIMEOUT_MS}ms but we will continue`,
157
+ );
158
+ } catch (e) {
159
+ this.log.warn(e.message);
160
+ }
161
+ } finally {
162
+ installationService.close();
163
+ notificationService.close();
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Alias for {@linkcode install}
169
+ * @param {string} appPath
170
+ * @param {string} bundleId
171
+ * @param {InstallOptions} [opts={}]
172
+ */
173
+ async installApp(appPath, bundleId, opts = {}) {
174
+ return await this.install(appPath, bundleId, opts);
175
+ }
176
+
177
+ /**
178
+ * Return an application object if test app has 'bundleid'.
179
+ * The target bundleid can be User and System apps.
180
+ *
181
+ * @param {string} bundleId The bundleId to ensure it is installed
182
+ * @return {Promise<boolean>} Returns True if the app is installed
183
+ * on the device under test.
184
+ */
185
+ async isAppInstalled(bundleId) {
186
+ return Boolean(await this.fetchAppInfo(bundleId));
187
+ }
188
+
189
+ /**
190
+ * Fetches various attributes, like bundle id, version, entitlements etc. of
191
+ * an installed application.
192
+ *
193
+ * @param {string} bundleId the bundle identifier of an app to check
194
+ * @param {string|string[]|undefined} returnAttributes If provided then
195
+ * only fetches the requested attributes of the app into the resulting object.
196
+ * Some apps may have too many attributes, so it makes sense to limit these
197
+ * by default if you don't need all of them.
198
+ * @returns {Promise<Object|undefined>} Either app info as an object or undefined
199
+ * if the app is not found.
200
+ */
201
+ async fetchAppInfo(bundleId, returnAttributes = ['CFBundleIdentifier', 'CFBundleVersion']) {
202
+ const service = await services.startInstallationProxyService(this.udid);
203
+ try {
204
+ return (
205
+ await service.lookupApplications({
206
+ bundleIds: bundleId,
207
+ // https://github.com/appium/appium/issues/18753
208
+ returnAttributes,
209
+ })
210
+ )[bundleId];
211
+ } finally {
212
+ service.close();
213
+ }
214
+ }
215
+
216
+ /**
217
+ * @param {string} bundleId
218
+ * @param {string} platformVersion
219
+ * @returns {Promise<boolean>}
220
+ */
221
+ async terminateApp(bundleId, platformVersion) {
222
+ let instrumentService;
223
+ let installProxyService;
224
+ try {
225
+ installProxyService = await services.startInstallationProxyService(this.udid);
226
+ const apps = await installProxyService.listApplications({
227
+ returnAttributes: ['CFBundleIdentifier', 'CFBundleExecutable']
228
+ });
229
+ if (!apps[bundleId]) {
230
+ this.log.info(`The bundle id '${bundleId}' did not exist`);
231
+ return false;
232
+ }
233
+ const executableName = apps[bundleId].CFBundleExecutable;
234
+ this.log.debug(`The executable name for the bundle id '${bundleId}' was '${executableName}'`);
235
+
236
+ // 'devicectl' has overhead (generally?) than the instrument service via appium-ios-device,
237
+ // so hre uses the 'devicectl' only for iOS 17+.
238
+ if (util.compareVersions(platformVersion, '>=', '17.0')) {
239
+ this.log.debug(`Calling devicectl to kill the process`);
240
+
241
+ const pids = (await this.devicectl.listProcesses())
242
+ .filter(({executable}) => executable.endsWith(`/${executableName}`))
243
+ .map(({processIdentifier}) => processIdentifier);
244
+ if (_.isEmpty(pids)) {
245
+ this.log.info(`The process of the bundle id '${bundleId}' was not running`);
246
+ return false;
247
+ }
248
+ await this.devicectl.sendSignalToProcess(pids[0], 2);
249
+ } else {
250
+ instrumentService = await services.startInstrumentService(this.udid);
251
+
252
+ // The result of "runningProcesses" includes `bundle_id` key in iOS 16+ (possibly a specific 16.x+)
253
+ // then here may not be necessary to find a process with `CFBundleExecutable`
254
+ // after dropping older iOS version support.
255
+ const processes = await instrumentService.callChannel(
256
+ INSTRUMENT_CHANNEL.DEVICE_INFO,
257
+ 'runningProcesses',
258
+ );
259
+ const process = processes.selector.find((process) => process.name === executableName);
260
+ if (!process) {
261
+ this.log.info(`The process of the bundle id '${bundleId}' was not running`);
262
+ return false;
263
+ }
264
+ await instrumentService.callChannel(
265
+ INSTRUMENT_CHANNEL.PROCESS_CONTROL,
266
+ 'killPid:',
267
+ `${process.pid}`,
268
+ );
269
+ }
270
+ } catch (err) {
271
+ this.log.warn(`Failed to kill '${bundleId}'. Original error: ${err.stderr || err.message}`);
272
+ return false;
273
+ } finally {
274
+ if (installProxyService) {
275
+ installProxyService.close();
276
+ }
277
+ if (instrumentService) {
278
+ instrumentService.close();
279
+ }
280
+ }
281
+ return true;
282
+ }
283
+
284
+ /**
285
+ * @param {string} bundleName The name of CFBundleName in Info.plist
286
+ *
287
+ * @returns {Promise<string[]>} A list of User level apps' bundle ids which has
288
+ * 'CFBundleName' attribute as 'bundleName'.
289
+ */
290
+ async getUserInstalledBundleIdsByBundleName(bundleName) {
291
+ const service = await services.startInstallationProxyService(this.udid);
292
+ try {
293
+ const applications = await service.listApplications({
294
+ applicationType: 'User', returnAttributes: ['CFBundleIdentifier', 'CFBundleName']
295
+ });
296
+ return _.reduce(
297
+ applications,
298
+ (acc, {CFBundleName}, key) => {
299
+ if (CFBundleName === bundleName) {
300
+ acc.push(key);
301
+ }
302
+ return acc;
303
+ },
304
+ /** @type {string[]} */ ([]),
305
+ );
306
+ } finally {
307
+ service.close();
308
+ }
309
+ }
310
+
311
+ /**
312
+ * @returns {Promise<string>}
313
+ */
314
+ async getPlatformVersion() {
315
+ return await utilities.getOSVersion(this.udid);
316
+ }
317
+
318
+ /**
319
+ * @param {import('./driver').XCUITestDriverOpts} opts
320
+ * @returns {Promise<void>}
321
+ */
322
+ async reset({bundleId, fullReset}) {
323
+ if (!bundleId || !fullReset || bundleId === SAFARI_BUNDLE_ID) {
324
+ // Safari cannot be removed as system app.
325
+ // Safari process handling will be managed by WDA
326
+ // with noReset, forceAppLaunch or shouldTerminateApp capabilities.
327
+ return;
328
+ }
329
+
330
+ this.log.debug(`Reset: fullReset requested. Will try to uninstall the app '${bundleId}'.`);
331
+ if (!(await this.isAppInstalled(bundleId))) {
332
+ this.log.debug('Reset: app not installed. No need to uninstall');
333
+ return;
334
+ }
335
+
336
+ try {
337
+ await this.remove(bundleId);
338
+ } catch (err) {
339
+ this.log.error(`Reset: could not remove '${bundleId}' from device: ${err.message}`);
340
+ throw err;
341
+ }
342
+ this.log.debug(`Reset: removed '${bundleId}'`);
343
+ }
344
+
345
+ }
346
+
347
+ export default RealDevice;