@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,510 @@
1
+ import _ from 'lodash';
2
+ import {fs, tempDir, mkdirp, zip, util} from 'appium/support';
3
+ import path from 'path';
4
+ import {services} from 'appium-ios-device';
5
+ import {pullFile as iosPullFile, pullFolder as iosPullFolder, pushFile as iosPushFile} from '../ios-fs-helpers';
6
+ import {errors} from 'appium/driver';
7
+
8
+ const CONTAINER_PATH_MARKER = '@';
9
+ // https://regex101.com/r/PLdB0G/2
10
+ const CONTAINER_PATH_PATTERN = new RegExp(`^${CONTAINER_PATH_MARKER}([^/]+)/(.*)`);
11
+ const CONTAINER_TYPE_SEPARATOR = ':';
12
+ const CONTAINER_DOCUMENTS_PATH = 'Documents';
13
+ const OBJECT_NOT_FOUND_ERROR_MESSAGE = 'OBJECT_NOT_FOUND';
14
+
15
+ /**
16
+ * Parses the actual path and the bundle identifier from the given path string
17
+ *
18
+ * @this {XCUITestDriver}
19
+ * @param {string} remotePath - The given path string. The string should
20
+ * match `CONTAINER_PATH_PATTERN` regexp, otherwise an error is going
21
+ * to be thrown. A valid string example: `@bundle.identifier:container_type/relative_path_in_container`
22
+ * @param {import('./types').ContainerRootSupplier|string} [containerRootSupplier] - Container root path supplier function or string value
23
+ * @returns {Promise<import('./types').ContainerObject>}
24
+ */
25
+ export async function parseContainerPath(remotePath, containerRootSupplier) {
26
+ const match = CONTAINER_PATH_PATTERN.exec(remotePath);
27
+ if (!match) {
28
+ throw new Error(
29
+ `It is expected that package identifier ` +
30
+ `starts with '${CONTAINER_PATH_MARKER}' and is separated from the ` +
31
+ `relative path with a single slash. '${remotePath}' is given instead`,
32
+ );
33
+ }
34
+ let [, bundleId, relativePath] = match;
35
+ let containerType = null;
36
+ const typeSeparatorPos = bundleId.indexOf(CONTAINER_TYPE_SEPARATOR);
37
+ // We only consider container type exists if its length is greater than zero
38
+ // not counting the colon
39
+ if (typeSeparatorPos > 0 && typeSeparatorPos < bundleId.length - 1) {
40
+ containerType = bundleId.substring(typeSeparatorPos + 1);
41
+ this.log.debug(`Parsed container type: ${containerType}`);
42
+ bundleId = bundleId.substring(0, typeSeparatorPos);
43
+ }
44
+ if (_.isNil(containerRootSupplier)) {
45
+ const pathInContainer = relativePath;
46
+ return {bundleId, pathInContainer, containerType};
47
+ }
48
+ const containerRoot = _.isFunction(containerRootSupplier)
49
+ ? await containerRootSupplier(bundleId, containerType)
50
+ : containerRootSupplier;
51
+ const pathInContainer = path.posix.resolve(containerRoot, relativePath);
52
+ verifyIsSubPath(pathInContainer, containerRoot);
53
+ return {bundleId, pathInContainer, containerType};
54
+ }
55
+
56
+ /**
57
+ *
58
+ * @param {string} originalPath
59
+ * @param {string} root
60
+ * @returns {void}
61
+ */
62
+ function verifyIsSubPath(originalPath, root) {
63
+ const normalizedRoot = path.normalize(root);
64
+ const normalizedPath = path.normalize(path.dirname(originalPath));
65
+ // If originalPath is root, `/`, originalPath should equal to normalizedRoot
66
+ if (normalizedRoot !== originalPath && !normalizedPath.startsWith(normalizedRoot)) {
67
+ throw new Error(`'${normalizedPath}' is expected to be a subpath of '${normalizedRoot}'`);
68
+ }
69
+ }
70
+
71
+ /**
72
+ *
73
+ * @this {XCUITestDriver}
74
+ * @param {string} [bundleId]
75
+ * @param {string} [containerType]
76
+ * @returns {Promise<any>}
77
+ */
78
+ async function createAfcClient(bundleId, containerType) {
79
+ const udid = this.device.udid;
80
+
81
+ if (!bundleId) {
82
+ return await services.startAfcService(udid);
83
+ }
84
+ const service = await services.startHouseArrestService(udid);
85
+
86
+ const {
87
+ skipDocumentsContainerCheck = false,
88
+ } = await this.settings.getSettings();
89
+
90
+ if (skipDocumentsContainerCheck) {
91
+ return service.vendContainer(bundleId);
92
+ }
93
+
94
+ return isDocumentsContainer(containerType)
95
+ ? await service.vendDocuments(bundleId)
96
+ : await service.vendContainer(bundleId);
97
+ }
98
+
99
+ /**
100
+ *
101
+ * @param {string} [containerType]
102
+ * @returns {boolean}
103
+ */
104
+ function isDocumentsContainer(containerType) {
105
+ return _.toLower(containerType) === _.toLower(CONTAINER_DOCUMENTS_PATH);
106
+ }
107
+
108
+ /**
109
+ *
110
+ * @this {XCUITestDriver}
111
+ * @param {string} remotePath
112
+ * @returns {Promise<{service: any, relativePath: string}>}
113
+ */
114
+ async function createService(remotePath) {
115
+ if (CONTAINER_PATH_PATTERN.test(remotePath)) {
116
+ const {bundleId, pathInContainer, containerType} = await parseContainerPath.bind(this)(remotePath);
117
+ const service = await createAfcClient.bind(this)(bundleId, containerType);
118
+ const relativePath = isDocumentsContainer(containerType)
119
+ ? path.join(CONTAINER_DOCUMENTS_PATH, pathInContainer)
120
+ : pathInContainer;
121
+ return {service, relativePath};
122
+ } else {
123
+ const service = await createAfcClient.bind(this)();
124
+ return {service, relativePath: remotePath};
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Save the given base64 data chunk as a binary file on the Simulator under test.
130
+ *
131
+ * @this {XCUITestDriver}
132
+ * @param {string} remotePath - The remote path on the device. This variable can be prefixed with
133
+ * bundle id, so then the file will be uploaded to the corresponding
134
+ * application container instead of the default media folder, for example
135
+ * '@com.myapp.bla:data/RelativePathInContainer/111.png'. The '@' character at the
136
+ * beginning of the argument is mandatory in such case. The colon at the end of bundle identifier
137
+ * is optional and is used to distinguish the container type.
138
+ * Possible values there are 'app', 'data', 'groups', '<A specific App Group container>'.
139
+ * The default value is 'app'.
140
+ * The relative folder path is ignored if the file is going to be uploaded
141
+ * to the default media folder and only the file name is considered important.
142
+ * @param {string} base64Data - Base-64 encoded content of the file to be uploaded.
143
+ */
144
+ async function pushFileToSimulator(remotePath, base64Data) {
145
+ const buffer = Buffer.from(base64Data, 'base64');
146
+ const device = /** @type {import('../driver').Simulator} */ (this.device);
147
+ if (CONTAINER_PATH_PATTERN.test(remotePath)) {
148
+ const {bundleId, pathInContainer: dstPath} = await parseContainerPath.bind(this)(
149
+ remotePath,
150
+ async (appBundle, containerType) =>
151
+ await device.simctl.getAppContainer(appBundle, containerType),
152
+ );
153
+ this.log.info(
154
+ `Parsed bundle identifier '${bundleId}' from '${remotePath}'. ` +
155
+ `Will put the data into '${dstPath}'`,
156
+ );
157
+ if (!(await fs.exists(path.dirname(dstPath)))) {
158
+ this.log.debug(`The destination folder '${path.dirname(dstPath)}' does not exist. Creating...`);
159
+ await mkdirp(path.dirname(dstPath));
160
+ }
161
+ await fs.writeFile(dstPath, buffer);
162
+ return;
163
+ }
164
+ const dstFolder = await tempDir.openDir();
165
+ const dstPath = path.resolve(dstFolder, path.basename(remotePath));
166
+ try {
167
+ await fs.writeFile(dstPath, buffer);
168
+ await device.simctl.addMedia(dstPath);
169
+ } finally {
170
+ await fs.rimraf(dstFolder);
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Save the given base64 data chunk as a binary file on the device under test.
176
+ *
177
+ * @this {XCUITestDriver}
178
+ * @param {string} remotePath - The remote path on the device. This variable can be prefixed with
179
+ * bundle id, so then the file will be uploaded to the corresponding
180
+ * application container instead of the default media folder. Use
181
+ * `@<app_bundle_id>:<optional_container_type>/<path_to_the_file_or_folder_inside_container>`
182
+ * format to pull a file or a folder from an application container of the given type.
183
+ * The only supported container type is 'documents'. If the container type is not set
184
+ * explicitly for a bundle id, then the default application container is going to be mounted
185
+ * (aka --container ifuse argument)
186
+ * e.g. If `@com.myapp.bla:documents/111.png` is provided,
187
+ * `On My iPhone/<app name>` in Files app will be mounted in the host machine.
188
+ * Base64 encoded `111.png` will be pushed into `On My iPhone/<app name>/111.png`
189
+ * as base64 decoded data.
190
+ * @param {string} base64Data - Base-64 encoded content of the file to be uploaded.
191
+ */
192
+ async function pushFileToRealDevice(remotePath, base64Data) {
193
+ const {service, relativePath} = await createService.bind(this)(remotePath);
194
+ try {
195
+ await iosPushFile(service, Buffer.from(base64Data, 'base64'), relativePath);
196
+ } catch (e) {
197
+ this.log.debug(e.stack);
198
+ throw new Error(`Could not push the file to '${remotePath}'. Original error: ${e.message}`);
199
+ } finally {
200
+ service.close();
201
+ }
202
+ }
203
+
204
+ /**
205
+ *
206
+ * @this {XCUITestDriver}
207
+ * @param {string} remotePath
208
+ * @returns {Promise<void>}
209
+ */
210
+ async function deleteFileOrFolder(remotePath) {
211
+ return this.isSimulator()
212
+ ? await deleteFromSimulator.bind(this)(remotePath)
213
+ : await deleteFromRealDevice.bind(this)(remotePath);
214
+ }
215
+
216
+ /**
217
+ * Get the content of given file or folder from iOS Simulator and return it as base-64 encoded string.
218
+ * Folder content is recursively packed into a zip archive.
219
+ *
220
+ * @this {XCUITestDriver}
221
+ * @param {string} remotePath - The path to a file or a folder, which exists in the corresponding application
222
+ * container on Simulator. Use
223
+ * `@<app_bundle_id>:<optional_container_type>/<path_to_the_file_or_folder_inside_container>`
224
+ * format to pull a file or a folder from an application container of the given type.
225
+ * Possible container types are `app`, `data`, `groups`, `<A specific App Group container>`.
226
+ * The default type is `app`.
227
+ * @param {boolean} isFile - Whether the destination item is a file or a folder
228
+ * @returns {Promise<string>} Base-64 encoded content of the file.
229
+ */
230
+ async function pullFromSimulator(remotePath, isFile) {
231
+ let pathOnServer;
232
+ const device = /** @type {import('../driver').Simulator} */ (this.device);
233
+ if (CONTAINER_PATH_PATTERN.test(remotePath)) {
234
+ const {bundleId, pathInContainer: dstPath} = await parseContainerPath.bind(this)(
235
+ remotePath,
236
+ async (appBundle, containerType) =>
237
+ await device.simctl.getAppContainer(appBundle, containerType),
238
+ );
239
+ this.log.info(
240
+ `Parsed bundle identifier '${bundleId}' from '${remotePath}'. ` +
241
+ `Will get the data from '${dstPath}'`,
242
+ );
243
+ pathOnServer = dstPath;
244
+ } else {
245
+ const simRoot = device.getDir();
246
+ pathOnServer = path.posix.join(simRoot, remotePath);
247
+ verifyIsSubPath(pathOnServer, simRoot);
248
+ this.log.info(`Got the full item path: ${pathOnServer}`);
249
+ }
250
+ if (!(await fs.exists(pathOnServer))) {
251
+ throw this.log.errorWithException(
252
+ `The remote ${isFile ? 'file' : 'folder'} at '${pathOnServer}' does not exist`,
253
+ );
254
+ }
255
+ const buffer = isFile
256
+ ? await util.toInMemoryBase64(pathOnServer)
257
+ : await zip.toInMemoryZip(pathOnServer, {encodeToBase64: true});
258
+ return buffer.toString();
259
+ }
260
+
261
+ /**
262
+ * Get the content of given file or folder from the real device under test and return it as base-64 encoded string.
263
+ * Folder content is recursively packed into a zip archive.
264
+ *
265
+ * @this {XCUITestDriver}
266
+ * @param {string} remotePath - The path to an existing remote file on the device. This variable can be prefixed with
267
+ * bundle id, so then the file will be downloaded from the corresponding
268
+ * application container instead of the default media folder. Use
269
+ * `@<app_bundle_id>:<optional_container_type>/<path_to_the_file_or_folder_inside_container>`
270
+ * format to pull a file or a folder from an application container of the given type.
271
+ * The only supported container type is 'documents'. If the container type is not set
272
+ * explicitly for a bundle id, then the default application container is going to be mounted
273
+ * (aka --container ifuse argument)
274
+ * e.g. If `@com.myapp.bla:documents/111.png` is provided,
275
+ * `On My iPhone/<app name>` in Files app will be mounted in the host machine.
276
+ * `On My iPhone/<app name>/111.png` will be pulled into the mounted host machine
277
+ * and Appium returns the data as base64-encoded string to client.
278
+ * `@com.myapp.bla:documents/` means `On My iPhone/<app name>`.
279
+ * @param {boolean} isFile - Whether the destination item is a file or a folder
280
+ * @returns {Promise<string>} Base-64 encoded content of the remote file
281
+ */
282
+ async function pullFromRealDevice(remotePath, isFile) {
283
+ const {service, relativePath} = await createService.bind(this)(remotePath);
284
+ try {
285
+ const fileInfo = await service.getFileInfo(relativePath);
286
+ if (isFile && fileInfo.isDirectory()) {
287
+ throw new Error(`The requested path is not a file. Path: '${remotePath}'`);
288
+ }
289
+ if (!isFile && !fileInfo.isDirectory()) {
290
+ throw new Error(`The requested path is not a folder. Path: '${remotePath}'`);
291
+ }
292
+
293
+ return fileInfo.isFile()
294
+ ? (await iosPullFile(service, relativePath)).toString('base64')
295
+ : (await iosPullFolder(service, relativePath)).toString();
296
+ } finally {
297
+ service.close();
298
+ }
299
+ }
300
+
301
+ /**
302
+ * Remove the file or folder from the device
303
+ *
304
+ * @this {XCUITestDriver}
305
+ * @param {string} remotePath - The path to a file or a folder, which exists in the corresponding application
306
+ * container on Simulator. Use
307
+ * `@<app_bundle_id>:<optional_container_type>/<path_to_the_file_or_folder_inside_container>`
308
+ * format to pull a file or a folder from an application container of the given type.
309
+ * Possible container types are 'app', 'data', 'groups', '<A specific App Group container>'.
310
+ * The default type is 'app'.
311
+ * @returns {Promise<void>}
312
+ */
313
+ async function deleteFromSimulator(remotePath) {
314
+ let pathOnServer;
315
+ const device = /** @type {import('../driver').Simulator} */ (this.device);
316
+ if (CONTAINER_PATH_PATTERN.test(remotePath)) {
317
+ const {bundleId, pathInContainer: dstPath} = await parseContainerPath.bind(this)(
318
+ remotePath,
319
+ async (appBundle, containerType) =>
320
+ await device.simctl.getAppContainer(appBundle, containerType),
321
+ );
322
+ this.log.info(
323
+ `Parsed bundle identifier '${bundleId}' from '${remotePath}'. ` +
324
+ `'${dstPath}' will be deleted`,
325
+ );
326
+ pathOnServer = dstPath;
327
+ } else {
328
+ const simRoot = device.getDir();
329
+ pathOnServer = path.posix.join(simRoot, remotePath);
330
+ verifyIsSubPath(pathOnServer, simRoot);
331
+ this.log.info(`Got the full path: ${pathOnServer}`);
332
+ }
333
+ if (!(await fs.exists(pathOnServer))) {
334
+ throw new errors.InvalidArgumentError(`The remote path at '${pathOnServer}' does not exist`);
335
+ }
336
+ await fs.rimraf(pathOnServer);
337
+ }
338
+
339
+ /**
340
+ * Remove the file or folder from the device
341
+ *
342
+ * @this {XCUITestDriver}
343
+ * @param {string} remotePath - The path to an existing remote file on the device. This variable can be prefixed with
344
+ * bundle id, so then the file will be downloaded from the corresponding
345
+ * application container instead of the default media folder. Use
346
+ * `@<app_bundle_id>:<optional_container_type>/<path_to_the_file_or_folder_inside_container>`
347
+ * format to pull a file or a folder from an application container of the given type.
348
+ * The only supported container type is 'documents'. If the container type is not set
349
+ * explicitly for a bundle id, then the default application container is going to be mounted
350
+ * (aka --container ifuse argument)
351
+ * e.g. If `@com.myapp.bla:documents/111.png` is provided,
352
+ * `On My iPhone/<app name>` in Files app will be mounted in the host machine.
353
+ * `On My iPhone/<app name>/111.png` will be pulled into the mounted host machine
354
+ * and Appium returns the data as base64-encoded string to client.
355
+ * `@com.myapp.bla:documents/` means `On My iPhone/<app name>`.
356
+ * @returns {Promise<void>}
357
+ */
358
+ async function deleteFromRealDevice(remotePath) {
359
+ const {service, relativePath} = await createService.bind(this)(remotePath);
360
+ try {
361
+ await service.deleteDirectory(relativePath);
362
+ } catch (e) {
363
+ if (e.message.includes(OBJECT_NOT_FOUND_ERROR_MESSAGE)) {
364
+ throw new Error(`Path '${remotePath}' does not exist on the device`);
365
+ }
366
+ throw e;
367
+ } finally {
368
+ service.close();
369
+ }
370
+ }
371
+
372
+ /**
373
+ * Pushes the given data to a file on the remote device
374
+ *
375
+ * @param {string} remotePath The full path to the remote file or
376
+ * a file inside a package bundle. Check the documentation on
377
+ * `pushFileToRealDevice` and `pushFileToSimulator` for more information
378
+ * on acceptable values.
379
+ * @param {string} base64Data Base64 encoded data to be written to the
380
+ * remote file. The remote file will be silently overridden if it already exists.
381
+ * @throws {Error} If there was an error while pushing the data
382
+ * @this {XCUITestDriver}
383
+ */
384
+ export async function pushFile(remotePath, base64Data) {
385
+ if (remotePath.endsWith('/')) {
386
+ throw new errors.InvalidArgumentError(
387
+ `It is expected that remote path points to a file and not to a folder. ` +
388
+ `'${remotePath}' is given instead`,
389
+ );
390
+ }
391
+ if (_.isArray(base64Data)) {
392
+ // some clients (ahem) java, send a byte array encoding utf8 characters
393
+ // instead of a string, which would be infinitely better!
394
+ base64Data = Buffer.from(base64Data).toString('utf8');
395
+ }
396
+ return this.isSimulator()
397
+ ? await pushFileToSimulator.bind(this)(remotePath, base64Data)
398
+ : await pushFileToRealDevice.bind(this)(remotePath, base64Data);
399
+ }
400
+
401
+ /**
402
+ * Pushes the given data to a file on the remote device.
403
+ *
404
+ * @param {string} remotePath - The full path to the remote file
405
+ * or a specially formatted path, which points to an item inside an app bundle.
406
+ * @param {string} payload - Base64-encoded content of the file to be pushed.
407
+ * @this {XCUITestDriver}
408
+ */
409
+ export async function mobilePushFile(remotePath, payload) {
410
+ return await this.pushFile(remotePath, payload);
411
+ }
412
+
413
+ /**
414
+ * Pulls a remote file from the device.
415
+ *
416
+ * @param {string} remotePath The full path to the remote file
417
+ * or a specially formatted path, which points to an item inside app bundle.
418
+ * See the documentation for `pullFromRealDevice` and `pullFromSimulator`
419
+ * to get more information on acceptable values.
420
+ * @returns {Promise<string>} Base64 encoded content of the pulled file
421
+ * @throws {Error} If the pull operation failed
422
+ * @this {XCUITestDriver}
423
+ */
424
+ export async function pullFile(remotePath) {
425
+ if (remotePath.endsWith('/')) {
426
+ throw new errors.InvalidArgumentError(
427
+ `It is expected that remote path points to a file and not to a folder. ` +
428
+ `'${remotePath}' is given instead`,
429
+ );
430
+ }
431
+ return this.isSimulator()
432
+ ? await pullFromSimulator.bind(this)(remotePath, true)
433
+ : await pullFromRealDevice.bind(this)(remotePath, true);
434
+ }
435
+
436
+ /**
437
+ * Pulls a remote file from the device.
438
+ *
439
+ * @param {string} remotePath - The full path to the remote file
440
+ * or a specially formatted path, which points to an item inside app bundle. See the documentation for `pullFromRealDevice` and `pullFromSimulator` to get more information on acceptable values.
441
+ * @returns {Promise<string>} The same as in `pullFile`
442
+ * @this {XCUITestDriver}
443
+ */
444
+ export async function mobilePullFile(remotePath) {
445
+ return await this.pullFile(remotePath);
446
+ }
447
+
448
+ /**
449
+ * Delete a remote folder from the device.
450
+ *
451
+ * @param {string} remotePath - The full path to the remote folder or a specially formatted path, which points to an item inside app bundle. See the documentation for `pullFromRealDevice` and `pullFromSimulator` to get more information on acceptable values.
452
+ * @this {XCUITestDriver}
453
+ * @returns {Promise<void>}
454
+ */
455
+ export async function mobileDeleteFolder(remotePath) {
456
+ if (!remotePath.endsWith('/')) {
457
+ remotePath = `${remotePath}/`;
458
+ }
459
+ await deleteFileOrFolder.bind(this)(remotePath);
460
+ }
461
+
462
+ /**
463
+ * Delete a remote file from the device.
464
+ *
465
+ * @param {string} remotePath - The full path to the remote file or a specially formatted path, which points to an item inside app bundle. See the documentation for `pullFromRealDevice` and `pullFromSimulator` to get more information on acceptable values.
466
+ * @this {XCUITestDriver}
467
+ * @returns {Promise<void>}
468
+ */
469
+ export async function mobileDeleteFile(remotePath) {
470
+ if (remotePath.endsWith('/')) {
471
+ throw new errors.InvalidArgumentError(
472
+ `It is expected that remote path points to a file and not to a folder. ` +
473
+ `'${remotePath}' is given instead`,
474
+ );
475
+ }
476
+ await deleteFileOrFolder.bind(this)(remotePath);
477
+ }
478
+
479
+ /**
480
+ * Pulls the whole folder from the remote device
481
+ *
482
+ * @param {string} remotePath The full path to a folder on the
483
+ * remote device or a folder inside an application bundle
484
+ * @returns {Promise<string>} Zipped and base64-encoded content of the folder
485
+ * @throws {Error} If there was a failure while getting the folder content
486
+ * @this {XCUITestDriver}
487
+ */
488
+ export async function pullFolder(remotePath) {
489
+ if (!remotePath.endsWith('/')) {
490
+ remotePath = `${remotePath}/`;
491
+ }
492
+ return this.isSimulator()
493
+ ? await pullFromSimulator.bind(this)(remotePath, false)
494
+ : await pullFromRealDevice.bind(this)(remotePath, false);
495
+ }
496
+
497
+ /**
498
+ * Pulls the whole folder from the device under test.
499
+ *
500
+ * @param {string} remotePath - The full path to the remote folder
501
+ * @returns {Promise<string>} The same as `pullFolder`
502
+ * @this {XCUITestDriver}
503
+ */
504
+ export async function mobilePullFolder(remotePath) {
505
+ return await this.pullFolder(remotePath);
506
+ }
507
+
508
+ /**
509
+ * @typedef {import('../driver').XCUITestDriver} XCUITestDriver
510
+ */