appium-webdriveragent 16.1.4 → 16.1.6
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 +16 -0
- package/PrivateHeaders/XCTest/CDStructures.h +0 -26
- package/PrivateHeaders/XCTest/NSFastEnumeration-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCAXClient_iOS.h +80 -44
- package/PrivateHeaders/XCTest/XCApplicationQuery.h +18 -11
- package/PrivateHeaders/XCTest/XCDebugLogDelegate-Protocol.h +17 -5
- package/PrivateHeaders/XCTest/XCPointerEvent.h +52 -19
- package/PrivateHeaders/XCTest/XCPointerEventPath.h +55 -33
- package/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h +41 -18
- package/PrivateHeaders/XCTest/XCTAggregateSuiteRunStatistics.h +38 -0
- package/PrivateHeaders/XCTest/XCTAttachmentManager.h +33 -0
- package/PrivateHeaders/XCTest/XCTCapabilities.h +35 -0
- package/PrivateHeaders/XCTest/XCTCapabilitiesProviding-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCTElementSetTransformer-Protocol.h +30 -13
- package/PrivateHeaders/XCTest/XCTElementSnapshotAttributeDataSource-Protocol.h +33 -0
- package/PrivateHeaders/XCTest/XCTElementSnapshotProvider-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCTExpectedFailureContextManager.h +35 -0
- package/PrivateHeaders/XCTest/XCTFuture.h +45 -0
- package/PrivateHeaders/XCTest/XCTHarnessEventReporting-Protocol.h +29 -0
- package/PrivateHeaders/XCTest/XCTIssue.h +49 -0
- package/PrivateHeaders/XCTest/XCTIssueHandling-Protocol.h +26 -0
- package/PrivateHeaders/XCTest/XCTMacCatalystStatusProviding-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCTMeasureOptions.h +48 -0
- package/PrivateHeaders/XCTest/XCTMemoryChecker.h +50 -0
- package/PrivateHeaders/XCTest/XCTMemoryCheckerDelegate-Protocol.h +26 -0
- package/PrivateHeaders/XCTest/XCTMessagingChannel_IDEToRunner-Protocol.h +27 -0
- package/PrivateHeaders/XCTest/XCTMessagingChannel_RunnerToDaemon-Protocol.h +39 -0
- package/PrivateHeaders/XCTest/XCTMessagingChannel_RunnerToIDE-Protocol.h +32 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_ActivityReporting-Protocol.h +24 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_AttachmentFutureResultStatusUpdating-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_BundleRequesting-Protocol.h +24 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_CapabilityExchange-Protocol.h +56 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_DebugLogging-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_EventSynthesis-Protocol.h +34 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_ForcePressureSupportQuerying-Protocol.h +25 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_HIDEventRecording-Protocol.h +25 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_MemoryTesting-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_PerformanceMeasurementReporting-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_ProcessMonitoring-Protocol.h +25 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_ProtectedResourceAuthorization-Protocol.h +22 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_ScreenRecording-Protocol.h +24 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_SelfDiagnosisIssueReporting-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_SignpostRequesting-Protocol.h +24 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_SiriAutomation-Protocol.h +27 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_SystemConfiguration-Protocol.h +27 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_TelemetrySending-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_TestExecution-Protocol.h +28 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_TestReporting-Protocol.h +40 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_UIAutomation-Protocol.h +29 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_UIAutomationRunnerEventReporting-Protocol.h +27 -0
- package/PrivateHeaders/XCTest/XCTMessagingRole_UserPresence-Protocol.h +24 -0
- package/PrivateHeaders/XCTest/XCTMetricDiagnosticHelper.h +49 -0
- package/PrivateHeaders/XCTest/XCTNSPredicateExpectationObject-Protocol.h +15 -7
- package/PrivateHeaders/XCTest/XCTPromise.h +30 -0
- package/PrivateHeaders/XCTest/XCTRemoteSignpostListenerProxy-Protocol.h +29 -0
- package/PrivateHeaders/XCTest/XCTRepetitionPolicy.h +43 -0
- package/PrivateHeaders/XCTest/XCTReportingSession.h +50 -0
- package/PrivateHeaders/XCTest/XCTReportingSessionConfiguration-Protocol.h +27 -0
- package/PrivateHeaders/XCTest/XCTReportingSessionIssueReporter-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCTReportingSessionTestContainer-Protocol.h +26 -0
- package/PrivateHeaders/XCTest/XCTReportingSessionTestReporter.h +51 -0
- package/PrivateHeaders/XCTest/XCTRunnerAutomationSession-Protocol.h +38 -0
- package/PrivateHeaders/XCTest/XCTRunnerDaemonSession.h +76 -78
- package/PrivateHeaders/XCTest/XCTRunnerDaemonSessionUIAutomationDelegate-Protocol.h +33 -0
- package/PrivateHeaders/XCTest/XCTRunnerIDESession.h +87 -53
- package/PrivateHeaders/XCTest/XCTRunnerIDESessionDelegate-Protocol.h +24 -0
- package/PrivateHeaders/XCTest/XCTRuntimeDiagnosticsPolicy.h +36 -0
- package/PrivateHeaders/XCTest/XCTRuntimeIssueDetectionPolicy.h +39 -0
- package/PrivateHeaders/XCTest/XCTScreenCapturePolicy.h +35 -0
- package/PrivateHeaders/XCTest/XCTSignpostListener-Protocol.h +25 -0
- package/PrivateHeaders/XCTest/XCTSkippedTestContext.h +37 -0
- package/PrivateHeaders/XCTest/XCTSourceCodeContext.h +39 -0
- package/PrivateHeaders/XCTest/XCTSourceCodeLocation.h +31 -0
- package/PrivateHeaders/XCTest/XCTTagSelection.h +41 -0
- package/PrivateHeaders/XCTest/XCTTestIdentifier.h +81 -0
- package/PrivateHeaders/XCTest/XCTTestIdentifierSet.h +54 -0
- package/PrivateHeaders/XCTest/XCTTestSelection.h +35 -0
- package/PrivateHeaders/XCTest/XCTWaiter.h +45 -46
- package/PrivateHeaders/XCTest/XCTWaiterManagement-Protocol.h +17 -6
- package/PrivateHeaders/XCTest/XCTWaiterManager-Protocol.h +25 -0
- package/PrivateHeaders/XCTest/XCTWaiterWait.h +40 -0
- package/PrivateHeaders/XCTest/XCTest.h +47 -28
- package/PrivateHeaders/XCTest/XCTestCase.h +165 -90
- package/PrivateHeaders/XCTest/XCTestCaseDiscoveryUIAutomationDelegate-Protocol.h +20 -0
- package/PrivateHeaders/XCTest/XCTestCaseRun.h +19 -9
- package/PrivateHeaders/XCTest/XCTestCaseUIAutomationDelegate-Protocol.h +25 -0
- package/PrivateHeaders/XCTest/XCTestCastMethodNamesUIAutomationDelegate-Protocol.h +24 -0
- package/PrivateHeaders/XCTest/XCTestConfiguration.h +83 -55
- package/PrivateHeaders/XCTest/XCTestDriver.h +54 -28
- package/PrivateHeaders/XCTest/XCTestExpectation.h +37 -26
- package/PrivateHeaders/XCTest/XCTestExpectationDelegate-Protocol.h +15 -6
- package/PrivateHeaders/XCTest/XCTestObservationCenter.h +49 -25
- package/PrivateHeaders/XCTest/XCTestRun.h +33 -28
- package/PrivateHeaders/XCTest/XCUIAXNotificationHandling-Protocol.h +25 -0
- package/PrivateHeaders/XCTest/XCUIAccessibilityInterface-Protocol.h +58 -0
- package/PrivateHeaders/XCTest/XCUIAlertMonitoring-Protocol.h +27 -0
- package/PrivateHeaders/XCTest/XCUIApplication.h +86 -48
- package/PrivateHeaders/XCTest/XCUIApplicationAutomationSessionProviding-Protocol.h +26 -0
- package/PrivateHeaders/XCTest/XCUIApplicationImpl.h +78 -26
- package/PrivateHeaders/XCTest/XCUIApplicationImplReporter-Protocol.h +26 -0
- package/PrivateHeaders/XCTest/XCUIApplicationManaging-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCUIApplicationMonitor-Protocol.h +43 -0
- package/PrivateHeaders/XCTest/XCUIApplicationOpenRequest.h +34 -0
- package/PrivateHeaders/XCTest/XCUIApplicationPlatformServicesProviderDelegate-Protocol.h +25 -0
- package/PrivateHeaders/XCTest/XCUIApplicationProcess.h +89 -69
- package/PrivateHeaders/XCTest/XCUIApplicationProcessDelegate-Protocol.h +25 -0
- package/PrivateHeaders/XCTest/XCUIApplicationProcessManaging-Protocol.h +26 -0
- package/PrivateHeaders/XCTest/XCUIApplicationProcessTracker-Protocol.h +28 -0
- package/PrivateHeaders/XCTest/XCUIApplicationRegistry.h +32 -0
- package/PrivateHeaders/XCTest/XCUIButtonConsole.h +26 -0
- package/PrivateHeaders/XCTest/XCUICoordinate.h +37 -32
- package/PrivateHeaders/XCTest/XCUIDevice.h +122 -17
- package/PrivateHeaders/XCTest/XCUIDeviceAutomationModeInterface-Protocol.h +25 -0
- package/PrivateHeaders/XCTest/XCUIDeviceDelayedAttachmentTransferSupportInterface-Protocol.h +22 -0
- package/PrivateHeaders/XCTest/XCUIDeviceEventAndStateInterface-Protocol.h +40 -0
- package/PrivateHeaders/XCTest/XCUIElement.h +191 -58
- package/PrivateHeaders/XCTest/XCUIElementAttributesPrivate-Protocol.h +26 -0
- package/PrivateHeaders/XCTest/XCUIElementEventTarget-Protocol.h +38 -0
- package/PrivateHeaders/XCTest/XCUIElementQuery.h +154 -58
- package/PrivateHeaders/XCTest/XCUIElementTypeQueryProvider_Private-Protocol.h +24 -0
- package/PrivateHeaders/XCTest/XCUIEventRecording-Protocol.h +37 -0
- package/PrivateHeaders/XCTest/XCUIHitPointResult.h +16 -11
- package/PrivateHeaders/XCTest/XCUIInterruptionMonitoring-Protocol.h +27 -0
- package/PrivateHeaders/XCTest/XCUIIssueDiagnosticsProviding-Protocol.h +23 -0
- package/PrivateHeaders/XCTest/XCUIKnobControl.h +26 -0
- package/PrivateHeaders/XCTest/XCUILocation.h +24 -0
- package/PrivateHeaders/XCTest/XCUIPlatformApplicationServicesProviding-Protocol.h +33 -0
- package/PrivateHeaders/XCTest/XCUIRemoteAccessibilityInterface-Protocol.h +45 -0
- package/PrivateHeaders/XCTest/XCUIRemoteDeviceRunner-Protocol.h +24 -0
- package/PrivateHeaders/XCTest/XCUIRemoteSiriInterface-Protocol.h +30 -0
- package/PrivateHeaders/XCTest/XCUIResetAuthorizationStatusOfProtectedResourcesInterface-Protocol.h +22 -0
- package/PrivateHeaders/XCTest/XCUIScreen.h +45 -19
- package/PrivateHeaders/XCTest/XCUIScreenDataSource-Protocol.h +28 -12
- package/PrivateHeaders/XCTest/XCUISiriService.h +39 -0
- package/PrivateHeaders/XCTest/XCUISystem.h +26 -0
- package/PrivateHeaders/XCTest/XCUIXcodeApplicationManaging-Protocol.h +27 -0
- package/PrivateHeaders/XCTest/_TtC10XCTestCore19XCTReportingContext.h +26 -0
- package/PrivateHeaders/XCTest/_XCTMessaging_VoidProtocol-Protocol.h +20 -0
- package/PrivateHeaders/XCTest/_XCTestObservationInternal-Protocol.h +26 -0
- package/PrivateHeaders/XCTest/_XCTestObservationPrivate-Protocol.h +27 -0
- package/WebDriverAgent.xcodeproj/project.pbxproj +718 -426
- package/WebDriverAgentLib/Categories/XCUIApplication+FBAlert.m +9 -13
- package/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m +2 -2
- package/WebDriverAgentLib/Categories/XCUIApplication+FBTouchAction.m +0 -1
- package/WebDriverAgentLib/Categories/XCUIApplicationProcess+FBQuiescence.m +1 -0
- package/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m +4 -0
- package/WebDriverAgentLib/Categories/XCUIDevice+FBVoiceOver.m +9 -7
- package/WebDriverAgentLib/Categories/XCUIElement+FBClassChain.m +2 -2
- package/WebDriverAgentLib/Categories/XCUIElement+FBScrolling.m +7 -3
- package/WebDriverAgentLib/Categories/XCUIElement+FBTyping.h +33 -0
- package/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m +23 -0
- package/WebDriverAgentLib/Categories/XCUIElementQuery+FBHelpers.m +1 -0
- package/WebDriverAgentLib/Commands/FBElementCommands.m +5 -0
- package/WebDriverAgentLib/Commands/FBSessionCommands.m +1 -1
- package/WebDriverAgentLib/FBAlert.m +12 -3
- package/WebDriverAgentLib/Info.plist +2 -2
- package/WebDriverAgentLib/Routing/FBWebServer.m +3 -2
- package/WebDriverAgentLib/Routing/FBXCElementSnapshot.h +1 -1
- package/WebDriverAgentLib/Utilities/FBActiveAppDetectionPoint.m +2 -2
- package/WebDriverAgentLib/Utilities/FBBaseActionsSynthesizer.h +1 -0
- package/WebDriverAgentLib/Utilities/FBFailureProofTestCase.m +6 -0
- package/WebDriverAgentLib/Utilities/FBScreenshot.m +2 -2
- package/WebDriverAgentLib/Utilities/FBXCTestDaemonsProxy.h +2 -2
- package/WebDriverAgentLib/Utilities/FBXCTestDaemonsProxy.m +4 -4
- package/WebDriverAgentLib/Utilities/FBXCodeCompatibility.m +24 -3
- package/build/lib/no-session-proxy.d.ts +2 -2
- package/build/lib/no-session-proxy.d.ts.map +1 -1
- package/build/lib/no-session-proxy.js +2 -2
- package/build/lib/no-session-proxy.js.map +1 -1
- package/build/lib/webdriveragent.d.ts +2 -2
- package/build/lib/webdriveragent.d.ts.map +1 -1
- package/build/lib/webdriveragent.js +2 -2
- package/build/lib/webdriveragent.js.map +1 -1
- package/lib/no-session-proxy.ts +2 -2
- package/lib/webdriveragent.ts +3 -3
- package/package.json +1 -1
- package/PrivateHeaders/XCTest/NSString-XCTAdditions.h +0 -11
- package/PrivateHeaders/XCTest/NSValue-XCTestAdditions.h +0 -11
- package/PrivateHeaders/XCTest/UIGestureRecognizer-RecordingAdditions.h +0 -11
- package/PrivateHeaders/XCTest/UILongPressGestureRecognizer-RecordingAdditions.h +0 -11
- package/PrivateHeaders/XCTest/UIPanGestureRecognizer-RecordingAdditions.h +0 -11
- package/PrivateHeaders/XCTest/UIPinchGestureRecognizer-RecordingAdditions.h +0 -11
- package/PrivateHeaders/XCTest/UISwipeGestureRecognizer-RecordingAdditions.h +0 -11
- package/PrivateHeaders/XCTest/UITapGestureRecognizer-RecordingAdditions.h +0 -11
- package/PrivateHeaders/XCTest/XCActivityRecord.h +0 -39
- package/PrivateHeaders/XCTest/XCApplicationMonitor.h +0 -44
- package/PrivateHeaders/XCTest/XCApplicationMonitor_iOS.h +0 -18
- package/PrivateHeaders/XCTest/XCDeviceEvent.h +0 -27
- package/PrivateHeaders/XCTest/XCEventGenerator.h +0 -73
- package/PrivateHeaders/XCTest/XCKeyMappingPath.h +0 -36
- package/PrivateHeaders/XCTest/XCKeyboardInputSolver.h +0 -41
- package/PrivateHeaders/XCTest/XCKeyboardKeyMap.h +0 -101
- package/PrivateHeaders/XCTest/XCKeyboardLayout.h +0 -35
- package/PrivateHeaders/XCTest/XCSourceCodeRecording.h +0 -42
- package/PrivateHeaders/XCTest/XCSourceCodeTreeNode.h +0 -84
- package/PrivateHeaders/XCTest/XCSourceCodeTreeNodeEnumerator.h +0 -18
- package/PrivateHeaders/XCTest/XCSymbolicationRecord.h +0 -29
- package/PrivateHeaders/XCTest/XCSymbolicatorHolder.h +0 -14
- package/PrivateHeaders/XCTest/XCTAXClient-Protocol.h +0 -14
- package/PrivateHeaders/XCTest/XCTAsyncActivity-Protocol.h +0 -16
- package/PrivateHeaders/XCTest/XCTAsyncActivity.h +0 -23
- package/PrivateHeaders/XCTest/XCTAutomationTarget-Protocol.h +0 -12
- package/PrivateHeaders/XCTest/XCTDarwinNotificationExpectation.h +0 -23
- package/PrivateHeaders/XCTest/XCTKVOExpectation.h +0 -28
- package/PrivateHeaders/XCTest/XCTMetric.h +0 -29
- package/PrivateHeaders/XCTest/XCTNSNotificationExpectation.h +0 -27
- package/PrivateHeaders/XCTest/XCTNSPredicateExpectation.h +0 -24
- package/PrivateHeaders/XCTest/XCTRunnerAutomationSession.h +0 -21
- package/PrivateHeaders/XCTest/XCTTestRunSession.h +0 -25
- package/PrivateHeaders/XCTest/XCTTestRunSessionDelegate-Protocol.h +0 -17
- package/PrivateHeaders/XCTest/XCTUIApplicationMonitor-Protocol.h +0 -17
- package/PrivateHeaders/XCTest/XCTWaiterDelegate-Protocol.h +0 -16
- package/PrivateHeaders/XCTest/XCTWaiterDelegatePrivate-Protocol.h +0 -12
- package/PrivateHeaders/XCTest/XCTWaiterManager.h +0 -28
- package/PrivateHeaders/XCTest/XCTestCaseSuite.h +0 -19
- package/PrivateHeaders/XCTest/XCTestContext.h +0 -26
- package/PrivateHeaders/XCTest/XCTestContextScope.h +0 -19
- package/PrivateHeaders/XCTest/XCTestDriverInterface-Protocol.h +0 -14
- package/PrivateHeaders/XCTest/XCTestExpectationWaiter.h +0 -17
- package/PrivateHeaders/XCTest/XCTestLog.h +0 -32
- package/PrivateHeaders/XCTest/XCTestManager_IDEInterface-Protocol.h +0 -36
- package/PrivateHeaders/XCTest/XCTestManager_ManagerInterface-Protocol.h +0 -54
- package/PrivateHeaders/XCTest/XCTestManager_TestsInterface-Protocol.h +0 -12
- package/PrivateHeaders/XCTest/XCTestMisuseObserver.h +0 -37
- package/PrivateHeaders/XCTest/XCTestObservation-Protocol.h +0 -20
- package/PrivateHeaders/XCTest/XCTestObserver.h +0 -20
- package/PrivateHeaders/XCTest/XCTestProbe.h +0 -13
- package/PrivateHeaders/XCTest/XCTestSuite.h +0 -48
- package/PrivateHeaders/XCTest/XCTestSuiteRun.h +0 -28
- package/PrivateHeaders/XCTest/XCTestWaiter.h +0 -14
- package/PrivateHeaders/XCTest/XCUIElementAsynchronousHandlerWrapper.h +0 -19
- package/PrivateHeaders/XCTest/XCUIElementHitPointCoordinate.h +0 -24
- package/PrivateHeaders/XCTest/XCUIRecorderNodeFinder.h +0 -65
- package/PrivateHeaders/XCTest/XCUIRecorderNodeFinderMatch.h +0 -25
- package/PrivateHeaders/XCTest/XCUIRecorderTimingMessage.h +0 -20
- package/PrivateHeaders/XCTest/XCUIRecorderUtilities.h +0 -45
- package/PrivateHeaders/XCTest/_XCInternalTestRun.h +0 -43
- package/PrivateHeaders/XCTest/_XCKVOExpectationImplementation.h +0 -32
- package/PrivateHeaders/XCTest/_XCTDarwinNotificationExpectationImplementation.h +0 -27
- package/PrivateHeaders/XCTest/_XCTNSNotificationExpectationImplementation.h +0 -30
- package/PrivateHeaders/XCTest/_XCTNSPredicateExpectationImplementation.h +0 -29
- package/PrivateHeaders/XCTest/_XCTWaiterImpl.h +0 -41
- package/PrivateHeaders/XCTest/_XCTestCaseImplementation.h +0 -70
- package/PrivateHeaders/XCTest/_XCTestCaseInterruptionException.h +0 -13
- package/PrivateHeaders/XCTest/_XCTestExpectationImplementation.h +0 -40
- package/PrivateHeaders/XCTest/_XCTestImplementation.h +0 -14
- package/PrivateHeaders/XCTest/_XCTestObservationCenterImplementation.h +0 -19
- package/PrivateHeaders/XCTest/_XCTestSuiteImplementation.h +0 -23
|
@@ -113,17 +113,13 @@ static NSString *const FB_LIMITED_ACCESS_PROMPT_BUNDLE_ID = @"com.apple.Contacts
|
|
|
113
113
|
NSMutableArray<XCUIElement *> *sheets = [NSMutableArray array];
|
|
114
114
|
NSMutableArray<XCUIElement *> *scrollViews = [NSMutableArray array];
|
|
115
115
|
for (XCUIElement *candidate in candidates) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
[scrollViews addObject:candidate];
|
|
124
|
-
break;
|
|
125
|
-
default:
|
|
126
|
-
break;
|
|
116
|
+
XCUIElementType elementType = candidate.elementType;
|
|
117
|
+
if (elementType == XCUIElementTypeAlert) {
|
|
118
|
+
return candidate;
|
|
119
|
+
} else if (elementType == XCUIElementTypeSheet) {
|
|
120
|
+
[sheets addObject:candidate];
|
|
121
|
+
} else if (elementType == XCUIElementTypeScrollView) {
|
|
122
|
+
[scrollViews addObject:candidate];
|
|
127
123
|
}
|
|
128
124
|
}
|
|
129
125
|
|
|
@@ -135,7 +131,7 @@ static NSString *const FB_LIMITED_ACCESS_PROMPT_BUNDLE_ID = @"com.apple.Contacts
|
|
|
135
131
|
|
|
136
132
|
// In case of iPad we want to check if sheet isn't contained by popover.
|
|
137
133
|
// In that case we ignore it.
|
|
138
|
-
id<FBXCElementSnapshot> sheetSnapshot = sheet.
|
|
134
|
+
id<FBXCElementSnapshot> sheetSnapshot = sheet.fb_cachedSnapshot ?: [sheet fb_customSnapshot];
|
|
139
135
|
BOOL isInsidePopover = NO;
|
|
140
136
|
id<FBXCElementSnapshot> ancestor = sheetSnapshot.parent;
|
|
141
137
|
while (nil != ancestor) {
|
|
@@ -154,7 +150,7 @@ static NSString *const FB_LIMITED_ACCESS_PROMPT_BUNDLE_ID = @"com.apple.Contacts
|
|
|
154
150
|
}
|
|
155
151
|
|
|
156
152
|
for (XCUIElement *scrollView in scrollViews) {
|
|
157
|
-
id<FBXCElementSnapshot> scrollViewSnapshot = scrollView.
|
|
153
|
+
id<FBXCElementSnapshot> scrollViewSnapshot = scrollView.fb_cachedSnapshot ?: [scrollView fb_customSnapshot];
|
|
158
154
|
id<FBXCElementSnapshot> app = [[FBXCElementSnapshotWrapper ensureWrapped:scrollViewSnapshot] fb_parentMatchingType:XCUIElementTypeApplication];
|
|
159
155
|
if (nil == app || ![app.label isEqualToString:FB_SAFARI_APP_NAME]) {
|
|
160
156
|
continue;
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
#import "FBXCElementSnapshotWrapper+Helpers.h"
|
|
24
24
|
#import "FBXCAXClientProxy.h"
|
|
25
25
|
#import "FBXMLGenerationOptions.h"
|
|
26
|
-
#import "
|
|
26
|
+
#import "XCTMessagingChannel_RunnerToDaemon-Protocol.h"
|
|
27
27
|
#import "XCTestPrivateSymbols.h"
|
|
28
28
|
#import "XCTRunnerDaemonSession.h"
|
|
29
29
|
#import "XCUIApplication.h"
|
|
@@ -144,7 +144,7 @@ NSDictionary<NSString *, NSString *> *customExclusionAttributesMap(void) {
|
|
|
144
144
|
+ (NSArray<NSDictionary<NSString *, id> *> *)fb_appsInfoWithAxElements:(NSArray<id<FBXCAccessibilityElement>> *)axElements
|
|
145
145
|
{
|
|
146
146
|
NSMutableArray<NSDictionary<NSString *, id> *> *result = [NSMutableArray array];
|
|
147
|
-
id<
|
|
147
|
+
id<XCTMessagingChannel_RunnerToDaemon> proxy = [FBXCTestDaemonsProxy testRunnerProxy];
|
|
148
148
|
for (id<FBXCAccessibilityElement> axElement in axElements) {
|
|
149
149
|
NSMutableDictionary<NSString *, id> *appInfo = [NSMutableDictionary dictionary];
|
|
150
150
|
pid_t pid = axElement.processIdentifier;
|
|
@@ -123,6 +123,9 @@ static bool fb_isLocked;
|
|
|
123
123
|
if (fb_isLocked) {
|
|
124
124
|
return YES;
|
|
125
125
|
}
|
|
126
|
+
#if TARGET_OS_SIMULATOR
|
|
127
|
+
[self pressLockButton];
|
|
128
|
+
#else
|
|
126
129
|
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"27.0")) {
|
|
127
130
|
// iOS 27: pressLockButton no longer locks; use a direct IOHID Power press (0x0C/0x30, ~0.5s hold).
|
|
128
131
|
if (![self fb_performIOHIDEventWithPage:0x0C
|
|
@@ -134,6 +137,7 @@ static bool fb_isLocked;
|
|
|
134
137
|
} else {
|
|
135
138
|
[self pressLockButton];
|
|
136
139
|
}
|
|
140
|
+
#endif
|
|
137
141
|
return [[[[FBRunLoopSpinner new]
|
|
138
142
|
timeout:FBScreenLockTimeout]
|
|
139
143
|
timeoutErrorMessage:@"Timed out while waiting until the screen gets locked"]
|
|
@@ -190,19 +190,21 @@ static NSDictionary<NSString *, NSString *> *FBVoiceOverMoveSelectors(void)
|
|
|
190
190
|
- (nullable NSString *)fb_voiceOverMove:(NSString *)direction error:(NSError **)error
|
|
191
191
|
{
|
|
192
192
|
if (![direction isKindOfClass:NSString.class] || 0 == direction.length) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
193
|
+
[[[FBErrorBuilder builder]
|
|
194
|
+
withDescription:@"VoiceOver move direction must be a non-empty string"]
|
|
195
|
+
buildError:error];
|
|
196
|
+
return nil;
|
|
196
197
|
}
|
|
197
198
|
|
|
198
199
|
NSString *normalizedDirection = direction.lowercaseString;
|
|
199
200
|
NSString *selectorName = FBVoiceOverMoveSelectors()[normalizedDirection];
|
|
200
201
|
if (nil == selectorName) {
|
|
201
202
|
NSArray *supportedDirections = [FBVoiceOverMoveSelectors().allKeys sortedArrayUsingSelector:@selector(compare:)];
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
203
|
+
[[[FBErrorBuilder builder]
|
|
204
|
+
withDescriptionFormat:@"Unsupported VoiceOver move direction '%@'. Supported directions: %@",
|
|
205
|
+
direction, supportedDirections]
|
|
206
|
+
buildError:error];
|
|
207
|
+
return nil;
|
|
206
208
|
}
|
|
207
209
|
|
|
208
210
|
return FBVoiceOverSpeechFromSelector(NSSelectorFromString(selectorName), error);
|
|
@@ -137,7 +137,7 @@
|
|
|
137
137
|
// Reuse an already-taken snapshot of `self` if one is available (e.g. the
|
|
138
138
|
// caller just resolved/inspected this same element) instead of always
|
|
139
139
|
// paying for a fresh one.
|
|
140
|
-
NSArray<id<FBXCElementSnapshot>> *currentRoots = @[self.lastSnapshot ?: [self fb_customSnapshot]];
|
|
140
|
+
NSArray<id<FBXCElementSnapshot>> *currentRoots = @[self.lastSnapshot ?: self.fb_cachedSnapshot ?: [self fb_customSnapshot]];
|
|
141
141
|
FBClassChainItem *chainItem = lookupChain.firstObject;
|
|
142
142
|
NSArray<id<FBXCElementSnapshot>> *candidates = [self.class fb_snapshotsMatchingItem:chainItem inRoots:currentRoots];
|
|
143
143
|
[lookupChain removeObjectAtIndex:0];
|
|
@@ -153,7 +153,7 @@
|
|
|
153
153
|
if (0 == currentRootMatch.count) {
|
|
154
154
|
return @[];
|
|
155
155
|
}
|
|
156
|
-
currentRoots = @[currentRootMatch.firstObject];
|
|
156
|
+
currentRoots = @[(id<FBXCElementSnapshot> _Nonnull)currentRootMatch.firstObject];
|
|
157
157
|
} else {
|
|
158
158
|
currentRoots = candidates;
|
|
159
159
|
}
|
|
@@ -48,9 +48,13 @@ const CGFloat FBScrollTouchProportion = 0.75f;
|
|
|
48
48
|
|
|
49
49
|
- (BOOL)fb_nativeScrollToVisibleWithError:(NSError **)error
|
|
50
50
|
{
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
[self scrollToVisible];
|
|
52
|
+
if (self.wdVisible) {
|
|
53
|
+
return YES;
|
|
54
|
+
}
|
|
55
|
+
return [[[FBErrorBuilder builder]
|
|
56
|
+
withDescriptionFormat:@"Failed to scroll element '%@' into view", self.description]
|
|
57
|
+
buildError:error];
|
|
54
58
|
}
|
|
55
59
|
|
|
56
60
|
- (void)fb_scrollUpByNormalizedDistance:(CGFloat)distance
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
#import <XCTest/XCTest.h>
|
|
10
|
+
#import <WebDriverAgentLib/FBXCElementSnapshot.h>
|
|
10
11
|
|
|
11
12
|
NS_ASSUME_NONNULL_BEGIN
|
|
12
13
|
|
|
@@ -50,6 +51,25 @@ BOOL FBTypeText(NSString *text, NSUInteger typingSpeed, NSError **error);
|
|
|
50
51
|
frequency:(NSUInteger)frequency
|
|
51
52
|
error:(NSError **)error;
|
|
52
53
|
|
|
54
|
+
/**
|
|
55
|
+
Types a text into element, reusing a snapshot the caller already holds
|
|
56
|
+
instead of fetching a new one. Only pass a snapshot that is known to
|
|
57
|
+
reflect the element's current state (e.g. one taken moments earlier in
|
|
58
|
+
the same operation) - a stale snapshot here will not be detected as such.
|
|
59
|
+
|
|
60
|
+
@param text text that should be typed
|
|
61
|
+
@param shouldClear Whether to clear the input field before start typing
|
|
62
|
+
@param frequency Frequency of typing (letters per sec)
|
|
63
|
+
@param snapshot A recent snapshot of the receiver
|
|
64
|
+
@param error If there is an error, upon return contains an NSError object that describes the problem.
|
|
65
|
+
@return YES if the operation succeeds, otherwise NO.
|
|
66
|
+
*/
|
|
67
|
+
- (BOOL)fb_typeText:(NSString *)text
|
|
68
|
+
shouldClear:(BOOL)shouldClear
|
|
69
|
+
frequency:(NSUInteger)frequency
|
|
70
|
+
snapshot:(id<FBXCElementSnapshot>)snapshot
|
|
71
|
+
error:(NSError **)error;
|
|
72
|
+
|
|
53
73
|
/**
|
|
54
74
|
Clears text on element.
|
|
55
75
|
It will try to activate keyboard on element, if element has no keyboard focus.
|
|
@@ -59,6 +79,19 @@ BOOL FBTypeText(NSString *text, NSUInteger typingSpeed, NSError **error);
|
|
|
59
79
|
*/
|
|
60
80
|
- (BOOL)fb_clearTextWithError:(NSError **)error;
|
|
61
81
|
|
|
82
|
+
/**
|
|
83
|
+
Clears text on element, reusing a snapshot the caller already holds
|
|
84
|
+
instead of fetching a new one. Only pass a snapshot that is known to
|
|
85
|
+
reflect the element's current state (e.g. one taken moments earlier in
|
|
86
|
+
the same operation) - a stale snapshot here will not be detected as such.
|
|
87
|
+
|
|
88
|
+
@param snapshot A recent snapshot of the receiver
|
|
89
|
+
@param error If there is an error, upon return contains an NSError object that describes the problem.
|
|
90
|
+
@return YES if the operation succeeds, otherwise NO.
|
|
91
|
+
*/
|
|
92
|
+
- (BOOL)fb_clearTextWithSnapshot:(id<FBXCElementSnapshot>)snapshot
|
|
93
|
+
error:(NSError **)error;
|
|
94
|
+
|
|
62
95
|
@end
|
|
63
96
|
|
|
64
97
|
NS_ASSUME_NONNULL_END
|
|
@@ -109,7 +109,22 @@ BOOL FBTypeText(NSString *text, NSUInteger typingSpeed, NSError **error)
|
|
|
109
109
|
frequency:(NSUInteger)frequency
|
|
110
110
|
error:(NSError **)error
|
|
111
111
|
{
|
|
112
|
+
// No snapshot was handed to us, so there is nothing to safely reuse -
|
|
113
|
+
// always fetch a fresh one.
|
|
112
114
|
id<FBXCElementSnapshot> snapshot = [self fb_standardSnapshot];
|
|
115
|
+
return [self fb_typeText:text
|
|
116
|
+
shouldClear:shouldClear
|
|
117
|
+
frequency:frequency
|
|
118
|
+
snapshot:snapshot
|
|
119
|
+
error:error];
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
- (BOOL)fb_typeText:(NSString *)text
|
|
123
|
+
shouldClear:(BOOL)shouldClear
|
|
124
|
+
frequency:(NSUInteger)frequency
|
|
125
|
+
snapshot:(id<FBXCElementSnapshot>)snapshot
|
|
126
|
+
error:(NSError **)error
|
|
127
|
+
{
|
|
113
128
|
FBXCElementSnapshotWrapper *wrapped = [FBXCElementSnapshotWrapper ensureWrapped:snapshot];
|
|
114
129
|
[self fb_prepareForTextInputWithSnapshot:wrapped];
|
|
115
130
|
if (shouldClear && ![self fb_clearTextWithSnapshot:wrapped shouldPrepareForInput:NO error:error]) {
|
|
@@ -120,7 +135,15 @@ BOOL FBTypeText(NSString *text, NSUInteger typingSpeed, NSError **error)
|
|
|
120
135
|
|
|
121
136
|
- (BOOL)fb_clearTextWithError:(NSError **)error
|
|
122
137
|
{
|
|
138
|
+
// No snapshot was handed to us, so there is nothing to safely reuse -
|
|
139
|
+
// always fetch a fresh one.
|
|
123
140
|
id<FBXCElementSnapshot> snapshot = [self fb_standardSnapshot];
|
|
141
|
+
return [self fb_clearTextWithSnapshot:snapshot error:error];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
- (BOOL)fb_clearTextWithSnapshot:(id<FBXCElementSnapshot>)snapshot
|
|
145
|
+
error:(NSError **)error
|
|
146
|
+
{
|
|
124
147
|
return [self fb_clearTextWithSnapshot:[FBXCElementSnapshotWrapper ensureWrapped:snapshot]
|
|
125
148
|
shouldPrepareForInput:YES
|
|
126
149
|
error:error];
|
|
@@ -221,9 +221,14 @@
|
|
|
221
221
|
}
|
|
222
222
|
NSUInteger frequency = (NSUInteger)[request.arguments[@"frequency"] longLongValue] ?: [FBConfiguration maxTypingFrequency];
|
|
223
223
|
NSError *error = nil;
|
|
224
|
+
// checkStaleness:YES above already took a fresh, verified-live snapshot of
|
|
225
|
+
// `element` and cached it as `lastSnapshot` - reuse it instead of paying
|
|
226
|
+
// for another round trip.
|
|
227
|
+
id<FBXCElementSnapshot> snapshot = element.lastSnapshot ?: element.fb_cachedSnapshot ?: [element fb_standardSnapshot];
|
|
224
228
|
if (![element fb_typeText:textToType
|
|
225
229
|
shouldClear:NO
|
|
226
230
|
frequency:frequency
|
|
231
|
+
snapshot:snapshot
|
|
227
232
|
error:&error]) {
|
|
228
233
|
return FBResponseWithStatus([FBCommandStatus invalidElementStateErrorWithMessage:error.description traceback:nil]);
|
|
229
234
|
}
|
|
@@ -313,7 +313,7 @@
|
|
|
313
313
|
return nil;
|
|
314
314
|
}
|
|
315
315
|
|
|
316
|
-
XCUIApplication *app = [[XCUIApplication alloc] initWithBundleIdentifier:bundleID];
|
|
316
|
+
XCUIApplication *app = [[XCUIApplication alloc] initWithBundleIdentifier:(NSString * _Nonnull)bundleID];
|
|
317
317
|
BOOL forceAppLaunch = nil == capabilities[FB_CAP_FORCE_APP_LAUNCH]
|
|
318
318
|
|| [capabilities[FB_CAP_FORCE_APP_LAUNCH] boolValue];
|
|
319
319
|
XCUIApplicationState appState = app.state;
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
XCUIElement *alertElement = self.alertElement;
|
|
75
75
|
self.cachedAlertSnapshot = nil == alertElement
|
|
76
76
|
? nil
|
|
77
|
-
: (alertElement.
|
|
77
|
+
: (alertElement.fb_cachedSnapshot ?: [alertElement fb_customSnapshot]);
|
|
78
78
|
self.hasCachedAlertSnapshot = YES;
|
|
79
79
|
}
|
|
80
80
|
return self.cachedAlertSnapshot;
|
|
@@ -194,7 +194,15 @@
|
|
|
194
194
|
[self fb_raiseSetTextFailedExceptionWithReason:@"Failed to resolve the input field element"];
|
|
195
195
|
}
|
|
196
196
|
NSError *error;
|
|
197
|
-
|
|
197
|
+
// dstField was just resolved via a live query in fb_elementForSnapshot:underElement:
|
|
198
|
+
// above, so its cached snapshot can be safely reconstructed in memory
|
|
199
|
+
// instead of paying for a fresh round trip.
|
|
200
|
+
id<FBXCElementSnapshot> snapshot = dstField.fb_cachedSnapshot ?: [dstField fb_standardSnapshot];
|
|
201
|
+
if (![dstField fb_typeText:text
|
|
202
|
+
shouldClear:YES
|
|
203
|
+
frequency:FBConfiguration.maxTypingFrequency
|
|
204
|
+
snapshot:snapshot
|
|
205
|
+
error:&error]) {
|
|
198
206
|
[self fb_raiseSetTextFailedExceptionWithReason:error.description];
|
|
199
207
|
}
|
|
200
208
|
}
|
|
@@ -394,7 +402,8 @@
|
|
|
394
402
|
}
|
|
395
403
|
XCUIElement *matchedElement = nil;
|
|
396
404
|
for (XCUIElement *match in matches) {
|
|
397
|
-
|
|
405
|
+
NSString *matchUid = match.fb_uid;
|
|
406
|
+
if (nil == alertSnapshotUids || (nil != matchUid && [alertSnapshotUids containsObject:matchUid])) {
|
|
398
407
|
matchedElement = match;
|
|
399
408
|
break;
|
|
400
409
|
}
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
<key>CFBundlePackageType</key>
|
|
16
16
|
<string>FMWK</string>
|
|
17
17
|
<key>CFBundleShortVersionString</key>
|
|
18
|
-
<string>16.1.
|
|
18
|
+
<string>16.1.6</string>
|
|
19
19
|
<key>CFBundleSignature</key>
|
|
20
20
|
<string>????</string>
|
|
21
21
|
<key>CFBundleVersion</key>
|
|
22
|
-
<string>16.1.
|
|
22
|
+
<string>16.1.6</string>
|
|
23
23
|
<key>NSPrincipalClass</key>
|
|
24
24
|
<string/>
|
|
25
25
|
</dict>
|
|
@@ -128,8 +128,9 @@ static NSString *const FBServerURLEndMarker = @"<-ServerURLHere";
|
|
|
128
128
|
|
|
129
129
|
if (!serverStarted) {
|
|
130
130
|
[FBLogger logFmt:@"Last attempt to start web server failed with error %@", [error description]];
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
id<FBWebServerDelegate> delegate = self.delegate;
|
|
132
|
+
if ([delegate respondsToSelector:@selector(webServer:didFailToStartWithError:)]) {
|
|
133
|
+
[delegate webServer:self didFailToStartWithError:(NSError * _Nonnull)error];
|
|
133
134
|
return NO;
|
|
134
135
|
}
|
|
135
136
|
abort();
|
|
@@ -58,7 +58,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
58
58
|
- (void)mergeTreeWithSnapshot:(id)arg1;
|
|
59
59
|
- (id)_childMatchingElement:(id)arg1;
|
|
60
60
|
- (NSArray<id<FBXCElementSnapshot>> *)_allDescendants;
|
|
61
|
-
- (BOOL)hasDescendantMatchingFilter:(
|
|
61
|
+
- (BOOL)hasDescendantMatchingFilter:(BOOL(^)(id<FBXCElementSnapshot> snapshot))arg1;
|
|
62
62
|
- (NSArray<id<FBXCElementSnapshot>> *)descendantsByFilteringWithBlock:(BOOL(^)(id<FBXCElementSnapshot> snapshot))block;
|
|
63
63
|
- (id)elementSnapshotMatchingAccessibilityElement:(id)arg1;
|
|
64
64
|
- (void)enumerateDescendantsUsingBlock:(void(^)(id<FBXCElementSnapshot> snapshot))block;
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
#import "FBErrorBuilder.h"
|
|
12
12
|
#import "FBLogger.h"
|
|
13
13
|
#import "FBXCTestDaemonsProxy.h"
|
|
14
|
-
#import "
|
|
14
|
+
#import "XCTMessagingChannel_RunnerToDaemon-Protocol.h"
|
|
15
15
|
|
|
16
16
|
@implementation FBActiveAppDetectionPoint
|
|
17
17
|
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
+ (id<FBXCAccessibilityElement>)axElementWithPoint:(CGPoint)point
|
|
39
39
|
{
|
|
40
40
|
__block id<FBXCAccessibilityElement> onScreenElement = nil;
|
|
41
|
-
id<
|
|
41
|
+
id<XCTMessagingChannel_RunnerToDaemon> proxy = [FBXCTestDaemonsProxy testRunnerProxy];
|
|
42
42
|
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
|
|
43
43
|
[proxy _XCT_requestElementAtPoint:point
|
|
44
44
|
reply:^(id element, NSError *error) {
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
#import "FBFailureProofTestCase.h"
|
|
10
10
|
|
|
11
11
|
#import "FBLogger.h"
|
|
12
|
+
#import "XCTIssue.h"
|
|
13
|
+
#import "XCTSourceCodeContext.h"
|
|
14
|
+
#import "XCTSourceCodeLocation.h"
|
|
12
15
|
|
|
13
16
|
@implementation FBFailureProofTestCase
|
|
14
17
|
|
|
@@ -45,6 +48,8 @@
|
|
|
45
48
|
/**
|
|
46
49
|
Override 'recordFailureWithDescription' to not stop by failures.
|
|
47
50
|
*/
|
|
51
|
+
#pragma clang diagnostic push
|
|
52
|
+
#pragma clang diagnostic ignored "-Wdeprecated-implementations"
|
|
48
53
|
- (void)recordFailureWithDescription:(NSString *)description
|
|
49
54
|
inFile:(NSString *)filePath
|
|
50
55
|
atLine:(NSUInteger)lineNumber
|
|
@@ -52,6 +57,7 @@
|
|
|
52
57
|
{
|
|
53
58
|
[self _enqueueFailureWithDescription:description inFile:filePath atLine:lineNumber expected:expected];
|
|
54
59
|
}
|
|
60
|
+
#pragma clang diagnostic pop
|
|
55
61
|
|
|
56
62
|
/**
|
|
57
63
|
Private XCTestCase method used to block and tunnel failure messages
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
#import "FBMacros.h"
|
|
18
18
|
#import "FBXCodeCompatibility.h"
|
|
19
19
|
#import "FBXCTestDaemonsProxy.h"
|
|
20
|
-
#import "
|
|
20
|
+
#import "XCTMessagingChannel_RunnerToDaemon-Protocol.h"
|
|
21
21
|
#import "XCUIScreen.h"
|
|
22
22
|
|
|
23
23
|
static const NSTimeInterval SCREENSHOT_TIMEOUT = 20.;
|
|
@@ -95,7 +95,7 @@ NSString *formatTimeInterval(NSTimeInterval interval) {
|
|
|
95
95
|
timeout:(NSTimeInterval)timeout
|
|
96
96
|
error:(NSError **)error
|
|
97
97
|
{
|
|
98
|
-
id<
|
|
98
|
+
id<XCTMessagingChannel_RunnerToDaemon> proxy = [FBXCTestDaemonsProxy testRunnerProxy];
|
|
99
99
|
__block NSData *screenshotData = nil;
|
|
100
100
|
__block NSError *innerError = nil;
|
|
101
101
|
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
|
|
@@ -16,12 +16,12 @@
|
|
|
16
16
|
|
|
17
17
|
NS_ASSUME_NONNULL_BEGIN
|
|
18
18
|
|
|
19
|
-
@protocol
|
|
19
|
+
@protocol XCTMessagingChannel_RunnerToDaemon;
|
|
20
20
|
@class FBScreenRecordingRequest, FBScreenRecordingPromise;
|
|
21
21
|
|
|
22
22
|
@interface FBXCTestDaemonsProxy : NSObject
|
|
23
23
|
|
|
24
|
-
+ (id<
|
|
24
|
+
+ (id<XCTMessagingChannel_RunnerToDaemon>)testRunnerProxy;
|
|
25
25
|
|
|
26
26
|
+ (BOOL)synthesizeEventWithRecord:(XCSynthesizedEventRecord *)record
|
|
27
27
|
error:(NSError *__autoreleasing*)error;
|
|
@@ -80,9 +80,9 @@ static void swizzledLaunchApp(id self, SEL _cmd, NSString *path, NSString *bundl
|
|
|
80
80
|
#pragma clang diagnostic pop
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
+ (id<
|
|
83
|
+
+ (id<XCTMessagingChannel_RunnerToDaemon>)testRunnerProxy
|
|
84
84
|
{
|
|
85
|
-
static id<
|
|
85
|
+
static id<XCTMessagingChannel_RunnerToDaemon> proxy = nil;
|
|
86
86
|
if ([FBConfiguration shouldUseSingletonTestManager]) {
|
|
87
87
|
static dispatch_once_t onceToken;
|
|
88
88
|
dispatch_once(&onceToken, ^{
|
|
@@ -97,7 +97,7 @@ static void swizzledLaunchApp(id self, SEL _cmd, NSString *path, NSString *bundl
|
|
|
97
97
|
return proxy;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
+ (id<
|
|
100
|
+
+ (id<XCTMessagingChannel_RunnerToDaemon>)retrieveTestRunnerProxy
|
|
101
101
|
{
|
|
102
102
|
return ((XCTRunnerDaemonSession *)[XCTRunnerDaemonSession sharedSession]).daemonProxy;
|
|
103
103
|
}
|
|
@@ -113,7 +113,7 @@ static void swizzledLaunchApp(id self, SEL _cmd, NSString *path, NSString *bundl
|
|
|
113
113
|
completion();
|
|
114
114
|
};
|
|
115
115
|
|
|
116
|
-
|
|
116
|
+
void (^handlerBlock)(XCSynthesizedEventRecord *, NSError *) = ^(XCSynthesizedEventRecord *innerRecord, NSError *invokeError) {
|
|
117
117
|
errorHandler(invokeError);
|
|
118
118
|
};
|
|
119
119
|
[[XCUIDevice.sharedDevice eventSynthesizer] synthesizeEvent:record completion:(id)^(BOOL result, NSError *invokeError) {
|
|
@@ -15,7 +15,18 @@
|
|
|
15
15
|
#import "XCUIApplication+FBHelpers.h"
|
|
16
16
|
#import "XCUIElementQuery.h"
|
|
17
17
|
#import "FBXCTestDaemonsProxy.h"
|
|
18
|
-
#import "
|
|
18
|
+
#import "XCTCapabilities.h"
|
|
19
|
+
#import "XCTMessagingChannel_RunnerToDaemon-Protocol.h"
|
|
20
|
+
#import "XCTRunnerDaemonSession.h"
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
Legacy testmanagerd (pre-Xcode 15) protocol-version handshake. Xcode 15+ testmanagerd replaced
|
|
24
|
+
this with named XCTCapabilities negotiation and no longer declares this selector at all, so it
|
|
25
|
+
does not appear in the modern XCTMessagingChannel_RunnerToDaemon protocol surface.
|
|
26
|
+
*/
|
|
27
|
+
@protocol FBXCTestManagerLegacyProtocolVersionExchanging <NSObject>
|
|
28
|
+
- (void)_XCT_exchangeProtocolVersion:(unsigned long long)version reply:(void (^)(unsigned long long code))reply;
|
|
29
|
+
@end
|
|
19
30
|
|
|
20
31
|
@implementation XCUIElementQuery (FBCompatibility)
|
|
21
32
|
|
|
@@ -71,15 +82,25 @@ NSInteger FBTestmanagerdVersion(void)
|
|
|
71
82
|
static dispatch_once_t getTestmanagerdVersion;
|
|
72
83
|
static NSInteger testmanagerdVersion;
|
|
73
84
|
dispatch_once(&getTestmanagerdVersion, ^{
|
|
74
|
-
id<
|
|
85
|
+
id<XCTMessagingChannel_RunnerToDaemon> proxy = [FBXCTestDaemonsProxy testRunnerProxy];
|
|
75
86
|
if ([(NSObject *)proxy respondsToSelector:@selector(_XCT_exchangeProtocolVersion:reply:)]) {
|
|
87
|
+
id<FBXCTestManagerLegacyProtocolVersionExchanging> legacyProxy = (id<FBXCTestManagerLegacyProtocolVersionExchanging>)proxy;
|
|
76
88
|
[FBRunLoopSpinner spinUntilCompletion:^(void(^completion)(void)){
|
|
77
|
-
[
|
|
89
|
+
[legacyProxy _XCT_exchangeProtocolVersion:testmanagerdVersion reply:^(unsigned long long code) {
|
|
78
90
|
testmanagerdVersion = (NSInteger) code;
|
|
79
91
|
completion();
|
|
80
92
|
}];
|
|
81
93
|
}];
|
|
82
94
|
} else {
|
|
95
|
+
// Modern testmanagerd (Xcode 15+) has already negotiated named XCTCapabilities by the time
|
|
96
|
+
// a daemon session exists, instead of a single scalar protocol version. There is no direct
|
|
97
|
+
// integer equivalent to report here (this value is diagnostic-only, surfaced via the
|
|
98
|
+
// 'testmanagerdVersion' session capability), so keep reporting the existing "assume
|
|
99
|
+
// newest/full-featured" sentinel, while confirming capabilities did negotiate successfully.
|
|
100
|
+
XCTCapabilities *capabilities = [XCTRunnerDaemonSession sharedSession].remoteInterfaceCapabilities;
|
|
101
|
+
if (nil == capabilities) {
|
|
102
|
+
[FBLogger log:@"Could not retrieve testmanagerd capabilities"];
|
|
103
|
+
}
|
|
83
104
|
testmanagerdVersion = 0xFFFF;
|
|
84
105
|
}
|
|
85
106
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { WebDriverProxy } from '@appium/base-driver';
|
|
2
2
|
import type { ProxyOptions } from '@appium/types';
|
|
3
|
-
export declare class NoSessionProxy extends
|
|
3
|
+
export declare class NoSessionProxy extends WebDriverProxy {
|
|
4
4
|
constructor(opts?: ProxyOptions);
|
|
5
5
|
getUrlForProxy(url: string): string;
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-session-proxy.d.ts","sourceRoot":"","sources":["../../lib/no-session-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"no-session-proxy.d.ts","sourceRoot":"","sources":["../../lib/no-session-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,eAAe,CAAC;AAEhD,qBAAa,cAAe,SAAQ,cAAc;gBACpC,IAAI,GAAE,YAAiB;IAI1B,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;CAU7C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-session-proxy.js","sourceRoot":"","sources":["../../lib/no-session-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"no-session-proxy.js","sourceRoot":"","sources":["../../lib/no-session-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AAGnD,MAAM,OAAO,cAAe,SAAQ,cAAc;IAChD,YAAY,OAAqB,EAAE;QACjC,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IAEQ,cAAc,CAAC,GAAW;QACjC,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACf,GAAG,GAAG,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7E,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,8BAA8B;QAC3E,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,GAAG,CAAC,CAAC;IAC/D,CAAC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { WebDriverProxy } from '@appium/base-driver';
|
|
2
2
|
import type { AppiumLogger, StringRecord } from '@appium/types';
|
|
3
3
|
import { NoSessionProxy } from './no-session-proxy.js';
|
|
4
4
|
import type { WebDriverAgentArgs, AppleDevice, XcodeBuildSettings, RetrieveBuildSettingsOptions } from './types.js';
|
|
@@ -20,7 +20,7 @@ export declare class WebDriverAgent {
|
|
|
20
20
|
started: boolean;
|
|
21
21
|
updatedWDABundleId?: string;
|
|
22
22
|
noSessionProxy?: NoSessionProxy;
|
|
23
|
-
jwproxy?:
|
|
23
|
+
jwproxy?: WebDriverProxy;
|
|
24
24
|
proxyReqRes?: any;
|
|
25
25
|
private readonly log;
|
|
26
26
|
private readonly wdaLocalPort?;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webdriveragent.d.ts","sourceRoot":"","sources":["../../lib/webdriveragent.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"webdriveragent.d.ts","sourceRoot":"","sources":["../../lib/webdriveragent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import {
|
|
2
|
+
import { WebDriverProxy } from '@appium/base-driver';
|
|
3
3
|
import { strongbox } from '@appium/strongbox';
|
|
4
4
|
import { fs, util } from '@appium/support';
|
|
5
5
|
import AsyncLock from 'async-lock';
|
|
@@ -399,7 +399,7 @@ export class WebDriverAgent {
|
|
|
399
399
|
if (this.args.reqBasePath) {
|
|
400
400
|
proxyOpts.reqBasePath = this.args.reqBasePath;
|
|
401
401
|
}
|
|
402
|
-
this.jwproxy = new
|
|
402
|
+
this.jwproxy = new WebDriverProxy(proxyOpts);
|
|
403
403
|
this.jwproxy.sessionId = sessionId;
|
|
404
404
|
this.proxyReqRes = this.jwproxy.proxyReqRes.bind(this.jwproxy);
|
|
405
405
|
this.noSessionProxy = new NoSessionProxy(proxyOpts);
|