@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.
- package/CHANGELOG.md +2600 -0
- package/LICENSE +201 -0
- package/README.md +55 -0
- package/build/index.d.ts +5 -0
- package/build/index.js +41 -0
- package/build/lib/app-infos-cache.d.ts +62 -0
- package/build/lib/app-infos-cache.d.ts.map +1 -0
- package/build/lib/app-infos-cache.js +180 -0
- package/build/lib/app-infos-cache.js.map +1 -0
- package/build/lib/app-utils.d.ts +89 -0
- package/build/lib/app-utils.d.ts.map +1 -0
- package/build/lib/app-utils.js +657 -0
- package/build/lib/app-utils.js.map +1 -0
- package/build/lib/commands/active-app-info.d.ts +9 -0
- package/build/lib/commands/active-app-info.d.ts.map +1 -0
- package/build/lib/commands/active-app-info.js +14 -0
- package/build/lib/commands/active-app-info.js.map +1 -0
- package/build/lib/commands/advanced-battery-types.d.ts +444 -0
- package/build/lib/commands/advanced-battery-types.d.ts.map +1 -0
- package/build/lib/commands/advanced-battery-types.js +8 -0
- package/build/lib/commands/advanced-battery-types.js.map +1 -0
- package/build/lib/commands/alert.d.ts +45 -0
- package/build/lib/commands/alert.d.ts.map +1 -0
- package/build/lib/commands/alert.js +87 -0
- package/build/lib/commands/alert.js.map +1 -0
- package/build/lib/commands/app-management.d.ts +153 -0
- package/build/lib/commands/app-management.d.ts.map +1 -0
- package/build/lib/commands/app-management.js +323 -0
- package/build/lib/commands/app-management.js.map +1 -0
- package/build/lib/commands/app-strings.d.ts +16 -0
- package/build/lib/commands/app-strings.d.ts.map +1 -0
- package/build/lib/commands/app-strings.js +30 -0
- package/build/lib/commands/app-strings.js.map +1 -0
- package/build/lib/commands/appearance.d.ts +22 -0
- package/build/lib/commands/appearance.d.ts.map +1 -0
- package/build/lib/commands/appearance.js +74 -0
- package/build/lib/commands/appearance.js.map +1 -0
- package/build/lib/commands/audit.d.ts +43 -0
- package/build/lib/commands/audit.d.ts.map +1 -0
- package/build/lib/commands/audit.js +31 -0
- package/build/lib/commands/audit.js.map +1 -0
- package/build/lib/commands/battery.d.ts +13 -0
- package/build/lib/commands/battery.d.ts.map +1 -0
- package/build/lib/commands/battery.js +49 -0
- package/build/lib/commands/battery.js.map +1 -0
- package/build/lib/commands/bidi/constants.d.ts +6 -0
- package/build/lib/commands/bidi/constants.d.ts.map +1 -0
- package/build/lib/commands/bidi/constants.js +10 -0
- package/build/lib/commands/bidi/constants.js.map +1 -0
- package/build/lib/commands/bidi/models.d.ts +9 -0
- package/build/lib/commands/bidi/models.d.ts.map +1 -0
- package/build/lib/commands/bidi/models.js +54 -0
- package/build/lib/commands/bidi/models.js.map +1 -0
- package/build/lib/commands/bidi/types.d.ts +26 -0
- package/build/lib/commands/bidi/types.d.ts.map +1 -0
- package/build/lib/commands/bidi/types.js +4 -0
- package/build/lib/commands/bidi/types.js.map +1 -0
- package/build/lib/commands/biometric.d.ts +32 -0
- package/build/lib/commands/biometric.d.ts.map +1 -0
- package/build/lib/commands/biometric.js +54 -0
- package/build/lib/commands/biometric.js.map +1 -0
- package/build/lib/commands/certificate.d.ts +50 -0
- package/build/lib/commands/certificate.d.ts.map +1 -0
- package/build/lib/commands/certificate.js +454 -0
- package/build/lib/commands/certificate.js.map +1 -0
- package/build/lib/commands/clipboard.d.ts +21 -0
- package/build/lib/commands/clipboard.d.ts.map +1 -0
- package/build/lib/commands/clipboard.js +36 -0
- package/build/lib/commands/clipboard.js.map +1 -0
- package/build/lib/commands/condition.d.ts +102 -0
- package/build/lib/commands/condition.d.ts.map +1 -0
- package/build/lib/commands/condition.js +146 -0
- package/build/lib/commands/condition.js.map +1 -0
- package/build/lib/commands/content-size.d.ts +30 -0
- package/build/lib/commands/content-size.d.ts.map +1 -0
- package/build/lib/commands/content-size.js +67 -0
- package/build/lib/commands/content-size.js.map +1 -0
- package/build/lib/commands/context.d.ts +191 -0
- package/build/lib/commands/context.d.ts.map +1 -0
- package/build/lib/commands/context.js +625 -0
- package/build/lib/commands/context.js.map +1 -0
- package/build/lib/commands/deviceInfo.d.ts +12 -0
- package/build/lib/commands/deviceInfo.d.ts.map +1 -0
- package/build/lib/commands/deviceInfo.js +25 -0
- package/build/lib/commands/deviceInfo.js.map +1 -0
- package/build/lib/commands/element.d.ts +108 -0
- package/build/lib/commands/element.d.ts.map +1 -0
- package/build/lib/commands/element.js +395 -0
- package/build/lib/commands/element.js.map +1 -0
- package/build/lib/commands/enum.d.ts +105 -0
- package/build/lib/commands/enum.d.ts.map +1 -0
- package/build/lib/commands/enum.js +113 -0
- package/build/lib/commands/enum.js.map +1 -0
- package/build/lib/commands/execute.d.ts +33 -0
- package/build/lib/commands/execute.d.ts.map +1 -0
- package/build/lib/commands/execute.js +142 -0
- package/build/lib/commands/execute.js.map +1 -0
- package/build/lib/commands/file-movement.d.ts +90 -0
- package/build/lib/commands/file-movement.d.ts.map +1 -0
- package/build/lib/commands/file-movement.js +477 -0
- package/build/lib/commands/file-movement.js.map +1 -0
- package/build/lib/commands/find.d.ts +21 -0
- package/build/lib/commands/find.d.ts.map +1 -0
- package/build/lib/commands/find.js +199 -0
- package/build/lib/commands/find.js.map +1 -0
- package/build/lib/commands/general.d.ts +137 -0
- package/build/lib/commands/general.d.ts.map +1 -0
- package/build/lib/commands/general.js +270 -0
- package/build/lib/commands/general.js.map +1 -0
- package/build/lib/commands/geolocation.d.ts +57 -0
- package/build/lib/commands/geolocation.d.ts.map +1 -0
- package/build/lib/commands/geolocation.js +58 -0
- package/build/lib/commands/geolocation.js.map +1 -0
- package/build/lib/commands/gesture.d.ts +283 -0
- package/build/lib/commands/gesture.d.ts.map +1 -0
- package/build/lib/commands/gesture.js +565 -0
- package/build/lib/commands/gesture.js.map +1 -0
- package/build/lib/commands/hid-event.d.ts +2773 -0
- package/build/lib/commands/hid-event.d.ts.map +1 -0
- package/build/lib/commands/hid-event.js +1633 -0
- package/build/lib/commands/hid-event.js.map +1 -0
- package/build/lib/commands/increase-contrast.d.ts +24 -0
- package/build/lib/commands/increase-contrast.d.ts.map +1 -0
- package/build/lib/commands/increase-contrast.js +49 -0
- package/build/lib/commands/increase-contrast.js.map +1 -0
- package/build/lib/commands/iohid.d.ts +1372 -0
- package/build/lib/commands/iohid.d.ts.map +1 -0
- package/build/lib/commands/iohid.js +63 -0
- package/build/lib/commands/iohid.js.map +1 -0
- package/build/lib/commands/keyboard.d.ts +32 -0
- package/build/lib/commands/keyboard.d.ts.map +1 -0
- package/build/lib/commands/keyboard.js +67 -0
- package/build/lib/commands/keyboard.js.map +1 -0
- package/build/lib/commands/keychains.d.ts +10 -0
- package/build/lib/commands/keychains.d.ts.map +1 -0
- package/build/lib/commands/keychains.js +22 -0
- package/build/lib/commands/keychains.js.map +1 -0
- package/build/lib/commands/localization.d.ts +17 -0
- package/build/lib/commands/localization.d.ts.map +1 -0
- package/build/lib/commands/localization.js +34 -0
- package/build/lib/commands/localization.js.map +1 -0
- package/build/lib/commands/location.d.ts +40 -0
- package/build/lib/commands/location.d.ts.map +1 -0
- package/build/lib/commands/location.js +121 -0
- package/build/lib/commands/location.js.map +1 -0
- package/build/lib/commands/lock.d.ts +23 -0
- package/build/lib/commands/lock.d.ts.map +1 -0
- package/build/lib/commands/lock.js +49 -0
- package/build/lib/commands/lock.js.map +1 -0
- package/build/lib/commands/log.d.ts +68 -0
- package/build/lib/commands/log.d.ts.map +1 -0
- package/build/lib/commands/log.js +287 -0
- package/build/lib/commands/log.js.map +1 -0
- package/build/lib/commands/memory.d.ts +11 -0
- package/build/lib/commands/memory.d.ts.map +1 -0
- package/build/lib/commands/memory.js +49 -0
- package/build/lib/commands/memory.js.map +1 -0
- package/build/lib/commands/navigation.d.ts +44 -0
- package/build/lib/commands/navigation.d.ts.map +1 -0
- package/build/lib/commands/navigation.js +121 -0
- package/build/lib/commands/navigation.js.map +1 -0
- package/build/lib/commands/notifications.d.ts +28 -0
- package/build/lib/commands/notifications.d.ts.map +1 -0
- package/build/lib/commands/notifications.js +64 -0
- package/build/lib/commands/notifications.js.map +1 -0
- package/build/lib/commands/pasteboard.d.ts +23 -0
- package/build/lib/commands/pasteboard.d.ts.map +1 -0
- package/build/lib/commands/pasteboard.js +43 -0
- package/build/lib/commands/pasteboard.js.map +1 -0
- package/build/lib/commands/pcap.d.ts +54 -0
- package/build/lib/commands/pcap.d.ts.map +1 -0
- package/build/lib/commands/pcap.js +149 -0
- package/build/lib/commands/pcap.js.map +1 -0
- package/build/lib/commands/performance.d.ts +85 -0
- package/build/lib/commands/performance.d.ts.map +1 -0
- package/build/lib/commands/performance.js +331 -0
- package/build/lib/commands/performance.js.map +1 -0
- package/build/lib/commands/permissions.d.ts +36 -0
- package/build/lib/commands/permissions.d.ts.map +1 -0
- package/build/lib/commands/permissions.js +80 -0
- package/build/lib/commands/permissions.js.map +1 -0
- package/build/lib/commands/proxy-helper.d.ts +15 -0
- package/build/lib/commands/proxy-helper.d.ts.map +1 -0
- package/build/lib/commands/proxy-helper.js +117 -0
- package/build/lib/commands/proxy-helper.js.map +1 -0
- package/build/lib/commands/record-audio.d.ts +69 -0
- package/build/lib/commands/record-audio.d.ts.map +1 -0
- package/build/lib/commands/record-audio.js +228 -0
- package/build/lib/commands/record-audio.js.map +1 -0
- package/build/lib/commands/recordscreen.d.ts +89 -0
- package/build/lib/commands/recordscreen.d.ts.map +1 -0
- package/build/lib/commands/recordscreen.js +326 -0
- package/build/lib/commands/recordscreen.js.map +1 -0
- package/build/lib/commands/screenshots.d.ts +16 -0
- package/build/lib/commands/screenshots.d.ts.map +1 -0
- package/build/lib/commands/screenshots.js +129 -0
- package/build/lib/commands/screenshots.js.map +1 -0
- package/build/lib/commands/simctl.d.ts +27 -0
- package/build/lib/commands/simctl.d.ts.map +1 -0
- package/build/lib/commands/simctl.js +65 -0
- package/build/lib/commands/simctl.js.map +1 -0
- package/build/lib/commands/source.d.ts +16 -0
- package/build/lib/commands/source.d.ts.map +1 -0
- package/build/lib/commands/source.js +128 -0
- package/build/lib/commands/source.js.map +1 -0
- package/build/lib/commands/timeouts.d.ts +53 -0
- package/build/lib/commands/timeouts.d.ts.map +1 -0
- package/build/lib/commands/timeouts.js +71 -0
- package/build/lib/commands/timeouts.js.map +1 -0
- package/build/lib/commands/types.d.ts +539 -0
- package/build/lib/commands/types.d.ts.map +1 -0
- package/build/lib/commands/types.js +3 -0
- package/build/lib/commands/types.js.map +1 -0
- package/build/lib/commands/web.d.ts +297 -0
- package/build/lib/commands/web.d.ts.map +1 -0
- package/build/lib/commands/web.js +1029 -0
- package/build/lib/commands/web.js.map +1 -0
- package/build/lib/commands/xctest-record-screen.d.ts +92 -0
- package/build/lib/commands/xctest-record-screen.d.ts.map +1 -0
- package/build/lib/commands/xctest-record-screen.js +193 -0
- package/build/lib/commands/xctest-record-screen.js.map +1 -0
- package/build/lib/commands/xctest.d.ts +71 -0
- package/build/lib/commands/xctest.d.ts.map +1 -0
- package/build/lib/commands/xctest.js +257 -0
- package/build/lib/commands/xctest.js.map +1 -0
- package/build/lib/css-converter.d.ts +10 -0
- package/build/lib/css-converter.d.ts.map +1 -0
- package/build/lib/css-converter.js +258 -0
- package/build/lib/css-converter.js.map +1 -0
- package/build/lib/desired-caps.d.ts +506 -0
- package/build/lib/desired-caps.d.ts.map +1 -0
- package/build/lib/desired-caps.js +400 -0
- package/build/lib/desired-caps.js.map +1 -0
- package/build/lib/device-connections-factory.d.ts +13 -0
- package/build/lib/device-connections-factory.d.ts.map +1 -0
- package/build/lib/device-connections-factory.js +244 -0
- package/build/lib/device-connections-factory.js.map +1 -0
- package/build/lib/device-log/helpers.d.ts +10 -0
- package/build/lib/device-log/helpers.d.ts.map +1 -0
- package/build/lib/device-log/helpers.js +37 -0
- package/build/lib/device-log/helpers.js.map +1 -0
- package/build/lib/device-log/ios-crash-log.d.ts +34 -0
- package/build/lib/device-log/ios-crash-log.d.ts.map +1 -0
- package/build/lib/device-log/ios-crash-log.js +141 -0
- package/build/lib/device-log/ios-crash-log.js.map +1 -0
- package/build/lib/device-log/ios-device-log.d.ts +19 -0
- package/build/lib/device-log/ios-device-log.d.ts.map +1 -0
- package/build/lib/device-log/ios-device-log.js +42 -0
- package/build/lib/device-log/ios-device-log.js.map +1 -0
- package/build/lib/device-log/ios-log.d.ts +24 -0
- package/build/lib/device-log/ios-log.d.ts.map +1 -0
- package/build/lib/device-log/ios-log.js +50 -0
- package/build/lib/device-log/ios-log.js.map +1 -0
- package/build/lib/device-log/ios-performance-log.d.ts +18 -0
- package/build/lib/device-log/ios-performance-log.d.ts.map +1 -0
- package/build/lib/device-log/ios-performance-log.js +43 -0
- package/build/lib/device-log/ios-performance-log.js.map +1 -0
- package/build/lib/device-log/ios-simulator-log.d.ts +38 -0
- package/build/lib/device-log/ios-simulator-log.d.ts.map +1 -0
- package/build/lib/device-log/ios-simulator-log.js +184 -0
- package/build/lib/device-log/ios-simulator-log.js.map +1 -0
- package/build/lib/device-log/line-consuming-log.d.ts +9 -0
- package/build/lib/device-log/line-consuming-log.d.ts.map +1 -0
- package/build/lib/device-log/line-consuming-log.js +16 -0
- package/build/lib/device-log/line-consuming-log.js.map +1 -0
- package/build/lib/device-log/safari-console-log.d.ts +67 -0
- package/build/lib/device-log/safari-console-log.d.ts.map +1 -0
- package/build/lib/device-log/safari-console-log.js +81 -0
- package/build/lib/device-log/safari-console-log.js.map +1 -0
- package/build/lib/device-log/safari-network-log.d.ts +75 -0
- package/build/lib/device-log/safari-network-log.d.ts.map +1 -0
- package/build/lib/device-log/safari-network-log.js +47 -0
- package/build/lib/device-log/safari-network-log.js.map +1 -0
- package/build/lib/doctor/checks.d.ts +3 -0
- package/build/lib/doctor/checks.d.ts.map +1 -0
- package/build/lib/doctor/checks.js +39 -0
- package/build/lib/doctor/checks.js.map +1 -0
- package/build/lib/doctor/optional-checks.d.ts +46 -0
- package/build/lib/doctor/optional-checks.d.ts.map +1 -0
- package/build/lib/doctor/optional-checks.js +129 -0
- package/build/lib/doctor/optional-checks.js.map +1 -0
- package/build/lib/doctor/required-checks.d.ts +42 -0
- package/build/lib/doctor/required-checks.d.ts.map +1 -0
- package/build/lib/doctor/required-checks.js +94 -0
- package/build/lib/doctor/required-checks.js.map +1 -0
- package/build/lib/doctor/utils.d.ts +8 -0
- package/build/lib/doctor/utils.d.ts.map +1 -0
- package/build/lib/doctor/utils.js +21 -0
- package/build/lib/doctor/utils.js.map +1 -0
- package/build/lib/driver.d.ts +2429 -0
- package/build/lib/driver.d.ts.map +1 -0
- package/build/lib/driver.js +1967 -0
- package/build/lib/driver.js.map +1 -0
- package/build/lib/execute-method-map.d.ts +552 -0
- package/build/lib/execute-method-map.d.ts.map +1 -0
- package/build/lib/execute-method-map.js +586 -0
- package/build/lib/execute-method-map.js.map +1 -0
- package/build/lib/ios-fs-helpers.d.ts +75 -0
- package/build/lib/ios-fs-helpers.d.ts.map +1 -0
- package/build/lib/ios-fs-helpers.js +370 -0
- package/build/lib/ios-fs-helpers.js.map +1 -0
- package/build/lib/ios-generic-simulators.d.ts +6 -0
- package/build/lib/ios-generic-simulators.d.ts.map +1 -0
- package/build/lib/ios-generic-simulators.js +14 -0
- package/build/lib/ios-generic-simulators.js.map +1 -0
- package/build/lib/logger.d.ts +3 -0
- package/build/lib/logger.d.ts.map +1 -0
- package/build/lib/logger.js +6 -0
- package/build/lib/logger.js.map +1 -0
- package/build/lib/method-map.d.ts +229 -0
- package/build/lib/method-map.d.ts.map +1 -0
- package/build/lib/method-map.js +200 -0
- package/build/lib/method-map.js.map +1 -0
- package/build/lib/real-device-clients/base-device-client.d.ts +22 -0
- package/build/lib/real-device-clients/base-device-client.d.ts.map +1 -0
- package/build/lib/real-device-clients/base-device-client.js +14 -0
- package/build/lib/real-device-clients/base-device-client.js.map +1 -0
- package/build/lib/real-device-clients/py-ios-device-client.d.ts +21 -0
- package/build/lib/real-device-clients/py-ios-device-client.d.ts.map +1 -0
- package/build/lib/real-device-clients/py-ios-device-client.js +125 -0
- package/build/lib/real-device-clients/py-ios-device-client.js.map +1 -0
- package/build/lib/real-device-management.d.ts +53 -0
- package/build/lib/real-device-management.d.ts.map +1 -0
- package/build/lib/real-device-management.js +128 -0
- package/build/lib/real-device-management.js.map +1 -0
- package/build/lib/real-device.d.ts +112 -0
- package/build/lib/real-device.d.ts.map +1 -0
- package/build/lib/real-device.js +352 -0
- package/build/lib/real-device.js.map +1 -0
- package/build/lib/simulator-management.d.ts +96 -0
- package/build/lib/simulator-management.d.ts.map +1 -0
- package/build/lib/simulator-management.js +278 -0
- package/build/lib/simulator-management.js.map +1 -0
- package/build/lib/stubs.d.ts +3 -0
- package/build/lib/stubs.d.ts.map +1 -0
- package/build/lib/stubs.js +3 -0
- package/build/lib/stubs.js.map +1 -0
- package/build/lib/types.d.ts +31 -0
- package/build/lib/types.d.ts.map +1 -0
- package/build/lib/types.js +3 -0
- package/build/lib/types.js.map +1 -0
- package/build/lib/utils.d.ts +191 -0
- package/build/lib/utils.d.ts.map +1 -0
- package/build/lib/utils.js +549 -0
- package/build/lib/utils.js.map +1 -0
- package/build/lib/xcrun.d.ts +3 -0
- package/build/lib/xcrun.d.ts.map +1 -0
- package/build/lib/xcrun.js +17 -0
- package/build/lib/xcrun.js.map +1 -0
- package/index.js +7 -0
- package/lib/app-infos-cache.js +187 -0
- package/lib/app-utils.js +710 -0
- package/lib/commands/active-app-info.js +12 -0
- package/lib/commands/advanced-battery-types.ts +454 -0
- package/lib/commands/alert.js +88 -0
- package/lib/commands/app-management.js +346 -0
- package/lib/commands/app-strings.js +30 -0
- package/lib/commands/appearance.js +71 -0
- package/lib/commands/audit.js +31 -0
- package/lib/commands/battery.js +45 -0
- package/lib/commands/bidi/constants.ts +6 -0
- package/lib/commands/bidi/models.ts +55 -0
- package/lib/commands/bidi/types.ts +31 -0
- package/lib/commands/biometric.js +53 -0
- package/lib/commands/certificate.js +497 -0
- package/lib/commands/clipboard.js +35 -0
- package/lib/commands/condition.js +155 -0
- package/lib/commands/content-size.js +68 -0
- package/lib/commands/context.js +705 -0
- package/lib/commands/deviceInfo.js +27 -0
- package/lib/commands/element.js +423 -0
- package/lib/commands/enum.ts +108 -0
- package/lib/commands/execute.js +153 -0
- package/lib/commands/file-movement.js +510 -0
- package/lib/commands/find.js +205 -0
- package/lib/commands/general.js +278 -0
- package/lib/commands/geolocation.js +56 -0
- package/lib/commands/gesture.js +596 -0
- package/lib/commands/hid-event.ts +1634 -0
- package/lib/commands/increase-contrast.js +50 -0
- package/lib/commands/iohid.js +64 -0
- package/lib/commands/keyboard.js +62 -0
- package/lib/commands/keychains.js +18 -0
- package/lib/commands/localization.js +30 -0
- package/lib/commands/location.js +131 -0
- package/lib/commands/lock.js +46 -0
- package/lib/commands/log.js +327 -0
- package/lib/commands/memory.js +51 -0
- package/lib/commands/navigation.js +125 -0
- package/lib/commands/notifications.js +66 -0
- package/lib/commands/pasteboard.js +42 -0
- package/lib/commands/pcap.js +168 -0
- package/lib/commands/performance.js +392 -0
- package/lib/commands/permissions.js +85 -0
- package/lib/commands/proxy-helper.js +122 -0
- package/lib/commands/record-audio.js +264 -0
- package/lib/commands/recordscreen.js +391 -0
- package/lib/commands/screenshots.js +137 -0
- package/lib/commands/simctl.js +71 -0
- package/lib/commands/source.js +131 -0
- package/lib/commands/timeouts.js +68 -0
- package/lib/commands/types.ts +648 -0
- package/lib/commands/web.js +1113 -0
- package/lib/commands/xctest-record-screen.js +204 -0
- package/lib/commands/xctest.js +285 -0
- package/lib/css-converter.js +311 -0
- package/lib/desired-caps.js +396 -0
- package/lib/device-connections-factory.js +269 -0
- package/lib/device-log/helpers.ts +40 -0
- package/lib/device-log/ios-crash-log.ts +166 -0
- package/lib/device-log/ios-device-log.ts +51 -0
- package/lib/device-log/ios-log.ts +70 -0
- package/lib/device-log/ios-performance-log.ts +50 -0
- package/lib/device-log/ios-simulator-log.ts +202 -0
- package/lib/device-log/line-consuming-log.ts +16 -0
- package/lib/device-log/safari-console-log.ts +117 -0
- package/lib/device-log/safari-network-log.ts +120 -0
- package/lib/doctor/checks.ts +3 -0
- package/lib/doctor/optional-checks.ts +173 -0
- package/lib/doctor/required-checks.ts +120 -0
- package/lib/doctor/utils.ts +18 -0
- package/lib/driver.js +2316 -0
- package/lib/execute-method-map.ts +585 -0
- package/lib/ios-fs-helpers.js +355 -0
- package/lib/ios-generic-simulators.js +11 -0
- package/lib/logger.js +5 -0
- package/lib/method-map.js +196 -0
- package/lib/real-device-clients/base-device-client.ts +34 -0
- package/lib/real-device-clients/py-ios-device-client.ts +149 -0
- package/lib/real-device-management.js +133 -0
- package/lib/real-device.js +347 -0
- package/lib/simulator-management.js +324 -0
- package/lib/stubs.ts +3 -0
- package/lib/types.ts +33 -0
- package/lib/utils.js +551 -0
- package/lib/xcrun.js +16 -0
- package/package.json +175 -0
- package/scripts/build-docs.js +56 -0
- package/scripts/build-wda.js +42 -0
- package/scripts/download-wda-sim.mjs +68 -0
- package/scripts/image-mounter.mjs +239 -0
- package/scripts/open-wda.mjs +15 -0
- package/scripts/tunnel-creation.mjs +359 -0
- package/scripts/utils.js +16 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {utilities} from 'appium-ios-device';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Returns the miscellaneous information about the device under test.
|
|
5
|
+
*
|
|
6
|
+
* Since XCUITest driver v4.2.0, this includes device information via lockdown in a real device.
|
|
7
|
+
*
|
|
8
|
+
* @returns {Promise<DeviceInfo | (DeviceInfo & LockdownInfo)>} The response of `/wda/device/info'`
|
|
9
|
+
* @this {import('../driver').XCUITestDriver}
|
|
10
|
+
*/
|
|
11
|
+
export async function mobileGetDeviceInfo() {
|
|
12
|
+
const infoByWda = /** @type {import('./types').DeviceInfo} */ (
|
|
13
|
+
await this.proxyCommand('/wda/device/info', 'GET')
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
if (this.isRealDevice()) {
|
|
17
|
+
const lockdownInfo = await utilities.getDeviceInfo(this.device.udid);
|
|
18
|
+
return {...infoByWda, ...{lockdownInfo}};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return infoByWda;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @typedef {import('./types').DeviceInfo} DeviceInfo
|
|
26
|
+
* @typedef {import('./types').LockdownInfo} LockdownInfo
|
|
27
|
+
*/
|
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import {errors} from 'appium/driver';
|
|
3
|
+
import {util} from 'appium/support';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @this {XCUITestDriver}
|
|
7
|
+
*/
|
|
8
|
+
export async function elementDisplayed(el) {
|
|
9
|
+
el = util.unwrapElement(el);
|
|
10
|
+
if (this.isWebContext()) {
|
|
11
|
+
const atomsElement = this.getAtomsElement(el);
|
|
12
|
+
return await this.executeAtom('is_displayed', [atomsElement]);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return await this.proxyCommand(`/element/${el}/displayed`, 'GET');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @this {XCUITestDriver}
|
|
20
|
+
*/
|
|
21
|
+
export async function elementEnabled(el) {
|
|
22
|
+
el = util.unwrapElement(el);
|
|
23
|
+
if (this.isWebContext()) {
|
|
24
|
+
const atomsElement = this.getAtomsElement(el);
|
|
25
|
+
return await this.executeAtom('is_enabled', [atomsElement]);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return await this.proxyCommand(`/element/${el}/enabled`, 'GET');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @this {XCUITestDriver}
|
|
33
|
+
*/
|
|
34
|
+
export async function elementSelected(el) {
|
|
35
|
+
el = util.unwrapElement(el);
|
|
36
|
+
if (this.isWebContext()) {
|
|
37
|
+
const atomsElement = this.getAtomsElement(el);
|
|
38
|
+
return await this.executeAtom('is_selected', [atomsElement]);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return await this.proxyCommand(`/element/${el}/selected`, 'GET');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @this {XCUITestDriver}
|
|
46
|
+
*/
|
|
47
|
+
export async function getName(el) {
|
|
48
|
+
el = util.unwrapElement(el);
|
|
49
|
+
if (this.isWebContext()) {
|
|
50
|
+
const atomsElement = this.getAtomsElement(el);
|
|
51
|
+
const script = 'return arguments[0].tagName.toLowerCase()';
|
|
52
|
+
return await this.executeAtom('execute_script', [script, [atomsElement]]);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return await this.proxyCommand(`/element/${el}/name`, 'GET');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @this {XCUITestDriver}
|
|
60
|
+
*/
|
|
61
|
+
export async function getNativeAttribute(attribute, el) {
|
|
62
|
+
if (attribute === 'contentSize') {
|
|
63
|
+
// don't proxy requests for the content size of a scrollable element
|
|
64
|
+
return await this.getContentSize(el);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
el = util.unwrapElement(el);
|
|
68
|
+
|
|
69
|
+
// otherwise let WDA handle attribute requests
|
|
70
|
+
let value = /** @type {string|number|null|undefined|boolean} */ (
|
|
71
|
+
await this.proxyCommand(`/element/${el}/attribute/${attribute}`, 'GET')
|
|
72
|
+
);
|
|
73
|
+
// Transform the result for the case when WDA returns an integer representation for a boolean value
|
|
74
|
+
if ([0, 1].includes(/** @type {number} */ (value))) {
|
|
75
|
+
value = !!value;
|
|
76
|
+
}
|
|
77
|
+
// The returned value must be of type string according to https://www.w3.org/TR/webdriver/#get-element-attribute
|
|
78
|
+
return _.isNull(value) || _.isString(value) ? value : JSON.stringify(value);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* @this {XCUITestDriver}
|
|
83
|
+
*/
|
|
84
|
+
export async function getAttribute(attribute, el) {
|
|
85
|
+
el = util.unwrapElement(el);
|
|
86
|
+
if (!this.isWebContext()) {
|
|
87
|
+
return await this.getNativeAttribute(attribute, el);
|
|
88
|
+
}
|
|
89
|
+
const atomsElement = this.getAtomsElement(el);
|
|
90
|
+
return await this.executeAtom('get_attribute_value', [atomsElement, attribute]);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @this {XCUITestDriver}
|
|
95
|
+
*/
|
|
96
|
+
export async function getProperty(property, el) {
|
|
97
|
+
el = util.unwrapElement(el);
|
|
98
|
+
if (!this.isWebContext()) {
|
|
99
|
+
return await this.getNativeAttribute(property, el);
|
|
100
|
+
}
|
|
101
|
+
const atomsElement = this.getAtomsElement(el);
|
|
102
|
+
return await this.executeAtom('get_attribute_value', [atomsElement, property]);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* @this {XCUITestDriver}
|
|
107
|
+
*/
|
|
108
|
+
export async function getText(el) {
|
|
109
|
+
el = util.unwrapElement(el);
|
|
110
|
+
if (!this.isWebContext()) {
|
|
111
|
+
return await this.proxyCommand(`/element/${el}/text`, 'GET');
|
|
112
|
+
}
|
|
113
|
+
let atomsElement = this.getAtomsElement(el);
|
|
114
|
+
return await this.executeAtom('get_text', [atomsElement]);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* @this {XCUITestDriver}
|
|
119
|
+
* @returns {Promise<import('@appium/types').Rect>}
|
|
120
|
+
*/
|
|
121
|
+
export async function getElementRect(el) {
|
|
122
|
+
if (this.isWebContext()) {
|
|
123
|
+
// Mobile safari doesn't support rect
|
|
124
|
+
const {x, y} = await this.getLocation(el);
|
|
125
|
+
const {width, height} = await this.getSize(el);
|
|
126
|
+
return {x, y, width, height};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
el = util.unwrapElement(el);
|
|
130
|
+
return await this.getNativeRect(el);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Get the position of an element on screen
|
|
135
|
+
*
|
|
136
|
+
* @param {string|Element} elementId - the element ID
|
|
137
|
+
* @returns {Promise<Position>} The position of the element
|
|
138
|
+
* @deprecated Use {@linkcode XCUITestDriver.getElementRect} instead
|
|
139
|
+
* @this {XCUITestDriver}
|
|
140
|
+
*/
|
|
141
|
+
export async function getLocation(elementId) {
|
|
142
|
+
const el = util.unwrapElement(elementId);
|
|
143
|
+
if (this.isWebContext()) {
|
|
144
|
+
const atomsElement = this.getAtomsElement(el);
|
|
145
|
+
let loc = await this.executeAtom('get_top_left_coordinates', [atomsElement]);
|
|
146
|
+
if (this.opts.absoluteWebLocations) {
|
|
147
|
+
const script =
|
|
148
|
+
'return [' +
|
|
149
|
+
'Math.max(window.pageXOffset,document.documentElement.scrollLeft,document.body.scrollLeft),' +
|
|
150
|
+
'Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop)];';
|
|
151
|
+
const [xOffset, yOffset] = /** @type {[number, number]} */ (await this.execute(script));
|
|
152
|
+
loc.x += xOffset;
|
|
153
|
+
loc.y += yOffset;
|
|
154
|
+
}
|
|
155
|
+
return loc;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const rect = await this.getElementRect(el);
|
|
159
|
+
return {x: rect.x, y: rect.y};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Alias for {@linkcode XCUITestDriver.getLocation}
|
|
164
|
+
* @param {string|Element} elementId - the element ID
|
|
165
|
+
* @returns {Promise<Position>} The position of the element
|
|
166
|
+
* @deprecated Use {@linkcode XCUITestDriver.getElementRect} instead
|
|
167
|
+
* @this {XCUITestDriver}
|
|
168
|
+
*/
|
|
169
|
+
export async function getLocationInView(elementId) {
|
|
170
|
+
return await this.getLocation(elementId);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Get the size of an element
|
|
175
|
+
* @param {string|Element} el - the element ID
|
|
176
|
+
* @returns {Promise<Size>} The position of the element
|
|
177
|
+
* @this {XCUITestDriver}
|
|
178
|
+
*/
|
|
179
|
+
export async function getSize(el) {
|
|
180
|
+
el = util.unwrapElement(el);
|
|
181
|
+
if (this.isWebContext()) {
|
|
182
|
+
return await this.executeAtom('get_size', [this.getAtomsElement(el)]);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const rect = await this.getElementRect(el);
|
|
186
|
+
return {width: rect.width, height: rect.height};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Alias for {@linkcode setValue}
|
|
191
|
+
*
|
|
192
|
+
* @param {string} value - the value to set
|
|
193
|
+
* @param {string} el - the element to set the value of
|
|
194
|
+
* @deprecated
|
|
195
|
+
* @this {XCUITestDriver}
|
|
196
|
+
*/
|
|
197
|
+
export async function setValueImmediate(value, el) {
|
|
198
|
+
// WDA does not provide no way to set the value directly
|
|
199
|
+
this.log.info(
|
|
200
|
+
'There is currently no way to bypass typing using XCUITest. Setting value through keyboard',
|
|
201
|
+
);
|
|
202
|
+
await this.setValue(value, el);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* @this {XCUITestDriver}
|
|
207
|
+
*/
|
|
208
|
+
export async function setValue(value, el) {
|
|
209
|
+
el = util.unwrapElement(el);
|
|
210
|
+
if (!this.isWebContext()) {
|
|
211
|
+
await this.proxyCommand(`/element/${el}/value`, 'POST', {
|
|
212
|
+
value: prepareInputValue(value),
|
|
213
|
+
});
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const atomsElement = this.getAtomsElement(el);
|
|
218
|
+
await this.executeAtom('click', [atomsElement]);
|
|
219
|
+
|
|
220
|
+
if (this.opts.sendKeyStrategy !== 'oneByOne') {
|
|
221
|
+
await this.setValueWithWebAtom(atomsElement, value);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
for (const char of prepareInputValue(value)) {
|
|
225
|
+
await this.setValueWithWebAtom(atomsElement, char);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Set value with Atom for Web. This method calls `type` atom only.
|
|
231
|
+
* Expected to be called as part of {@linkcode setValue}.
|
|
232
|
+
* @this {XCUITestDriver}
|
|
233
|
+
* @param {import('./types').AtomsElement<string>} atomsElement A target element to type the given value.
|
|
234
|
+
* @param {string|string[]} value The actual text to type.
|
|
235
|
+
*/
|
|
236
|
+
export async function setValueWithWebAtom(atomsElement, value) {
|
|
237
|
+
await this.executeAtom('type', [atomsElement, value]);
|
|
238
|
+
|
|
239
|
+
if (this.opts.skipTriggerInputEventAfterSendkeys) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function triggerInputEvent(/** @type {EventTarget & {_valueTracker?: any}} */input) {
|
|
244
|
+
let lastValue = '';
|
|
245
|
+
let event = new Event('input', { bubbles: true });
|
|
246
|
+
let tracker = input._valueTracker;
|
|
247
|
+
if (tracker) {
|
|
248
|
+
tracker.setValue(lastValue);
|
|
249
|
+
}
|
|
250
|
+
input.dispatchEvent(event);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const scriptAsString = `return (${triggerInputEvent}).apply(null, arguments)`;
|
|
254
|
+
await this.executeAtom('execute_script', [scriptAsString, [atomsElement]]);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Send keys to the app
|
|
259
|
+
* @param {string[]} value - Array of keys to send
|
|
260
|
+
* @this {XCUITestDriver}
|
|
261
|
+
* @deprecated Use {@linkcode XCUITestDriver.setValue} instead
|
|
262
|
+
*/
|
|
263
|
+
export async function keys(value) {
|
|
264
|
+
await this.proxyCommand('/wda/keys', 'POST', {
|
|
265
|
+
value: prepareInputValue(value),
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* @this {XCUITestDriver}
|
|
271
|
+
*/
|
|
272
|
+
export async function clear(el) {
|
|
273
|
+
el = util.unwrapElement(el);
|
|
274
|
+
if (this.isWebContext()) {
|
|
275
|
+
const atomsElement = this.getAtomsElement(el);
|
|
276
|
+
await this.executeAtom('clear', [atomsElement]);
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
await this.proxyCommand(`/element/${el}/clear`, 'POST');
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* @this {XCUITestDriver}
|
|
284
|
+
*/
|
|
285
|
+
export async function getContentSize(el) {
|
|
286
|
+
if (this.isWebContext()) {
|
|
287
|
+
throw new errors.NotYetImplementedError(
|
|
288
|
+
'Support for getContentSize for web context is not yet implemented. Please contact an Appium dev',
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const type = await this.getAttribute('type', el);
|
|
293
|
+
|
|
294
|
+
if (type !== 'XCUIElementTypeTable' && type !== 'XCUIElementTypeCollectionView') {
|
|
295
|
+
throw new Error(
|
|
296
|
+
`Can't get content size for type '${type}', only for ` + `tables and collection views`,
|
|
297
|
+
);
|
|
298
|
+
}
|
|
299
|
+
let locator = '*';
|
|
300
|
+
if (type === 'XCUIElementTypeTable') {
|
|
301
|
+
// only find table cells, not just any children
|
|
302
|
+
locator = 'XCUIElementTypeCell';
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
let contentHeight = 0;
|
|
306
|
+
const children = await this.findElOrEls(`class chain`, locator, true, el);
|
|
307
|
+
if (children.length === 1) {
|
|
308
|
+
// if we know there's only one element, we can optimize to make just one
|
|
309
|
+
// call to WDA
|
|
310
|
+
const rect = await this.getElementRect(_.head(children));
|
|
311
|
+
contentHeight = rect.height;
|
|
312
|
+
} else if (children.length) {
|
|
313
|
+
// otherwise if we have multiple elements, logic differs based on element
|
|
314
|
+
// type
|
|
315
|
+
switch (type) {
|
|
316
|
+
case 'XCUIElementTypeTable': {
|
|
317
|
+
const firstRect = await this.getElementRect(_.head(children));
|
|
318
|
+
const lastRect = await this.getElementRect(_.last(children));
|
|
319
|
+
contentHeight = lastRect.y + lastRect.height - firstRect.y;
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
case 'XCUIElementTypeCollectionView': {
|
|
323
|
+
let elsInRow = 1; // we know there must be at least one element in the row
|
|
324
|
+
let firstRect = await this.getElementRect(_.head(children));
|
|
325
|
+
let initialRects = [firstRect];
|
|
326
|
+
for (let i = 1; i < children.length; i++) {
|
|
327
|
+
const rect = await this.getElementRect(children[i]);
|
|
328
|
+
initialRects.push(rect);
|
|
329
|
+
if (rect.y !== firstRect.y) {
|
|
330
|
+
elsInRow = i;
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
const spaceBetweenEls =
|
|
335
|
+
initialRects[elsInRow].y -
|
|
336
|
+
initialRects[elsInRow - 1].y -
|
|
337
|
+
initialRects[elsInRow - 1].height;
|
|
338
|
+
const numRows = Math.ceil(children.length / elsInRow);
|
|
339
|
+
|
|
340
|
+
// assume all cells are the same height
|
|
341
|
+
contentHeight = numRows * firstRect.height + spaceBetweenEls * (numRows - 1);
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
default:
|
|
345
|
+
throw new Error(
|
|
346
|
+
`Programming error: type '${type}' was not ` +
|
|
347
|
+
`valid but should have already been rejected`,
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
const size = await this.getSize(el);
|
|
352
|
+
const origin = await this.getLocationInView(el);
|
|
353
|
+
// attributes have to be strings, so stringify this up
|
|
354
|
+
return JSON.stringify({
|
|
355
|
+
width: size.width,
|
|
356
|
+
height: size.height,
|
|
357
|
+
top: origin.y,
|
|
358
|
+
left: origin.x,
|
|
359
|
+
scrollableOffset: contentHeight,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* @this {XCUITestDriver}
|
|
365
|
+
* @returns {Promise<Rect>}
|
|
366
|
+
*/
|
|
367
|
+
export async function getNativeRect(el) {
|
|
368
|
+
return /** @type {Rect} */ (await this.proxyCommand(`/element/${el}/rect`, 'GET'));
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Prepares the input value to be passed as an argument to WDA.
|
|
374
|
+
*
|
|
375
|
+
* @param {string|string[]|number} inp The actual text to type.
|
|
376
|
+
* @example
|
|
377
|
+
* ```js
|
|
378
|
+
* // Acceptable values of `inp`:
|
|
379
|
+
* ['some text']
|
|
380
|
+
* ['s', 'o', 'm', 'e', ' ', 't', 'e', 'x', 't']
|
|
381
|
+
* 'some text'
|
|
382
|
+
* 1234
|
|
383
|
+
* ```
|
|
384
|
+
* @throws {Error} If the value is not acceptable for input
|
|
385
|
+
* @returns {string[]} The preprocessed value
|
|
386
|
+
*/
|
|
387
|
+
function prepareInputValue(inp) {
|
|
388
|
+
if (![_.isArray, _.isString, _.isFinite].some((f) => f(inp))) {
|
|
389
|
+
throw new Error(
|
|
390
|
+
`Only strings, numbers and arrays are supported as input arguments. ` +
|
|
391
|
+
`Received: ${JSON.stringify(inp)}`,
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// make it into a string, so then we assure
|
|
396
|
+
// the array items are single characters
|
|
397
|
+
if (_.isArray(inp)) {
|
|
398
|
+
inp = inp.join('');
|
|
399
|
+
} else if (_.isFinite(inp)) {
|
|
400
|
+
inp = `${inp}`;
|
|
401
|
+
}
|
|
402
|
+
// The `split` method must not be used on the string
|
|
403
|
+
// to properly handle all Unicode code points
|
|
404
|
+
return [...String(inp)].map((k) => {
|
|
405
|
+
if (['\uE006', '\uE007'].includes(k)) {
|
|
406
|
+
// RETURN or ENTER
|
|
407
|
+
return '\n';
|
|
408
|
+
}
|
|
409
|
+
if (['\uE003', '\ue017'].includes(k)) {
|
|
410
|
+
// BACKSPACE or DELETE
|
|
411
|
+
return '\b';
|
|
412
|
+
}
|
|
413
|
+
return k;
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* @typedef {import('../driver').XCUITestDriver} XCUITestDriver
|
|
419
|
+
* @typedef {import('@appium/types').Element} Element
|
|
420
|
+
* @typedef {import('@appium/types').Position} Position
|
|
421
|
+
* @typedef {import('@appium/types').Size} Size
|
|
422
|
+
* @typedef {import('@appium/types').Rect} Rect
|
|
423
|
+
*/
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mapping of permission resource name to identifier.
|
|
3
|
+
* @see https://developer.apple.com/documentation/xctest/xcuiprotectedresource?language=objc
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export enum PermissionService {
|
|
7
|
+
calendar = 2,
|
|
8
|
+
camera = 6,
|
|
9
|
+
contacts = 1,
|
|
10
|
+
health = -0x40000003,
|
|
11
|
+
homekit = 8,
|
|
12
|
+
keyboardnet = -0x40000001,
|
|
13
|
+
location = -0x40000002,
|
|
14
|
+
medialibrary = 7,
|
|
15
|
+
microphone = 5,
|
|
16
|
+
photos = 4,
|
|
17
|
+
reminders = 3,
|
|
18
|
+
systemroot = 0x40000000,
|
|
19
|
+
userdesktop = 0x40000001,
|
|
20
|
+
userdocuments = 0x40000003,
|
|
21
|
+
userdownloads = 0x40000002,
|
|
22
|
+
bluetooth = -0x40000000,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @see https://developer.apple.com/documentation/corelocation/clauthorizationstatus
|
|
27
|
+
*/
|
|
28
|
+
export enum AuthorizationStatus {
|
|
29
|
+
notDetermined = 0,
|
|
30
|
+
restricted = 1,
|
|
31
|
+
denied = 2,
|
|
32
|
+
authorizedAlways = 3,
|
|
33
|
+
authorizedWhenInUse = 4,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Thermal state of an iOS device.
|
|
38
|
+
*
|
|
39
|
+
* Returned (since iOS 11.0) within a {@linkcode DeviceInfo} response.
|
|
40
|
+
* @see https://developer.apple.com/documentation/foundation/nsprocessinfothermalstate
|
|
41
|
+
*/
|
|
42
|
+
export enum ThermalState {
|
|
43
|
+
/**
|
|
44
|
+
* The thermal state is within normal limits.
|
|
45
|
+
*/
|
|
46
|
+
NSProcessInfoThermalStateNominal = 0,
|
|
47
|
+
/**
|
|
48
|
+
* The thermal state is slightly elevated.
|
|
49
|
+
*/
|
|
50
|
+
NSProcessInfoThermalStateFair = 1,
|
|
51
|
+
/**
|
|
52
|
+
* The thermal state is high.
|
|
53
|
+
*/
|
|
54
|
+
NSProcessInfoThermalStateSerious = 2,
|
|
55
|
+
/**
|
|
56
|
+
* The thermal state is significantly impacting the performance of the system and the device needs to cool down.
|
|
57
|
+
*/
|
|
58
|
+
NSProcessInfoThermalStateCritical = 3,
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Application state code.
|
|
62
|
+
* @see https://developer.apple.com/documentation/xctest/xcuiapplicationstate?language=objc
|
|
63
|
+
*/
|
|
64
|
+
export enum AppState {
|
|
65
|
+
/**
|
|
66
|
+
* The application's current state is not known.
|
|
67
|
+
*/
|
|
68
|
+
XCUIApplicationStateUnknown = 0,
|
|
69
|
+
/**
|
|
70
|
+
* The application is not running
|
|
71
|
+
*/
|
|
72
|
+
XCUIApplicationStateNotRunning = 1,
|
|
73
|
+
/**
|
|
74
|
+
* The application is running in the background, but is suspended.
|
|
75
|
+
*/
|
|
76
|
+
XCUIApplicationStateRunningBackgroundSuspended = 2,
|
|
77
|
+
/**
|
|
78
|
+
* The application is running in the background.
|
|
79
|
+
*/
|
|
80
|
+
XCUIApplicationStateRunningBackground = 3,
|
|
81
|
+
/**
|
|
82
|
+
* The application is running in the foreground.
|
|
83
|
+
*/
|
|
84
|
+
XCUIApplicationStateRunningForeground = 4,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Battery state
|
|
89
|
+
* @see {@linkcode BatteryInfo}
|
|
90
|
+
*/
|
|
91
|
+
export enum BatteryState {
|
|
92
|
+
/**
|
|
93
|
+
* The battery state is unknown.
|
|
94
|
+
*/
|
|
95
|
+
UIDeviceBatteryStateUnknown = 0,
|
|
96
|
+
/**
|
|
97
|
+
* The device is running on battery and discharging.
|
|
98
|
+
*/
|
|
99
|
+
UIDeviceBatteryStateUnplugged = 1,
|
|
100
|
+
/**
|
|
101
|
+
* The device is plugged in, less than 100%, and charging.
|
|
102
|
+
*/
|
|
103
|
+
UIDeviceBatteryStateCharging = 2,
|
|
104
|
+
/**
|
|
105
|
+
* The device is plugged in and is at 100% charge.
|
|
106
|
+
*/
|
|
107
|
+
UIDeviceBatteryStateFull = 3,
|
|
108
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import {XCUITestDriver} from '../driver';
|
|
3
|
+
import {errors, errorFromCode, errorFromW3CJsonCode} from 'appium/driver';
|
|
4
|
+
import {util} from 'appium/support';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Collect the response of an async script execution
|
|
8
|
+
* @this {XCUITestDriver}
|
|
9
|
+
* @deprecated
|
|
10
|
+
* @privateRemarks It's unclear what this is for. Don't use it.
|
|
11
|
+
*/
|
|
12
|
+
export async function receiveAsyncResponse(status, value) {
|
|
13
|
+
this.log.debug(`Received async response: ${JSON.stringify(value)}`);
|
|
14
|
+
if (!util.hasValue(this.asyncPromise)) {
|
|
15
|
+
this.log.warn(
|
|
16
|
+
`Received async response when we were not expecting one! ` +
|
|
17
|
+
`Response was: ${JSON.stringify(value)}`,
|
|
18
|
+
);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (util.hasValue(status) && status !== 0) {
|
|
23
|
+
// MJSONWP
|
|
24
|
+
return this.asyncPromise.reject(errorFromCode(status, value.message));
|
|
25
|
+
}
|
|
26
|
+
if (!util.hasValue(status) && value && _.isString(value.error)) {
|
|
27
|
+
// W3C
|
|
28
|
+
return this.asyncPromise.reject(
|
|
29
|
+
errorFromW3CJsonCode(value.error, value.message, value.stacktrace),
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
return this.asyncPromise.resolve(value);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @template {ExecuteMethodArgs} [TArgs = unknown[]]
|
|
37
|
+
* @template [TReturn = unknown]
|
|
38
|
+
* @param {string} script - Either a script to run, or in the case of an Execute Method, the name of the script to execute.
|
|
39
|
+
* @param {TArgs} [args]
|
|
40
|
+
* @this {XCUITestDriver}
|
|
41
|
+
* @returns {Promise<TReturn>}
|
|
42
|
+
*/
|
|
43
|
+
export async function execute(script, args) {
|
|
44
|
+
// TODO: create a type that converts args to the parameters of the associated method using the `command` prop of `executeMethodMap`
|
|
45
|
+
script = script.trim().replace(/^mobile:\s*/, 'mobile: ');
|
|
46
|
+
if (isExecuteMethod(script)) {
|
|
47
|
+
const executeMethodArgs = preprocessExecuteMethodArgs(script, args);
|
|
48
|
+
return await this.executeMethod(script, [executeMethodArgs]);
|
|
49
|
+
} else if (this.isWebContext()) {
|
|
50
|
+
const atomsArgs = this.convertElementsForAtoms(/** @type {readonly any[]} */ (args));
|
|
51
|
+
const result = await this.executeAtom('execute_script', [script, atomsArgs]);
|
|
52
|
+
return this.cacheWebElements(result);
|
|
53
|
+
} else {
|
|
54
|
+
throw new errors.NotImplementedError();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @this {XCUITestDriver}
|
|
60
|
+
* @group Mobile Web Only
|
|
61
|
+
*/
|
|
62
|
+
export async function executeAsync(script, args) {
|
|
63
|
+
if (!this.isWebContext()) {
|
|
64
|
+
throw new errors.NotImplementedError();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
args = this.convertElementsForAtoms(args);
|
|
68
|
+
this.asyncWaitMs = this.asyncWaitMs || 0;
|
|
69
|
+
const promise = (/** @type {import('appium-remote-debugger').RemoteDebugger} */ (this.remote)).executeAtomAsync(
|
|
70
|
+
'execute_async_script',
|
|
71
|
+
[script, args, this.asyncWaitMs],
|
|
72
|
+
this.curWebFrames,
|
|
73
|
+
);
|
|
74
|
+
return this.cacheWebElements(await this.waitForAtom(promise));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Checks if script expects a particular parameter (either optional or required).
|
|
80
|
+
* @template {keyof XCUITestDriver.executeMethodMap} Script
|
|
81
|
+
* @param {Script} script - Script name
|
|
82
|
+
* @param {string} param - Parameter name
|
|
83
|
+
* @returns {boolean}
|
|
84
|
+
*/
|
|
85
|
+
function executeMethodExpectsParam(script, param) {
|
|
86
|
+
/** @type {ReadonlyArray<string>|undefined} */
|
|
87
|
+
let required;
|
|
88
|
+
/** @type {ReadonlyArray<string>|undefined} */
|
|
89
|
+
let optional;
|
|
90
|
+
const execMethodDef = XCUITestDriver.executeMethodMap[script];
|
|
91
|
+
if ('params' in execMethodDef) {
|
|
92
|
+
if ('required' in execMethodDef.params) {
|
|
93
|
+
required = execMethodDef.params.required;
|
|
94
|
+
}
|
|
95
|
+
if ('optional' in execMethodDef.params) {
|
|
96
|
+
optional = execMethodDef.params.optional;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const allParams = new Set(_.flatten([...(required ?? []), ...(optional ?? [])]));
|
|
100
|
+
return allParams.has(param);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @param {any} script
|
|
105
|
+
* @returns {script is keyof XCUITestDriver.executeMethodMap}
|
|
106
|
+
*/
|
|
107
|
+
function isExecuteMethod(script) {
|
|
108
|
+
return script in XCUITestDriver.executeMethodMap;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Massages the arguments going into an execute method.
|
|
113
|
+
* @param {keyof XCUITestDriver.executeMethodMap} script
|
|
114
|
+
* @param {ExecuteMethodArgs} [args]
|
|
115
|
+
* @returns {StringRecord<unknown>}
|
|
116
|
+
*/
|
|
117
|
+
function preprocessExecuteMethodArgs(script, args) {
|
|
118
|
+
if (_.isArray(args)) {
|
|
119
|
+
args = _.first(args);
|
|
120
|
+
}
|
|
121
|
+
const executeMethodArgs = /** @type {StringRecord<unknown>} */ (args ?? {});
|
|
122
|
+
/**
|
|
123
|
+
* Renames the deprecated `element` key to `elementId`. Historically,
|
|
124
|
+
* all of the pre-Execute-Method-Map execute methods accepted an `element` _or_ and `elementId` param.
|
|
125
|
+
* This assigns the `element` value to `elementId` if `elementId` is not already present.
|
|
126
|
+
*/
|
|
127
|
+
if (!('elementId' in executeMethodArgs) && 'element' in executeMethodArgs) {
|
|
128
|
+
executeMethodArgs.elementId = executeMethodArgs.element;
|
|
129
|
+
delete executeMethodArgs.element;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Automatically unwraps the `elementId` prop _if and only if_ the execute method expects it.
|
|
134
|
+
*
|
|
135
|
+
* Most of these Execute Methods (typically beginning with `mobile*`) will accept an `Element|string` for `elementId`, in practice they will only ever get a `string`. `Element|string` in the method's docstring is simply for documentation purposes.
|
|
136
|
+
*/
|
|
137
|
+
if ('elementId' in executeMethodArgs && executeMethodExpectsParam(script, 'elementId')) {
|
|
138
|
+
executeMethodArgs.elementId = util.unwrapElement(
|
|
139
|
+
/** @type {import('@appium/types').Element|string} */ (executeMethodArgs.elementId),
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return executeMethodArgs;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* @template [T=any]
|
|
148
|
+
* @typedef {import('@appium/types').StringRecord<T>} StringRecord
|
|
149
|
+
*/
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* @typedef {readonly any[] | readonly [StringRecord] | Readonly<StringRecord>} ExecuteMethodArgs
|
|
153
|
+
*/
|