@devicelab/maestro-runner-darwin-x64 1.1.25
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/LICENSE +191 -0
- package/README.md +166 -0
- package/THIRD_PARTY_LICENSES +186 -0
- package/bin/maestro-runner +0 -0
- package/drivers/android/appium-uiautomator2-server-debug-androidTest.apk +0 -0
- package/drivers/android/appium-uiautomator2-server-v9.11.1.apk +0 -0
- package/drivers/android/devicelab-android-driver-test.apk +0 -0
- package/drivers/android/devicelab-android-driver.apk +0 -0
- package/drivers/android/settings_apk-debug.apk +0 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunner/App.swift +11 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunner.xcodeproj/project.pbxproj +523 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/ATTRIBUTION.md +73 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/Bridging-Header.h +4 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/PixelDiff.swift +72 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/PrivateHeaders/XCTest/XCPointerEventPath.h +43 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h +32 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/PrivateHeaders/XCTest/XCUIApplication+ActiveApp.h +23 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/PrivateHeaders/XCTest/XCUIDevice.h +30 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerObjCExceptionCatcher.h +11 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerObjCExceptionCatcher.m +16 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Alert.swift +155 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+CommandExecution.swift +961 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Environment.swift +37 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Interaction.swift +1864 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Lifecycle.swift +351 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Media.swift +81 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Models.swift +258 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+ScreenRecorder.swift +279 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Snapshot.swift +703 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+SystemModal.swift +230 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+Transport.swift +137 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests+TvRemote.swift +185 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/RunnerTests.swift +197 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/SnapshotParams.h +28 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/SnapshotParams.m +49 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/SyntheticTyping.h +17 -0
- package/drivers/ios/DevicelabIOSRunner/DevicelabIOSRunnerUITests/SyntheticTyping.m +86 -0
- package/drivers/ios/DevicelabIOSRunner/PROTOCOL.md +258 -0
- package/drivers/ios/DevicelabIOSRunner/README.md +38 -0
- package/drivers/ios/DevicelabIOSRunner/project.yml +49 -0
- package/drivers/ios/WebDriverAgent/.github/ISSUE_TEMPLATE.md +4 -0
- package/drivers/ios/WebDriverAgent/.github/actions/xcode-setup/action.yml +32 -0
- package/drivers/ios/WebDriverAgent/.github/dependabot.yml +22 -0
- package/drivers/ios/WebDriverAgent/.github/workflows/functional-test.yml +62 -0
- package/drivers/ios/WebDriverAgent/.github/workflows/pr-title.yml +10 -0
- package/drivers/ios/WebDriverAgent/.github/workflows/publish.js.yml +105 -0
- package/drivers/ios/WebDriverAgent/.github/workflows/unit-test.yml +30 -0
- package/drivers/ios/WebDriverAgent/.github/workflows/wda-package.yml +107 -0
- package/drivers/ios/WebDriverAgent/.github/workflows/wda-tests.yml +221 -0
- package/drivers/ios/WebDriverAgent/.mocharc.js +4 -0
- package/drivers/ios/WebDriverAgent/.releaserc +45 -0
- package/drivers/ios/WebDriverAgent/CHANGELOG.md +1547 -0
- package/drivers/ios/WebDriverAgent/CONTRIBUTING.md +35 -0
- package/drivers/ios/WebDriverAgent/Configurations/IOSSettings.xcconfig +31 -0
- package/drivers/ios/WebDriverAgent/Configurations/IOSTestSettings.xcconfig +1 -0
- package/drivers/ios/WebDriverAgent/Configurations/TVOSSettings.xcconfig +31 -0
- package/drivers/ios/WebDriverAgent/Configurations/TVOSTestSettings.xcconfig +1 -0
- package/drivers/ios/WebDriverAgent/Fastlane/Fastfile +13 -0
- package/drivers/ios/WebDriverAgent/Gemfile +3 -0
- package/drivers/ios/WebDriverAgent/LICENSE +30 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/AccessibilityUtilities/AXSettings.h +15 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/MobileCoreServices/LSApplicationWorkspace.h +127 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/TextInput/TIPreferencesController.h +45 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/UIKitCore/UIKeyboardImpl.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/CDStructures.h +28 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/NSString-XCTAdditions.h +11 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/NSValue-XCTestAdditions.h +11 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/UIGestureRecognizer-RecordingAdditions.h +11 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/UILongPressGestureRecognizer-RecordingAdditions.h +11 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/UIPanGestureRecognizer-RecordingAdditions.h +11 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/UIPinchGestureRecognizer-RecordingAdditions.h +11 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/UISwipeGestureRecognizer-RecordingAdditions.h +11 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/UITapGestureRecognizer-RecordingAdditions.h +11 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCAXClient_iOS.h +55 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCActivityRecord.h +39 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCApplicationMonitor.h +44 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCApplicationMonitor_iOS.h +18 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCApplicationQuery.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCDebugLogDelegate-Protocol.h +11 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCDeviceEvent.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCEventGenerator.h +73 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCKeyMappingPath.h +36 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCKeyboardInputSolver.h +41 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCKeyboardKeyMap.h +101 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCKeyboardLayout.h +35 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCPointerEvent.h +30 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCPointerEventPath.h +43 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCSourceCodeRecording.h +42 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCSourceCodeTreeNode.h +84 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCSourceCodeTreeNodeEnumerator.h +18 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCSymbolicationRecord.h +29 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCSymbolicatorHolder.h +14 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h +32 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTAXClient-Protocol.h +14 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTAsyncActivity-Protocol.h +16 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTAsyncActivity.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTAutomationTarget-Protocol.h +12 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTDarwinNotificationExpectation.h +23 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTElementSetTransformer-Protocol.h +18 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTKVOExpectation.h +28 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTMetric.h +29 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTNSNotificationExpectation.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTNSPredicateExpectation.h +24 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTNSPredicateExpectationObject-Protocol.h +15 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRunnerAutomationSession.h +21 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRunnerDaemonSession.h +98 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTRunnerIDESession.h +65 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTTestRunSession.h +25 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTTestRunSessionDelegate-Protocol.h +17 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTUIApplicationMonitor-Protocol.h +17 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTWaiter.h +55 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTWaiterDelegate-Protocol.h +16 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTWaiterDelegatePrivate-Protocol.h +12 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTWaiterManagement-Protocol.h +13 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTWaiterManager.h +28 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTest.h +34 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestCase.h +102 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestCaseRun.h +18 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestCaseSuite.h +19 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestConfiguration.h +66 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestContext.h +26 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestContextScope.h +19 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestDriver.h +38 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestDriverInterface-Protocol.h +14 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestExpectation.h +39 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestExpectationDelegate-Protocol.h +14 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestExpectationWaiter.h +17 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestLog.h +32 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestManager_IDEInterface-Protocol.h +36 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestManager_ManagerInterface-Protocol.h +54 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestManager_TestsInterface-Protocol.h +12 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestMisuseObserver.h +37 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestObservation-Protocol.h +20 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestObservationCenter.h +36 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestObserver.h +20 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestProbe.h +13 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestRun.h +39 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestSuite.h +48 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestSuiteRun.h +28 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCTestWaiter.h +14 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplication.h +60 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationImpl.h +38 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIApplicationProcess.h +85 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUICoordinate.h +44 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIDevice.h +30 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIElement.h +74 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIElementAsynchronousHandlerWrapper.h +19 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIElementHitPointCoordinate.h +24 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIElementQuery.h +70 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIHitPointResult.h +20 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIRecorderNodeFinder.h +65 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIRecorderNodeFinderMatch.h +25 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIRecorderTimingMessage.h +20 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIRecorderUtilities.h +45 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIScreen.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/XCUIScreenDataSource-Protocol.h +19 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCInternalTestRun.h +43 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCKVOExpectationImplementation.h +32 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTDarwinNotificationExpectationImplementation.h +27 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTNSNotificationExpectationImplementation.h +30 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTNSPredicateExpectationImplementation.h +29 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTWaiterImpl.h +41 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestCaseImplementation.h +70 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestCaseInterruptionException.h +13 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestExpectationImplementation.h +40 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestImplementation.h +14 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestObservationCenterImplementation.h +19 -0
- package/drivers/ios/WebDriverAgent/PrivateHeaders/XCTest/_XCTestSuiteImplementation.h +23 -0
- package/drivers/ios/WebDriverAgent/README.md +56 -0
- package/drivers/ios/WebDriverAgent/Scripts/build-webdriveragent.mjs +85 -0
- package/drivers/ios/WebDriverAgent/Scripts/build.sh +124 -0
- package/drivers/ios/WebDriverAgent/Scripts/ci/build-real.sh +24 -0
- package/drivers/ios/WebDriverAgent/Scripts/ci/build-sim.sh +15 -0
- package/drivers/ios/WebDriverAgent/Scripts/fetch-prebuilt-wda.mjs +69 -0
- package/drivers/ios/WebDriverAgent/Scripts/update-wda-version.mjs +42 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/project.pbxproj +4547 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp.xcscheme +87 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_1.xcscheme +86 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_2.xcscheme +86 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_3.xcscheme +86 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib.xcscheme +125 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_tvOS.xcscheme +95 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner-nodebug.xcscheme +87 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner.xcscheme +114 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_tvOS.xcscheme +123 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/FBXCElementSnapshotWrapper+Helpers.h +100 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/FBXCElementSnapshotWrapper+Helpers.m +192 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/NSDictionary+FBUtf8SafeDictionary.h +39 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/NSDictionary+FBUtf8SafeDictionary.m +87 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/NSExpression+FBFormat.h +29 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/NSExpression+FBFormat.m +34 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/NSString+FBVisualLength.h +18 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/NSString+FBVisualLength.m +18 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/NSString+FBXMLSafeString.h +27 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/NSString+FBXMLSafeString.m +30 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCAXClient_iOS+FBSnapshotReqParams.h +25 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCAXClient_iOS+FBSnapshotReqParams.m +82 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCTIssue+FBPatcher.h +17 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCTIssue+FBPatcher.m +35 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBAlert.h +23 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBAlert.m +109 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBFocused.h +23 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.h +171 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m +645 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBQuiescence.h +24 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBQuiescence.m +28 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBTouchAction.h +29 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBTouchAction.m +75 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBUIInterruptions.h +22 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplication+FBUIInterruptions.m +31 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplicationProcess+FBQuiescence.h +27 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIApplicationProcess+FBQuiescence.m +118 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIDevice+FBHealthCheck.h +30 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIDevice+FBHealthCheck.m +47 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.h +193 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m +388 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h +38 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m +68 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBAccessibility.h +29 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBAccessibility.m +50 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBCaching.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBCaching.m +36 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBClassChain.h +57 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBClassChain.m +98 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBCustomActions.h +27 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBCustomActions.m +127 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBFind.h +75 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBFind.m +133 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.h +38 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBForceTouch.m +52 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.h +28 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBIsVisible.m +78 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBMinMax.h +33 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBMinMax.m +75 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.h +45 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.m +58 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBResolve.h +37 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBResolve.m +51 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.h +98 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.m +342 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBSwiping.h +38 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBSwiping.m +56 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.h +35 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBTVFocuse.m +71 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBTyping.h +64 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m +199 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBUID.h +42 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBUID.m +85 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBUtilities.h +106 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBUtilities.m +170 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBVisibleFrame.h +35 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBVisibleFrame.m +52 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBWebDriverAttributes.h +32 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElement+FBWebDriverAttributes.m +294 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElementQuery+FBHelpers.h +28 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Categories/XCUIElementQuery+FBHelpers.m +46 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBAlertViewCommands.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBAlertViewCommands.m +130 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBCustomCommands.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBCustomCommands.m +633 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBDebugCommands.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBDebugCommands.m +81 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBElementCommands.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBElementCommands.m +705 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBFindElementCommands.h +18 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBFindElementCommands.m +186 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBOrientationCommands.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBOrientationCommands.m +185 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBScreenshotCommands.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBScreenshotCommands.m +40 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBSessionCommands.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBSessionCommands.m +594 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBTouchActionCommands.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBTouchActionCommands.m +41 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBTouchIDCommands.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBTouchIDCommands.m +30 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBUnknownCommands.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBUnknownCommands.m +39 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBVideoCommands.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Commands/FBVideoCommands.m +84 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/FBAlert.h +91 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/FBAlert.m +274 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Info.plist +26 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBCommandHandler.h +38 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBCommandStatus.h +80 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBCommandStatus.m +279 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBElement.h +95 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBElementCache.h +61 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBElementCache.m +100 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBElementUtils.h +76 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBElementUtils.m +153 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBExceptionHandler.h +29 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBExceptionHandler.m +58 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBExceptions.h +60 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBExceptions.m +24 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBHTTPStatusCodes.h +581 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBResponseJSONPayload.h +29 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBResponseJSONPayload.m +59 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBResponsePayload.h +74 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBResponsePayload.m +148 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBRoute.h +77 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBRoute.m +174 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBRouteRequest-Private.h +20 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBRouteRequest.h +39 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBRouteRequest.m +32 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBScreenRecordingContainer.h +56 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBScreenRecordingContainer.m +72 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBScreenRecordingPromise.h +29 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBScreenRecordingPromise.m +31 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBScreenRecordingRequest.h +39 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBScreenRecordingRequest.m +94 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBSession-Private.h +26 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBSession.h +141 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBSession.m +295 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBTCPSocket.h +65 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBTCPSocket.m +85 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBWebServer.h +52 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBWebServer.m +248 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBXCAccessibilityElement.h +34 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBXCAccessibilityElement.m +17 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBXCDeviceEvent.h +34 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBXCDeviceEvent.m +42 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBXCElementSnapshot.h +82 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBXCElementSnapshot.m +9 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBXCElementSnapshotWrapper.h +29 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Routing/FBXCElementSnapshotWrapper.m +114 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBAccessibilityTraits.h +20 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBAccessibilityTraits.m +61 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBActiveAppDetectionPoint.h +56 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBActiveAppDetectionPoint.m +87 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBAlertsMonitor.h +51 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBAlertsMonitor.m +94 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBBaseActionsSynthesizer.h +131 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBBaseActionsSynthesizer.m +165 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBCapabilities.h +45 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBCapabilities.m +25 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBClassChainQueryParser.h +99 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBClassChainQueryParser.m +666 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBConfiguration.h +403 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBConfiguration.m +711 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBDebugLogDelegateDecorator.h +26 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBDebugLogDelegateDecorator.m +49 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBElementHelpers.h +29 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBElementHelpers.m +21 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBElementTypeTransformer.h +45 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBElementTypeTransformer.m +149 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBErrorBuilder.h +64 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBErrorBuilder.m +75 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBFailureProofTestCase.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBFailureProofTestCase.m +68 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBImageProcessor.h +55 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBImageProcessor.m +170 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBImageUtils.h +25 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBImageUtils.m +80 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBKeyboard.h +37 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBKeyboard.m +123 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBLogger.h +32 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBLogger.m +47 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBMacros.h +57 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBMathUtils.h +36 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBMathUtils.m +63 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBMjpegServer.h +24 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBMjpegServer.m +151 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBNotificationsHelper.h +37 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBNotificationsHelper.m +29 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBPasteboard.h +40 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBPasteboard.m +172 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBProtocolHelpers.h +46 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBProtocolHelpers.m +144 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBReflectionUtils.h +23 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBReflectionUtils.m +31 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBRunLoopSpinner.h +77 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBRunLoopSpinner.m +94 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBRuntimeUtils.h +79 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBRuntimeUtils.m +112 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBScreen.h +22 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBScreen.m +21 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBScreenshot.h +44 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBScreenshot.m +227 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBSettings.h +48 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBSettings.m +42 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBTVNavigationTracker-Private.h +27 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBTVNavigationTracker.h +52 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBTVNavigationTracker.m +142 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBUnattachedAppLauncher.h +26 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBUnattachedAppLauncher.m +21 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBW3CActionsHelpers.h +42 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBW3CActionsHelpers.m +119 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.h +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.m +885 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBWebServerParams.h +22 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBWebServerParams.m +23 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXCAXClientProxy.h +49 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXCAXClientProxy.m +119 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXCTestDaemonsProxy.h +45 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXCTestDaemonsProxy.m +359 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXCodeCompatibility.h +80 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXCodeCompatibility.m +99 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXMLGenerationOptions.h +45 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXMLGenerationOptions.m +25 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXPath-Private.h +56 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXPath.h +59 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/FBXPath.m +979 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/LRUCache/LRUCache.h +66 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/LRUCache/LRUCache.m +146 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/LRUCache/LRUCacheNode.h +43 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/LRUCache/LRUCacheNode.m +51 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/NSPredicate+FBFormat.h +42 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/NSPredicate+FBFormat.m +69 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/XCTestPrivateSymbols.h +78 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/XCTestPrivateSymbols.m +107 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/XCUIApplicationProcessDelay.h +37 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Utilities/XCUIApplicationProcessDelay.m +83 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncSocket.h +1220 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncSocket.m +8812 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncUdpSocket.h +1036 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncUdpSocket.m +5868 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDNumber.h +12 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDNumber.m +88 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDRange.h +56 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDRange.m +106 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPConnection.h +107 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPConnection.m +2238 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPLogging.h +122 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPMessage.h +53 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPMessage.m +357 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPResponse.h +149 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPServer.h +126 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPServer.m +372 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/LICENSE +18 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPDataResponse.h +13 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPDataResponse.m +83 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPErrorResponse.h +9 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPErrorResponse.m +40 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/HTTPResponseProxy.h +13 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/HTTPResponseProxy.m +84 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/LICENSE +19 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/Route.h +18 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/Route.m +11 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteRequest.h +16 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteRequest.m +50 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteResponse.h +20 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteResponse.m +66 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingConnection.h +5 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingConnection.m +142 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.h +55 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.m +303 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentLib/WebDriverAgentLib.h +59 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentRunner/Info.plist +30 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentRunner/UITestingUITests.m +58 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/AppDelegate.h +14 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/AppDelegate.m +38 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/FBAlertViewController.h +14 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/FBAlertViewController.m +82 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/FBNavigationController.h +12 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/FBNavigationController.m +25 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/FBScrollViewController.h +13 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/FBScrollViewController.m +39 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/FBTableDataSource.h +16 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/FBTableDataSource.m +35 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/SceneDelegate.h +20 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/SceneDelegate.m +48 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/TouchSpotView.h +17 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/TouchSpotView.m +28 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/TouchViewController.h +23 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/TouchViewController.m +29 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/TouchableView.h +29 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/TouchableView.m +108 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/ViewController.h +12 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Classes/ViewController.m +88 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Info.plist +71 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/Resources/Base.lproj/Main.storyboard +620 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationApp/main.m +15 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBAlertTests.m +194 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBAutoAlertsHandlerTests.m +73 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBConfigurationTests.m +38 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBElementAttributeTests.m +264 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBElementSwipingTests.m +127 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBElementVisibilityTests.m +73 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBFailureProofTestCaseTests.m +41 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBForceTouchTests.m +85 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBImageProcessorTests.m +82 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.h +76 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBIntegrationTestCase.m +140 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBKeyboardTests.m +61 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBPasteboardTests.m +91 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBPickerWheelSelectTests.m +55 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBSafariAlertTests.m +73 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBScreenTests.m +31 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBScrollingTests.m +126 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBSessionIntegrationTests.m +131 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBTapTest.m +103 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBTestMacros.h +33 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBTypingTest.m +68 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBVideoRecordingTests.m +64 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBW3CMultiTouchActionsIntegrationTests.m +124 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBW3CTouchActionsIntegrationTests.m +491 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBW3CTypeActionsTests.m +184 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/FBXPathIntegrationTests.m +157 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/Info.plist +24 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCElementSnapshotHelperTests.m +211 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCElementSnapshotHitPointTests.m +30 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCUIApplicationHelperTests.m +162 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCUIDeviceHealthCheckTests.m +27 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCUIDeviceHelperTests.m +220 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCUIDeviceRotationTests.m +84 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCUIElementAttributesTests.m +248 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCUIElementFBFindTests.m +472 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/IntegrationTests/XCUIElementHelperIntegrationTests.m +51 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/Doubles/XCElementSnapshotDouble.h +16 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/Doubles/XCElementSnapshotDouble.m +110 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/Doubles/XCUIApplicationDouble.h +17 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/Doubles/XCUIApplicationDouble.m +66 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/Doubles/XCUIElementDouble.h +51 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/Doubles/XCUIElementDouble.m +104 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBClassChainTests.m +313 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBConfigurationTests.m +60 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBElementCacheTests.m +124 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBElementTypeTransformerTests.m +45 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBElementUtilitiesTests.m +36 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBErrorBuilderTests.m +61 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBExceptionHandlerTests.m +59 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBLRUCacheTests.m +127 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBMathUtilsTests.m +113 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBProtocolHelpersTests.m +81 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBRouteTests.m +129 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBRunLoopSpinnerTests.m +98 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBRuntimeUtilsTests.m +45 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBSDKVersionTests.m +66 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBSessionTests.m +67 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBXMLSafeStringTests.m +35 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/FBXPathTests.m +155 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/Info.plist +24 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/NSDictionaryFBUtf8SafeTests.m +34 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/NSExpressionFBFormatTests.m +60 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/NSPredicateFBFormatTests.m +72 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests/XCUIElementHelpersTests.m +50 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests_tvOS/Doubles/XCUIElementDouble.h +46 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests_tvOS/Doubles/XCUIElementDouble.m +80 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests_tvOS/FBTVNavigationTrackerTests.m +86 -0
- package/drivers/ios/WebDriverAgent/WebDriverAgentTests/UnitTests_tvOS/Info.plist +24 -0
- package/drivers/ios/WebDriverAgent/eslint.config.mjs +13 -0
- package/drivers/ios/WebDriverAgent/index.ts +7 -0
- package/drivers/ios/WebDriverAgent/lib/check-dependencies.ts +34 -0
- package/drivers/ios/WebDriverAgent/lib/constants.ts +18 -0
- package/drivers/ios/WebDriverAgent/lib/logger.ts +3 -0
- package/drivers/ios/WebDriverAgent/lib/no-session-proxy.ts +25 -0
- package/drivers/ios/WebDriverAgent/lib/types.ts +139 -0
- package/drivers/ios/WebDriverAgent/lib/utils.ts +342 -0
- package/drivers/ios/WebDriverAgent/lib/webdriveragent.ts +715 -0
- package/drivers/ios/WebDriverAgent/lib/xcodebuild.ts +488 -0
- package/drivers/ios/WebDriverAgent/package.json +102 -0
- package/drivers/ios/WebDriverAgent/test/functional/desired.ts +7 -0
- package/drivers/ios/WebDriverAgent/test/functional/helpers/simulator.ts +34 -0
- package/drivers/ios/WebDriverAgent/test/functional/webdriveragent-e2e-specs.ts +119 -0
- package/drivers/ios/WebDriverAgent/test/unit/utils-specs.ts +157 -0
- package/drivers/ios/WebDriverAgent/test/unit/webdriveragent-specs.ts +446 -0
- package/drivers/ios/WebDriverAgent/tsconfig.json +16 -0
- package/package.json +16 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RunnerTests.swift
|
|
3
|
+
// AgentDeviceRunnerUITests
|
|
4
|
+
//
|
|
5
|
+
// Created by Michał Pierzchała on 30/01/2026.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import XCTest
|
|
9
|
+
import Network
|
|
10
|
+
#if canImport(UIKit)
|
|
11
|
+
import UIKit
|
|
12
|
+
typealias RunnerImage = UIImage
|
|
13
|
+
#elseif canImport(AppKit)
|
|
14
|
+
import AppKit
|
|
15
|
+
typealias RunnerImage = NSImage
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
final class RunnerTests: XCTestCase {
|
|
19
|
+
enum RunnerErrorDomain {
|
|
20
|
+
static let general = "AgentDeviceRunner"
|
|
21
|
+
static let exception = "AgentDeviceRunner.NSException"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
enum RunnerErrorCode {
|
|
25
|
+
static let noResponseFromMainThread = 1
|
|
26
|
+
static let commandReturnedNoResponse = 2
|
|
27
|
+
static let mainThreadExecutionTimedOut = 3
|
|
28
|
+
static let objcException = 1
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
static let springboardBundleId = "com.apple.springboard"
|
|
32
|
+
static let defaultRecordingFps: Int32 = 15
|
|
33
|
+
static let maxListenerRetries = 5
|
|
34
|
+
static let listenerRetryDelay: TimeInterval = 1.0
|
|
35
|
+
var listener: NWListener?
|
|
36
|
+
var listenerRetriesRemaining = RunnerTests.maxListenerRetries
|
|
37
|
+
var doneExpectation: XCTestExpectation?
|
|
38
|
+
let app = XCUIApplication()
|
|
39
|
+
lazy var springboard = XCUIApplication(bundleIdentifier: Self.springboardBundleId)
|
|
40
|
+
var currentApp: XCUIApplication?
|
|
41
|
+
var currentBundleId: String?
|
|
42
|
+
let maxRequestBytes = 2 * 1024 * 1024
|
|
43
|
+
let maxSnapshotElements = 600
|
|
44
|
+
let fastSnapshotLimit = 300
|
|
45
|
+
let mainThreadExecutionTimeout: TimeInterval = 30
|
|
46
|
+
let appExistenceTimeout: TimeInterval = 30
|
|
47
|
+
let retryCooldown: TimeInterval = 0.2
|
|
48
|
+
// Local edit (not in upstream agent-device): post-snapshot/post-activate
|
|
49
|
+
// stabilization windows shortened from 0.2 / 0.25 s. Upstream value gives
|
|
50
|
+
// an AI-driven runner time for layout to settle between a read and the
|
|
51
|
+
// next interaction; maestro-runner's snapshot is part of selector
|
|
52
|
+
// resolution that's immediately followed by an interaction at a known
|
|
53
|
+
// coordinate, so a 50ms window is enough to absorb any in-flight UIKit
|
|
54
|
+
// layout pass without paying for hypothetical agent latency.
|
|
55
|
+
let postSnapshotInteractionDelay: TimeInterval = 0.05
|
|
56
|
+
let firstInteractionAfterActivateDelay: TimeInterval = 0.1
|
|
57
|
+
let scrollInteractionIdleTimeoutDefault: TimeInterval = 1.0
|
|
58
|
+
let tvRemoteDoublePressDelayDefault: TimeInterval = 0.0
|
|
59
|
+
let minRecordingFps = 1
|
|
60
|
+
let maxRecordingFps = 120
|
|
61
|
+
let minRecordingQuality = 5
|
|
62
|
+
let maxRecordingQuality = 10
|
|
63
|
+
var needsPostSnapshotInteractionDelay = false
|
|
64
|
+
var needsFirstInteractionDelay = false
|
|
65
|
+
// Local extension: cache the most recent idleCheck screenshot so
|
|
66
|
+
// subsequent calls in the same wait loop only need ONE fresh capture.
|
|
67
|
+
var lastIdleScreenshot: (image: RunnerImage, capturedAt: Date)?
|
|
68
|
+
static let idleScreenshotCacheTTL: TimeInterval = 1.0
|
|
69
|
+
var activeRecording: ScreenRecorder?
|
|
70
|
+
let interactiveTypes: Set<XCUIElement.ElementType> = [
|
|
71
|
+
.button,
|
|
72
|
+
.cell,
|
|
73
|
+
.checkBox,
|
|
74
|
+
.collectionView,
|
|
75
|
+
.link,
|
|
76
|
+
.menuItem,
|
|
77
|
+
.picker,
|
|
78
|
+
.searchField,
|
|
79
|
+
.segmentedControl,
|
|
80
|
+
.slider,
|
|
81
|
+
.stepper,
|
|
82
|
+
.switch,
|
|
83
|
+
.tabBar,
|
|
84
|
+
.textField,
|
|
85
|
+
.secureTextField,
|
|
86
|
+
.textView
|
|
87
|
+
]
|
|
88
|
+
// Keep blocker actions narrow to avoid false positives from generic hittable containers.
|
|
89
|
+
let actionableTypes: Set<XCUIElement.ElementType> = [
|
|
90
|
+
.button,
|
|
91
|
+
.cell,
|
|
92
|
+
.link,
|
|
93
|
+
.menuItem,
|
|
94
|
+
.checkBox,
|
|
95
|
+
.switch
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
// MARK: - XCTest Entry
|
|
99
|
+
|
|
100
|
+
override func setUp() {
|
|
101
|
+
continueAfterFailure = true
|
|
102
|
+
// Override XCTest's clipped snapshot request params so element trees are
|
|
103
|
+
// complete on deep React Native hierarchies (matches WDA / devicekit-ios).
|
|
104
|
+
DLApplyCompleteSnapshotParams()
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
@MainActor
|
|
108
|
+
func testCommand() throws {
|
|
109
|
+
doneExpectation = expectation(description: "agent-device command handled")
|
|
110
|
+
NSLog("AGENT_DEVICE_RUNNER_HEADLESS_STARTUP=1")
|
|
111
|
+
let queue = DispatchQueue(label: "agent-device.runner")
|
|
112
|
+
let desiredPort = RunnerEnv.resolvePort()
|
|
113
|
+
NSLog("AGENT_DEVICE_RUNNER_DESIRED_PORT=%d", desiredPort)
|
|
114
|
+
startListener(desiredPort: desiredPort, queue: queue)
|
|
115
|
+
|
|
116
|
+
guard let expectation = doneExpectation else {
|
|
117
|
+
XCTFail("runner expectation was not initialized")
|
|
118
|
+
return
|
|
119
|
+
}
|
|
120
|
+
NSLog("AGENT_DEVICE_RUNNER_WAITING")
|
|
121
|
+
let result = XCTWaiter.wait(for: [expectation], timeout: 24 * 60 * 60)
|
|
122
|
+
NSLog("AGENT_DEVICE_RUNNER_WAIT_RESULT=%@", String(describing: result))
|
|
123
|
+
if result != .completed {
|
|
124
|
+
XCTFail("runner wait ended with \(result)")
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private func startListener(desiredPort: UInt16, queue: DispatchQueue) {
|
|
129
|
+
do {
|
|
130
|
+
let newListener = try makeRunnerListener(desiredPort: desiredPort)
|
|
131
|
+
listener = newListener
|
|
132
|
+
newListener.stateUpdateHandler = { [weak self] state in
|
|
133
|
+
switch state {
|
|
134
|
+
case .ready:
|
|
135
|
+
NSLog("AGENT_DEVICE_RUNNER_LISTENER_READY")
|
|
136
|
+
// A working listener proves recovery — restore the full retry
|
|
137
|
+
// budget so an occasional network-stack hiccup hours apart
|
|
138
|
+
// never accumulates into an exit.
|
|
139
|
+
self?.listenerRetriesRemaining = Self.maxListenerRetries
|
|
140
|
+
if let listenerPort = self?.listener?.port {
|
|
141
|
+
NSLog("AGENT_DEVICE_RUNNER_PORT=%d", listenerPort.rawValue)
|
|
142
|
+
} else {
|
|
143
|
+
NSLog("AGENT_DEVICE_RUNNER_PORT_NOT_SET")
|
|
144
|
+
}
|
|
145
|
+
case .failed(let error):
|
|
146
|
+
self?.handleListenerFailure(error, desiredPort: desiredPort, queue: queue)
|
|
147
|
+
default:
|
|
148
|
+
break
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
newListener.newConnectionHandler = { [weak self] conn in
|
|
152
|
+
conn.start(queue: queue)
|
|
153
|
+
self?.handle(connection: conn)
|
|
154
|
+
}
|
|
155
|
+
newListener.start(queue: queue)
|
|
156
|
+
} catch {
|
|
157
|
+
handleListenerFailure(error, desiredPort: desiredPort, queue: queue)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// The listener failing used to end the session immediately, so any
|
|
162
|
+
// transient failure in the sim's network stack (whose daemons are
|
|
163
|
+
// known to crash-loop on some runtime/Xcode combinations) silently
|
|
164
|
+
// killed the runner mid-session. Rebind on the same port instead —
|
|
165
|
+
// the host only knows this port — and exit only once the budget is
|
|
166
|
+
// exhausted, with the reason in the log for post-mortems.
|
|
167
|
+
private func handleListenerFailure(_ error: Error, desiredPort: UInt16, queue: DispatchQueue) {
|
|
168
|
+
NSLog(
|
|
169
|
+
"AGENT_DEVICE_RUNNER_LISTENER_FAILED=%@ retriesLeft=%d",
|
|
170
|
+
String(describing: error), listenerRetriesRemaining)
|
|
171
|
+
listener?.cancel()
|
|
172
|
+
listener = nil
|
|
173
|
+
guard listenerRetriesRemaining > 0 else {
|
|
174
|
+
NSLog("AGENT_DEVICE_RUNNER_EXIT reason=listener_failed error=%@", String(describing: error))
|
|
175
|
+
doneExpectation?.fulfill()
|
|
176
|
+
return
|
|
177
|
+
}
|
|
178
|
+
listenerRetriesRemaining -= 1
|
|
179
|
+
queue.asyncAfter(deadline: .now() + Self.listenerRetryDelay) { [weak self] in
|
|
180
|
+
self?.startListener(desiredPort: desiredPort, queue: queue)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
private func makeRunnerListener(desiredPort: UInt16) throws -> NWListener {
|
|
185
|
+
if desiredPort > 0, let port = NWEndpoint.Port(rawValue: desiredPort) {
|
|
186
|
+
#if os(macOS)
|
|
187
|
+
let parameters = NWParameters.tcp
|
|
188
|
+
parameters.allowLocalEndpointReuse = true
|
|
189
|
+
parameters.requiredLocalEndpoint = .hostPort(host: "127.0.0.1", port: port)
|
|
190
|
+
return try NWListener(using: parameters)
|
|
191
|
+
#else
|
|
192
|
+
return try NWListener(using: .tcp, on: port)
|
|
193
|
+
#endif
|
|
194
|
+
}
|
|
195
|
+
return try NWListener(using: .tcp)
|
|
196
|
+
}
|
|
197
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#ifndef SnapshotParams_h
|
|
2
|
+
#define SnapshotParams_h
|
|
3
|
+
|
|
4
|
+
#import <Foundation/Foundation.h>
|
|
5
|
+
|
|
6
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Overrides XCTest's accessibility-snapshot request parameters so
|
|
10
|
+
* `XCUIElement.snapshot()` returns a complete tree instead of XCTest's
|
|
11
|
+
* silently-clipped default.
|
|
12
|
+
*
|
|
13
|
+
* XCTest's `-[XCAXClient_iOS defaultParameters]` nominally defaults maxDepth /
|
|
14
|
+
* maxChildren / maxArrayCount to INT_MAX, but in practice the tree is clipped
|
|
15
|
+
* and elements behind modal views are dropped. This swizzles defaultParameters
|
|
16
|
+
* to re-assert generous limits and set `snapshotKeyHonorModalViews=0`, which is
|
|
17
|
+
* exactly what WebDriverAgent and mobile-next/devicekit-ios do. It is the fix
|
|
18
|
+
* for deep React Native trees where native shadow views and modal-obscured
|
|
19
|
+
* content were missing from our snapshot.
|
|
20
|
+
*
|
|
21
|
+
* Idempotent and safe: a no-op if XCAXClient_iOS is unavailable. Call once at
|
|
22
|
+
* runner startup, before the first snapshot.
|
|
23
|
+
*/
|
|
24
|
+
void DLApplyCompleteSnapshotParams(void);
|
|
25
|
+
|
|
26
|
+
NS_ASSUME_NONNULL_END
|
|
27
|
+
|
|
28
|
+
#endif /* SnapshotParams_h */
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#import "SnapshotParams.h"
|
|
2
|
+
|
|
3
|
+
#import <objc/runtime.h>
|
|
4
|
+
|
|
5
|
+
// Original implementation of -[XCAXClient_iOS defaultParameters], captured when
|
|
6
|
+
// we swap in our own so we can start from XCTest's real defaults and only
|
|
7
|
+
// override the keys we care about.
|
|
8
|
+
static NSDictionary *(*dl_original_defaultParameters)(id, SEL) = NULL;
|
|
9
|
+
|
|
10
|
+
// Bounded generous depth. INT_MAX invites runaway cost on pathological trees;
|
|
11
|
+
// 60 matches devicekit-ios and is deep enough for real React Native hierarchies
|
|
12
|
+
// while still defeating XCTest's default clipping.
|
|
13
|
+
static const int kDLSnapshotMaxDepth = 60;
|
|
14
|
+
|
|
15
|
+
static id dl_swizzled_defaultParameters(id self, SEL _cmd) {
|
|
16
|
+
NSDictionary *original =
|
|
17
|
+
dl_original_defaultParameters ? dl_original_defaultParameters(self, _cmd) : @{};
|
|
18
|
+
NSMutableDictionary *merged =
|
|
19
|
+
[NSMutableDictionary dictionaryWithDictionary:(original ?: @{})];
|
|
20
|
+
merged[@"maxDepth"] = @(kDLSnapshotMaxDepth);
|
|
21
|
+
merged[@"maxChildren"] = @(INT_MAX);
|
|
22
|
+
merged[@"maxArrayCount"] = @(INT_MAX);
|
|
23
|
+
// 0 == do NOT honor modal views, i.e. keep elements behind a modal/dialog in
|
|
24
|
+
// the snapshot. Our own hittable/occlusion pass still marks obscured elements
|
|
25
|
+
// as non-hittable, so this only adds completeness.
|
|
26
|
+
merged[@"snapshotKeyHonorModalViews"] = @0;
|
|
27
|
+
return [merged copy];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
void DLApplyCompleteSnapshotParams(void) {
|
|
31
|
+
static dispatch_once_t once;
|
|
32
|
+
dispatch_once(&once, ^{
|
|
33
|
+
Class cls = NSClassFromString(@"XCAXClient_iOS");
|
|
34
|
+
if (cls == Nil) {
|
|
35
|
+
NSLog(@"DL_SNAPSHOT_PARAMS: XCAXClient_iOS unavailable; snapshot params unchanged");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
Method method =
|
|
39
|
+
class_getInstanceMethod(cls, NSSelectorFromString(@"defaultParameters"));
|
|
40
|
+
if (method == NULL) {
|
|
41
|
+
NSLog(@"DL_SNAPSHOT_PARAMS: -defaultParameters unavailable; snapshot params unchanged");
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
dl_original_defaultParameters = (NSDictionary * (*)(id, SEL))
|
|
45
|
+
method_setImplementation(method, (IMP)dl_swizzled_defaultParameters);
|
|
46
|
+
NSLog(@"DL_SNAPSHOT_PARAMS: applied (maxDepth=%d, maxChildren=INT_MAX, honorModalViews=0)",
|
|
47
|
+
kDLSnapshotMaxDepth);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#import <Foundation/Foundation.h>
|
|
2
|
+
|
|
3
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
4
|
+
|
|
5
|
+
// Local extension (not in upstream agent-device). Synthesizes typing events
|
|
6
|
+
// via the private XCSynthesizedEventRecord + XCPointerEventPath +
|
|
7
|
+
// XCUIDevice.eventSynthesizer pathway — the same mechanism WebDriverAgent
|
|
8
|
+
// uses for FBTypeText. Unlike XCUIElement.typeText / XCUIApplication.typeText,
|
|
9
|
+
// this does NOT require XCUIElement.hasKeyboardFocus to be true. That is
|
|
10
|
+
// what makes it work for RN SecureTextField on iOS Simulator, where the
|
|
11
|
+
// keyboard appears visually but hasKeyboardFocus stays false and the public
|
|
12
|
+
// typeText APIs silently drop characters.
|
|
13
|
+
//
|
|
14
|
+
// Returns YES on success. Writes a NSError into *outError on failure.
|
|
15
|
+
BOOL DLSendSyntheticTyping(NSString *text, NSUInteger typingSpeed, NSError * _Nullable * _Nullable outError);
|
|
16
|
+
|
|
17
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#import "SyntheticTyping.h"
|
|
2
|
+
#import <UIKit/UIKit.h>
|
|
3
|
+
#import "PrivateHeaders/XCTest/XCSynthesizedEventRecord.h"
|
|
4
|
+
#import "PrivateHeaders/XCTest/XCPointerEventPath.h"
|
|
5
|
+
#import "PrivateHeaders/XCTest/XCUIDevice.h"
|
|
6
|
+
|
|
7
|
+
BOOL DLSendSyntheticTyping(NSString *text, NSUInteger typingSpeed, NSError * _Nullable * _Nullable outError) {
|
|
8
|
+
if (text.length == 0) {
|
|
9
|
+
return YES;
|
|
10
|
+
}
|
|
11
|
+
if (typingSpeed == 0) {
|
|
12
|
+
typingSpeed = 60; // matches WDA default
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
XCSynthesizedEventRecord *record =
|
|
16
|
+
[[XCSynthesizedEventRecord alloc] initWithName:@"DLSyntheticTyping"];
|
|
17
|
+
XCPointerEventPath *path = [[XCPointerEventPath alloc] initForTextInput];
|
|
18
|
+
[path typeText:text atOffset:0.0 typingSpeed:typingSpeed shouldRedact:NO];
|
|
19
|
+
[record addPointerEventPath:path];
|
|
20
|
+
|
|
21
|
+
id device = [XCUIDevice sharedDevice];
|
|
22
|
+
id synthesizer = [device valueForKey:@"eventSynthesizer"];
|
|
23
|
+
if (synthesizer == nil) {
|
|
24
|
+
if (outError) {
|
|
25
|
+
*outError = [NSError errorWithDomain:@"DevicelabIOSRunner"
|
|
26
|
+
code:1
|
|
27
|
+
userInfo:@{NSLocalizedDescriptionKey:
|
|
28
|
+
@"XCUIDevice.eventSynthesizer unavailable"}];
|
|
29
|
+
}
|
|
30
|
+
return NO;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
__block BOOL done = NO;
|
|
34
|
+
__block NSError *innerError = nil;
|
|
35
|
+
|
|
36
|
+
SEL sel = NSSelectorFromString(@"synthesizeEvent:completion:");
|
|
37
|
+
if (![synthesizer respondsToSelector:sel]) {
|
|
38
|
+
if (outError) {
|
|
39
|
+
*outError = [NSError errorWithDomain:@"DevicelabIOSRunner"
|
|
40
|
+
code:2
|
|
41
|
+
userInfo:@{NSLocalizedDescriptionKey:
|
|
42
|
+
@"eventSynthesizer does not support synthesizeEvent:completion:"}];
|
|
43
|
+
}
|
|
44
|
+
return NO;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
NSMethodSignature *sig = [synthesizer methodSignatureForSelector:sel];
|
|
48
|
+
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];
|
|
49
|
+
inv.target = synthesizer;
|
|
50
|
+
inv.selector = sel;
|
|
51
|
+
XCSynthesizedEventRecord *recordArg = record;
|
|
52
|
+
[inv setArgument:&recordArg atIndex:2];
|
|
53
|
+
void (^completion)(BOOL, NSError *) = ^(BOOL success, NSError *invokeError) {
|
|
54
|
+
if (invokeError != nil) {
|
|
55
|
+
innerError = invokeError;
|
|
56
|
+
}
|
|
57
|
+
done = YES;
|
|
58
|
+
};
|
|
59
|
+
[inv setArgument:&completion atIndex:3];
|
|
60
|
+
[inv invoke];
|
|
61
|
+
|
|
62
|
+
// Spin the run loop until the completion handler fires.
|
|
63
|
+
NSDate *deadline = [NSDate dateWithTimeIntervalSinceNow:30.0];
|
|
64
|
+
while (!done && [deadline timeIntervalSinceNow] > 0) {
|
|
65
|
+
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
|
|
66
|
+
beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.05]];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (!done) {
|
|
70
|
+
if (outError) {
|
|
71
|
+
*outError = [NSError errorWithDomain:@"DevicelabIOSRunner"
|
|
72
|
+
code:3
|
|
73
|
+
userInfo:@{NSLocalizedDescriptionKey:
|
|
74
|
+
@"synthesizeEvent timed out"}];
|
|
75
|
+
}
|
|
76
|
+
return NO;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (innerError != nil) {
|
|
80
|
+
if (outError) {
|
|
81
|
+
*outError = innerError;
|
|
82
|
+
}
|
|
83
|
+
return NO;
|
|
84
|
+
}
|
|
85
|
+
return YES;
|
|
86
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
# devicelab-ios-runner — Wire Protocol v1
|
|
2
|
+
|
|
3
|
+
Internal HTTP+JSON protocol between maestro-runner's Go consumer (`pkg/driver/devicelab_ios/`) and the on-device XCUITest runner.
|
|
4
|
+
|
|
5
|
+
**Status:** v1 draft, no consumers yet. Free to evolve.
|
|
6
|
+
**Owners:** maestro-runner team.
|
|
7
|
+
**Stability:** owned outright. The protocol bumps on breaking change; see [Versioning](#versioning).
|
|
8
|
+
|
|
9
|
+
## Design rules
|
|
10
|
+
|
|
11
|
+
These are non-negotiable. If a change conflicts with one of these, the change is wrong.
|
|
12
|
+
|
|
13
|
+
1. **Stateless app binding.** Every command carries `appBundleId`. Runner caches `XCUIApplication(bundleIdentifier:)` until it changes. No session lifecycle.
|
|
14
|
+
2. **No element IDs / element handles.** Operations target either coordinates or fresh selectors. Eliminates stale-element bugs and WebDriver session state entirely.
|
|
15
|
+
3. **Full hierarchy, no filtering.** Snapshot returns every node with every accessibility attribute. No `interactiveOnly` / `compact` / occlusion / element caps. Flow selectors run on the Go side against the full tree.
|
|
16
|
+
4. **Inline binary payloads.** Screenshots and recordings return base64 bytes in the JSON envelope. No file-on-device + fetch-back round trips.
|
|
17
|
+
5. **Caller-chosen port.** Go side picks the port and injects via env var. Runner never picks a random port.
|
|
18
|
+
6. **Both path and direction gestures.** Swipe / scroll accept either `(x, y, x2, y2, durationMs)` or `(direction, percent)`.
|
|
19
|
+
7. **Every command times out.** Hard 30s ceiling enforced server-side. Hung commands cannot wedge the runner.
|
|
20
|
+
|
|
21
|
+
## Transport
|
|
22
|
+
|
|
23
|
+
| Field | Value |
|
|
24
|
+
|---|---|
|
|
25
|
+
| Protocol | HTTP/1.1 over TCP |
|
|
26
|
+
| Host | `127.0.0.1` (simulator) or tunneled device port |
|
|
27
|
+
| Port | Caller-injected via `DEVICELAB_IOS_RUNNER_PORT` env var |
|
|
28
|
+
| Path | `POST /command` |
|
|
29
|
+
| Content-Type | `application/json; charset=utf-8` |
|
|
30
|
+
| Max request size | 4 MB (covers any reasonable `type` text payload) |
|
|
31
|
+
| Connection | Keep-alive supported; runner is single-threaded so requests serialize |
|
|
32
|
+
|
|
33
|
+
The runner also exposes `GET /health` (no JSON body, returns `200` once ready) for the Go side to await readiness without sending a command.
|
|
34
|
+
|
|
35
|
+
## Port allocation
|
|
36
|
+
|
|
37
|
+
- Go side picks a free ephemeral port (`net.Listen("tcp", "127.0.0.1:0")`, immediately close, reuse port number).
|
|
38
|
+
- Inject the port into the runner via the `.xctestrun` `EnvironmentVariables.DEVICELAB_IOS_RUNNER_PORT` before invoking `xcodebuild test-without-building`.
|
|
39
|
+
- For real devices: same port on device, plus `iproxy <hostPort>:<devicePort>` (or equivalent via `pymobiledevice3`) so `127.0.0.1:<hostPort>` reaches the runner.
|
|
40
|
+
|
|
41
|
+
## Request envelope
|
|
42
|
+
|
|
43
|
+
```jsonc
|
|
44
|
+
{
|
|
45
|
+
"command": "<commandType>",
|
|
46
|
+
"appBundleId": "<bundle-id>", // required for app-targeted commands
|
|
47
|
+
// ... command-specific fields
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Unknown fields are ignored. Missing required fields produce `INVALID_ARGUMENT`.
|
|
52
|
+
|
|
53
|
+
## Response envelope
|
|
54
|
+
|
|
55
|
+
```jsonc
|
|
56
|
+
{
|
|
57
|
+
"ok": true,
|
|
58
|
+
"data": { /* command-specific */ }
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```jsonc
|
|
63
|
+
{
|
|
64
|
+
"ok": false,
|
|
65
|
+
"error": {
|
|
66
|
+
"code": "ELEMENT_NOT_FOUND",
|
|
67
|
+
"message": "human-readable",
|
|
68
|
+
"details": { /* optional structured context */ }
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`data` is always an object (never an array or scalar). `error` is present iff `ok === false`.
|
|
74
|
+
|
|
75
|
+
### Error codes
|
|
76
|
+
|
|
77
|
+
| Code | When |
|
|
78
|
+
|---|---|
|
|
79
|
+
| `INVALID_ARGUMENT` | Missing/invalid request field |
|
|
80
|
+
| `UNSUPPORTED_OPERATION` | Command exists but is not available in this build/platform |
|
|
81
|
+
| `APP_NOT_RUNNING` | `appBundleId` not foregrounded and could not be activated |
|
|
82
|
+
| `ELEMENT_NOT_FOUND` | Selector returned zero matches |
|
|
83
|
+
| `ELEMENT_NOT_INTERACTABLE` | Element matched but is not visible / enabled / hittable |
|
|
84
|
+
| `ALERT_PRESENT` | A system alert blocked the operation |
|
|
85
|
+
| `TIMEOUT` | Server-side 30s ceiling exceeded |
|
|
86
|
+
| `XCUI_EXCEPTION` | Underlying XCUITest threw an ObjC exception (retried once before this) |
|
|
87
|
+
| `RUNNER_INTERNAL` | Bug in the runner |
|
|
88
|
+
|
|
89
|
+
## Versioning
|
|
90
|
+
|
|
91
|
+
- Protocol version is `1`. Single integer. Bumped on any breaking change to existing command shapes or response semantics.
|
|
92
|
+
- `GET /version` returns `{"protocolVersion": 1, "runnerBuild": "<sha-or-tag>"}`.
|
|
93
|
+
- The Go client asserts on connect that `protocolVersion` matches the version it was built against. Mismatch = hard error, no version negotiation.
|
|
94
|
+
- Adding new optional fields or new commands does not bump the version.
|
|
95
|
+
|
|
96
|
+
## Command surface
|
|
97
|
+
|
|
98
|
+
### Lifecycle
|
|
99
|
+
|
|
100
|
+
| Command | Inputs | Returns | Notes |
|
|
101
|
+
|---|---|---|---|
|
|
102
|
+
| `appLaunch` | `appBundleId`, `arguments[]?`, `environment{}?` | `{ pid, launched: true }` | `XCUIApplication(bundleIdentifier:).launch()`. Replaces cached `currentApp`. |
|
|
103
|
+
| `appActivate` | `appBundleId` | `{ pid, activated: true }` | Foreground without relaunch. |
|
|
104
|
+
| `appTerminate` | `appBundleId` | `{ terminated: true }` | |
|
|
105
|
+
| `appState` | `appBundleId` | `{ state: "running"|"notRunning"|"runningBackground" }` | |
|
|
106
|
+
| `appCurrent` | (none) | `{ appBundleId?, pid? }` | Returns currently foregrounded app. |
|
|
107
|
+
| `shutdown` | (none) | `{ shuttingDown: true }` | Runner exits cleanly. |
|
|
108
|
+
| `ping` | (none) | `{ uptimeMs }` | Round-trip baseline. |
|
|
109
|
+
|
|
110
|
+
### Snapshot
|
|
111
|
+
|
|
112
|
+
| Command | Inputs | Returns |
|
|
113
|
+
|---|---|---|
|
|
114
|
+
| `snapshot` | `appBundleId?` | `{ nodes: [SnapshotNode] }` |
|
|
115
|
+
| `screenSize` | `appBundleId?` | `{ width, height, scale }` |
|
|
116
|
+
|
|
117
|
+
`snapshot` always returns the full tree. If `appBundleId` is omitted, snapshots the currently foregrounded app via `XCUIApplication()`. **No filtering, no caps, no occlusion computation.**
|
|
118
|
+
|
|
119
|
+
#### SnapshotNode
|
|
120
|
+
|
|
121
|
+
Flat array; tree reconstructed via `parentIndex`. Every node carries every available accessibility field — Go-side selectors decide what to match on.
|
|
122
|
+
|
|
123
|
+
```jsonc
|
|
124
|
+
{
|
|
125
|
+
"index": 12,
|
|
126
|
+
"parentIndex": 5, // omitted for root
|
|
127
|
+
"depth": 3,
|
|
128
|
+
"type": "XCUIElementTypeButton", // raw XCUIElementType string
|
|
129
|
+
"identifier": "login-button", // .identifier — accessibility ID
|
|
130
|
+
"label": "Sign In", // .label
|
|
131
|
+
"value": "", // .value (e.g. text field contents)
|
|
132
|
+
"placeholderValue": "", // .placeholderValue
|
|
133
|
+
"rect": { "x": 32.0, "y": 624.6, "width": 338.0, "height": 50.0 },
|
|
134
|
+
"enabled": false,
|
|
135
|
+
"displayed": true, // visible in the viewport (rect inside screen bounds, not occluded by parent clipping)
|
|
136
|
+
"selected": false,
|
|
137
|
+
"focused": false,
|
|
138
|
+
"hittable": true // .isHittable
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
**Deltas from agent-device's runner:** adds `identifier`, `value`, `placeholderValue`, `selected`, `focused`, `displayed`. Drops `interactiveOnly`/`compact`/occlusion logic.
|
|
143
|
+
|
|
144
|
+
### Find
|
|
145
|
+
|
|
146
|
+
These are conveniences when the Go side already knows what it wants and does not need the full snapshot. They return one or more `SnapshotNode`s. **No element ID is retained** — the returned bounds are the caller's only handle.
|
|
147
|
+
|
|
148
|
+
| Command | Inputs | Returns |
|
|
149
|
+
|---|---|---|
|
|
150
|
+
| `findByIdentifier` | `appBundleId`, `identifier` | `{ found: bool, node?: SnapshotNode }` |
|
|
151
|
+
| `findByLabel` | `appBundleId`, `label`, `exact?: bool` | `{ found: bool, node?: SnapshotNode }` |
|
|
152
|
+
| `findByPredicate` | `appBundleId`, `predicate` | `{ found: bool, nodes: [SnapshotNode] }` |
|
|
153
|
+
| `findByClassChain` | `appBundleId`, `query` | `{ found: bool, nodes: [SnapshotNode] }` |
|
|
154
|
+
|
|
155
|
+
Selector strategies match WDA's: predicate strings and class chains map directly to `XCUIElement.matching(NSPredicate(...))` and the XCUIElementQuery class-chain syntax.
|
|
156
|
+
|
|
157
|
+
### Gestures
|
|
158
|
+
|
|
159
|
+
All gestures accept `appBundleId` so the runner can target the right `XCUIApplication` for coordinate-space resolution.
|
|
160
|
+
|
|
161
|
+
| Command | Inputs | Returns |
|
|
162
|
+
|---|---|---|
|
|
163
|
+
| `tap` | `x, y` | `{ gestureStartMs, gestureEndMs, referenceWidth, referenceHeight }` |
|
|
164
|
+
| `doubleTap` | `x, y` | gesture timings |
|
|
165
|
+
| `longPress` | `x, y, durationMs` | gesture timings |
|
|
166
|
+
| `swipe` | EITHER `x, y, x2, y2, durationMs` OR `direction, percent` | gesture timings + `path: [{x,y},...]` |
|
|
167
|
+
| `scroll` | EITHER coordinate path OR `direction, percent` (same as swipe but with slower default duration) | gesture timings |
|
|
168
|
+
| `drag` | `x, y, x2, y2, durationMs` (press-before-move hold), `moveDurationMs?` (movement time — local addition; when set, drags via `press(forDuration:thenDragTo:withVelocity:thenHoldForDuration:)` with a 250ms settle before release, for dragAndDrop reorder semantics) | gesture timings + path |
|
|
169
|
+
| `pinch` | `x, y, scale, durationMs` | gesture timings |
|
|
170
|
+
| `pressButton` | `button: "home"|"lock"|"volumeUp"|"volumeDown"|"appSwitcher"` | `{ pressed: true }` |
|
|
171
|
+
| `rotate` | `orientation: "portrait"|"landscapeLeft"|"landscapeRight"|"portraitUpsideDown"` | `{ orientation }` |
|
|
172
|
+
| `appearance` | — | `{ appearance: "dark"|"light" }` |
|
|
173
|
+
| `setAppearance` | `appearance: "dark"|"light"` | `{ appearance }` — the appearance that took effect, re-read after setting, not the request echoed back |
|
|
174
|
+
|
|
175
|
+
**Delta from agent-device:** swipe + scroll accept coordinate paths AND direction. drag, pinch, pressButton, rotate kept; tapSeries / dragSeries / interactionFrame dropped (LLM-shaped, not needed for flows). `appearance` / `setAppearance` are local additions wrapping `XCUIDevice.appearance` (iOS 15+); they exist because `simctl ui appearance` covers only simulators, so this is what makes dark mode work on physical devices. `unspecified` is reported as `light` — nothing is being forced, and that is how it renders.
|
|
176
|
+
|
|
177
|
+
### Text
|
|
178
|
+
|
|
179
|
+
| Command | Inputs | Returns |
|
|
180
|
+
|---|---|---|
|
|
181
|
+
| `type` | `text`, `typingFrequency?` | `{ typed }` |
|
|
182
|
+
| `eraseText` | `count` (number of chars to delete) | `{ erased }` |
|
|
183
|
+
| `keyPress` | `key: "enter"|"tab"|"backspace"|"escape"` | `{ pressed }` |
|
|
184
|
+
| `clipboardGet` | (none) | `{ text }` |
|
|
185
|
+
| `clipboardSet` | `text` | `{ set: true }` |
|
|
186
|
+
|
|
187
|
+
`type` sends keys to the currently focused element (caller is responsible for tapping to focus first — same as WDA today).
|
|
188
|
+
|
|
189
|
+
### Alerts
|
|
190
|
+
|
|
191
|
+
| Command | Inputs | Returns |
|
|
192
|
+
|---|---|---|
|
|
193
|
+
| `alertVisible` | (none) | `{ visible: bool, button1Label?, button2Label? }` |
|
|
194
|
+
| `alertAccept` | (none) | `{ dismissed: true }` |
|
|
195
|
+
| `alertDismiss` | (none) | `{ dismissed: true }` |
|
|
196
|
+
|
|
197
|
+
### URLs
|
|
198
|
+
|
|
199
|
+
| Command | Inputs | Returns |
|
|
200
|
+
|---|---|---|
|
|
201
|
+
| `openURL` | `url` | `{ opened: true }` |
|
|
202
|
+
|
|
203
|
+
Uses `XCUIDevice.shared.system.open(URL)` (iOS 15+) or SpringBoard tap path as fallback.
|
|
204
|
+
|
|
205
|
+
### Settings (runtime)
|
|
206
|
+
|
|
207
|
+
| Command | Inputs | Returns |
|
|
208
|
+
|---|---|---|
|
|
209
|
+
| `setIdleTimeout` | `timeoutMs` (0 disables) | `{ set }` |
|
|
210
|
+
| `setTypingFrequency` | `freq` (chars/sec) | `{ set }` |
|
|
211
|
+
| `setFindTimeout` | `timeoutMs` | `{ set }` |
|
|
212
|
+
|
|
213
|
+
Cover `core.SetWaitForIdleTimeout`, `TypingFrequencyConfigurer`, `core.SetFindTimeout`.
|
|
214
|
+
|
|
215
|
+
### Recording (Phase 5+; not in v1 minimum)
|
|
216
|
+
|
|
217
|
+
| Command | Inputs | Returns |
|
|
218
|
+
|---|---|---|
|
|
219
|
+
| `recordStart` | `outPath` (host path), `fps?`, `quality?` | `{ recording: true }` |
|
|
220
|
+
| `recordStop` | (none) | `{ bytes: <base64> }` or `{ outPath }` |
|
|
221
|
+
|
|
222
|
+
Deferred — `core.Driver` doesn't expose recording today; can add in Phase 6.
|
|
223
|
+
|
|
224
|
+
## Out of scope for v1
|
|
225
|
+
|
|
226
|
+
These exist in maestro-runner today but stay on the **Go side** via `xcrun simctl` / `xcrun devicectl`, not in the runner:
|
|
227
|
+
|
|
228
|
+
- App install / uninstall (`simctl install` / `devicectl install`)
|
|
229
|
+
- Clear app data (uninstall + reinstall)
|
|
230
|
+
- Permission grants (`simctl privacy`, `devicectl set-permission`)
|
|
231
|
+
- Reset keychain (`simctl keychain reset`)
|
|
232
|
+
- Airplane mode (open Settings app, find toggle, tap — uses regular runner commands)
|
|
233
|
+
- Reading app container files
|
|
234
|
+
|
|
235
|
+
This split mirrors how the current `pkg/driver/wda/` and `pkg/driver/devicelab/` (Android) drivers do these via shell calls, not in-process.
|
|
236
|
+
|
|
237
|
+
## Deltas from agent-device's protocol (with rationale)
|
|
238
|
+
|
|
239
|
+
| Item | agent-device | devicelab-ios-runner | Why |
|
|
240
|
+
|---|---|---|---|
|
|
241
|
+
| Element refs | `@e1`/`@e2` computed on TS side, used in tap | None | Stale-element risk; no benefit for flows that re-snapshot anyway |
|
|
242
|
+
| Snapshot filtering | `interactiveOnly`, `compact`, occlusion | None | LLM-shaped; flows need full tree for selector matching |
|
|
243
|
+
| Snapshot caps | 600 elements / 2 MB | None | Caps cause silent flow failures when the screen is busy |
|
|
244
|
+
| Screenshot return | File path on simulator | Inline base64 bytes | One round trip instead of two; works the same on real devices |
|
|
245
|
+
| Swipe | Direction only | Path OR direction | maestro-runner flows often use coordinate swipes for trackpads/sliders |
|
|
246
|
+
| Snapshot fields | `index/depth/type/label/rect/hittable/enabled` | + `identifier`, `value`, `placeholderValue`, `selected`, `focused`, `displayed` | Required by `id=` / `value=` / focus-aware selectors |
|
|
247
|
+
| Port allocation | Random if env unset | Always caller-injected | Real-device tunneling needs the port before launch |
|
|
248
|
+
| `readText` | Point-based (`x, y` required) | Use `findByIdentifier` or `snapshot` and read `label`/`value` directly | Single way to get text |
|
|
249
|
+
| App lifecycle | TS-side only (`simctl launch`) | Either runner (via `XCUIApplication.launch()`) or Go-side (`simctl`) | Runner-side is faster for warm flows; Go-side stays available |
|
|
250
|
+
| Recording | First-class command | Deferred to Phase 5+ | Not in `core.Driver` today |
|
|
251
|
+
| Protocol stability | "Maintainer document, can change" | Versioned, breaking changes bump version | We are the only consumer; cheap to be strict |
|
|
252
|
+
|
|
253
|
+
## Open questions to revisit before Phase 3 implementation
|
|
254
|
+
|
|
255
|
+
- **`type` without a tap-to-focus first.** WDA's `SendKeys` works against the global keyboard. Should we require a focused element, or accept silent no-op? Current call sites all tap first — keep WDA semantics.
|
|
256
|
+
- **`displayed` semantics.** WDA's `isDisplayed` differs from XCUI's `isHittable`. We compute `displayed` as "rect intersects screen bounds AND parent clip path", `hittable` as raw `.isHittable`. Validate with TestHive flows.
|
|
257
|
+
- **Predicate string compatibility.** WDA supports a specific NSPredicate dialect via Appium. We should support the same dialect so existing flow selectors keep working — verify against `pkg/driver/wda/driver.go:findElementByWDA`.
|
|
258
|
+
- **`scroll` vs `swipe` duration defaults.** WDA scrolls slower than it swipes. Per react-navigation PR #13027, swipe duration tuning is touchy. Pick defaults that match upstream Maestro out of the gate.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# devicelab-ios-runner
|
|
2
|
+
|
|
3
|
+
XCUITest-based iOS automation runner for the `devicelab` driver in [maestro-runner](https://github.com/devicelab-dev/maestro-runner). On-device counterpart to [`devicelab-android-driver`](../devicelab-android-driver).
|
|
4
|
+
|
|
5
|
+
## Goal
|
|
6
|
+
|
|
7
|
+
Replace `pkg/driver/wda/` in maestro-runner with a self-contained, owned XCUITest runner. Fix the two iOS blockers from react-navigation PR #13027:
|
|
8
|
+
|
|
9
|
+
1. **No runtime third-party download** — runner is bundled in `maestro-runner` release artifacts; no fetch over the network at test time.
|
|
10
|
+
2. **Local parity with upstream Maestro** — flows that pass under `maestro` must also pass under `maestro-runner` locally, with the same retry profile.
|
|
11
|
+
|
|
12
|
+
## Status
|
|
13
|
+
|
|
14
|
+
**Phase 0 — Reference validation.** Building `callstackincubator/agent-device`'s XCUITest runner as a black-box sanity check that the architectural design (XCUITest + `Network.framework` HTTP + JSON command protocol) actually works for our flows before committing to a fresh Swift rewrite.
|
|
15
|
+
|
|
16
|
+
See [PLAN.md](./PLAN.md).
|
|
17
|
+
|
|
18
|
+
## Layout (planned)
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
devicelab-ios-runner/
|
|
22
|
+
├── README.md
|
|
23
|
+
├── PLAN.md # phased plan and acceptance criteria
|
|
24
|
+
├── PROTOCOL.md # wire protocol spec (written after Phase 0)
|
|
25
|
+
├── .gitignore
|
|
26
|
+
├── DevicelabIOSRunner.xcodeproj/ # Xcode project (Phase 2+)
|
|
27
|
+
├── DevicelabIOSRunner/ # UI test target sources (fresh Swift)
|
|
28
|
+
└── scripts/
|
|
29
|
+
└── build.sh # standalone build pipeline
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Built artifact will be vendored into `maestro-runner` at `drivers/ios/devicelab-ios-runner/` and bundled by `build-release.sh`.
|
|
33
|
+
|
|
34
|
+
## References
|
|
35
|
+
|
|
36
|
+
- Architecture inspiration: [agent-device findings doc](../../temp/test/agent-device/findings-ios-android.md)
|
|
37
|
+
- Cloned agent-device repo (reference only): `/Users/omnarayan/work/temp/test/agent-device/`
|
|
38
|
+
- Android counterpart pattern: `/Users/omnarayan/work/support-tools/devicelab-android-driver`
|