appium-webdriveragent 16.2.2 → 16.4.0
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 +12 -0
- package/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h +3 -3
- package/PrivateHeaders/XCTest/XCUIApplication.h +1 -1
- package/PrivateHeaders/XCTest/XCUIDevice.h +0 -1
- package/PrivateHeaders/XCTest/XCUIElement.h +1 -1
- package/Scripts/build.sh +6 -0
- package/WebDriverAgent.xcodeproj/project.pbxproj +1482 -2
- package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp_watchOS.xcscheme +76 -0
- package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_watchOS.xcscheme +86 -0
- package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_watchOS.xcscheme +85 -0
- package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner.xcscheme +1 -1
- package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_watchOS.xcscheme +128 -0
- package/WebDriverAgentLib/Categories/XCUIApplication+FBAlert.m +5 -0
- package/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m +2 -0
- package/WebDriverAgentLib/Categories/XCUIApplication+FBTouchAction.m +1 -1
- package/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.h +34 -0
- package/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m +76 -4
- package/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h +1 -1
- package/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m +1 -1
- package/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.m +1 -1
- package/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m +11 -0
- package/WebDriverAgentLib/Commands/FBCustomCommands.m +55 -4
- package/WebDriverAgentLib/Commands/FBElementCommands.m +6 -5
- package/WebDriverAgentLib/Commands/FBOrientationCommands.m +1 -1
- package/WebDriverAgentLib/Commands/FBSessionCommands.m +29 -5
- package/WebDriverAgentLib/Info.plist +2 -2
- package/WebDriverAgentLib/Routing/FBTCPSocket.h +70 -0
- package/WebDriverAgentLib/Routing/FBTCPSocket.m +199 -0
- package/WebDriverAgentLib/Routing/FBWebServer.m +33 -3
- package/WebDriverAgentLib/Routing/WatchOS/FBWatchHTTPServer.h +68 -0
- package/WebDriverAgentLib/Routing/WatchOS/FBWatchHTTPServer.m +376 -0
- package/WebDriverAgentLib/Routing/WatchOS/RouteRequest.h +30 -0
- package/WebDriverAgentLib/Routing/WatchOS/RouteRequest.m +25 -0
- package/WebDriverAgentLib/Routing/WatchOS/RouteResponse.h +30 -0
- package/WebDriverAgentLib/Routing/WatchOS/RouteResponse.m +54 -0
- package/WebDriverAgentLib/Utilities/FBActiveAppDetectionPoint.m +8 -0
- package/WebDriverAgentLib/Utilities/FBBaseActionsSynthesizer.h +1 -1
- package/WebDriverAgentLib/Utilities/FBBaseActionsSynthesizer.m +1 -1
- package/WebDriverAgentLib/Utilities/FBConfiguration.h +1 -1
- package/WebDriverAgentLib/Utilities/FBConfiguration.m +3 -3
- package/WebDriverAgentLib/Utilities/FBImageProcessor.m +7 -2
- package/WebDriverAgentLib/Utilities/FBMacros.h +14 -5
- package/WebDriverAgentLib/Utilities/FBMathUtils.h +1 -1
- package/WebDriverAgentLib/Utilities/FBMathUtils.m +1 -1
- package/WebDriverAgentLib/Utilities/FBPasteboard.h +1 -1
- package/WebDriverAgentLib/Utilities/FBPasteboard.m +1 -1
- package/WebDriverAgentLib/Utilities/FBSettingsHandler.m +2 -2
- package/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.h +1 -1
- package/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.m +1 -1
- package/WebDriverAgentTests/IntegrationApp_watchOS/ContentView.swift +31 -0
- package/WebDriverAgentTests/IntegrationApp_watchOS/WatchSpikeApp.swift +18 -0
- package/WebDriverAgentTests/IntegrationTests/FBForceTouchTests.m +3 -0
- package/WebDriverAgentTests/IntegrationTests/FBPasteboardTests.m +3 -2
- package/WebDriverAgentTests/IntegrationTests_watchOS/WDAAlertIntegrationTests.swift +23 -0
- package/WebDriverAgentTests/IntegrationTests_watchOS/WDAAppLifecycleIntegrationTests.swift +57 -0
- package/WebDriverAgentTests/IntegrationTests_watchOS/WDAClickIntegrationTests.swift +31 -0
- package/WebDriverAgentTests/IntegrationTests_watchOS/WDADeviceIntegrationTests.swift +113 -0
- package/WebDriverAgentTests/IntegrationTests_watchOS/WDAElementAttributeIntegrationTests.swift +57 -0
- package/WebDriverAgentTests/IntegrationTests_watchOS/WDAFindIntegrationTests.swift +126 -0
- package/WebDriverAgentTests/IntegrationTests_watchOS/WDAScreenshotAndSourceIntegrationTests.swift +52 -0
- package/WebDriverAgentTests/IntegrationTests_watchOS/WDASessionIntegrationTests.swift +72 -0
- package/WebDriverAgentTests/IntegrationTests_watchOS/WDATypingIntegrationTests.swift +57 -0
- package/WebDriverAgentTests/IntegrationTests_watchOS/WDAUnknownCommandIntegrationTests.swift +24 -0
- package/WebDriverAgentTests/IntegrationTests_watchOS/WDAWatchHTTPClient.swift +95 -0
- package/WebDriverAgentTests/IntegrationTests_watchOS/WDAWatchIntegrationTestCase.swift +61 -0
- package/package.json +1 -1
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<Scheme
|
|
3
|
+
LastUpgradeVersion = "2600"
|
|
4
|
+
version = "1.3">
|
|
5
|
+
<BuildAction
|
|
6
|
+
parallelizeBuildables = "YES"
|
|
7
|
+
buildImplicitDependencies = "YES">
|
|
8
|
+
<BuildActionEntries>
|
|
9
|
+
<BuildActionEntry
|
|
10
|
+
buildForTesting = "YES"
|
|
11
|
+
buildForRunning = "YES"
|
|
12
|
+
buildForProfiling = "YES"
|
|
13
|
+
buildForArchiving = "YES"
|
|
14
|
+
buildForAnalyzing = "YES">
|
|
15
|
+
<BuildableReference
|
|
16
|
+
BuildableIdentifier = "primary"
|
|
17
|
+
BlueprintIdentifier = "9D6B02D8FC050BAF7159284F"
|
|
18
|
+
BuildableName = "IntegrationApp_watchOS.app"
|
|
19
|
+
BlueprintName = "IntegrationApp_watchOS"
|
|
20
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
21
|
+
</BuildableReference>
|
|
22
|
+
</BuildActionEntry>
|
|
23
|
+
</BuildActionEntries>
|
|
24
|
+
</BuildAction>
|
|
25
|
+
<TestAction
|
|
26
|
+
buildConfiguration = "Debug"
|
|
27
|
+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
28
|
+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
29
|
+
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
30
|
+
<Testables>
|
|
31
|
+
</Testables>
|
|
32
|
+
</TestAction>
|
|
33
|
+
<LaunchAction
|
|
34
|
+
buildConfiguration = "Debug"
|
|
35
|
+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
36
|
+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
37
|
+
launchStyle = "0"
|
|
38
|
+
useCustomWorkingDirectory = "NO"
|
|
39
|
+
ignoresPersistentStateOnLaunch = "NO"
|
|
40
|
+
debugDocumentVersioning = "YES"
|
|
41
|
+
debugServiceExtension = "internal"
|
|
42
|
+
allowLocationSimulation = "YES">
|
|
43
|
+
<BuildableProductRunnable
|
|
44
|
+
runnableDebuggingMode = "0">
|
|
45
|
+
<BuildableReference
|
|
46
|
+
BuildableIdentifier = "primary"
|
|
47
|
+
BlueprintIdentifier = "9D6B02D8FC050BAF7159284F"
|
|
48
|
+
BuildableName = "IntegrationApp_watchOS.app"
|
|
49
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
50
|
+
</BuildableReference>
|
|
51
|
+
</BuildableProductRunnable>
|
|
52
|
+
</LaunchAction>
|
|
53
|
+
<ProfileAction
|
|
54
|
+
buildConfiguration = "Release"
|
|
55
|
+
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
56
|
+
savedToolIdentifier = ""
|
|
57
|
+
useCustomWorkingDirectory = "NO"
|
|
58
|
+
debugDocumentVersioning = "YES">
|
|
59
|
+
<BuildableProductRunnable
|
|
60
|
+
runnableDebuggingMode = "0">
|
|
61
|
+
<BuildableReference
|
|
62
|
+
BuildableIdentifier = "primary"
|
|
63
|
+
BlueprintIdentifier = "9D6B02D8FC050BAF7159284F"
|
|
64
|
+
BuildableName = "IntegrationApp_watchOS.app"
|
|
65
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
66
|
+
</BuildableReference>
|
|
67
|
+
</BuildableProductRunnable>
|
|
68
|
+
</ProfileAction>
|
|
69
|
+
<AnalyzeAction
|
|
70
|
+
buildConfiguration = "Debug">
|
|
71
|
+
</AnalyzeAction>
|
|
72
|
+
<ArchiveAction
|
|
73
|
+
buildConfiguration = "Release"
|
|
74
|
+
revealArchiveInOrganizer = "YES">
|
|
75
|
+
</ArchiveAction>
|
|
76
|
+
</Scheme>
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<Scheme
|
|
3
|
+
LastUpgradeVersion = "2600"
|
|
4
|
+
version = "1.3">
|
|
5
|
+
<BuildAction
|
|
6
|
+
parallelizeBuildables = "YES"
|
|
7
|
+
buildImplicitDependencies = "YES">
|
|
8
|
+
<BuildActionEntries>
|
|
9
|
+
<BuildActionEntry
|
|
10
|
+
buildForTesting = "YES"
|
|
11
|
+
buildForRunning = "YES"
|
|
12
|
+
buildForProfiling = "NO"
|
|
13
|
+
buildForArchiving = "NO"
|
|
14
|
+
buildForAnalyzing = "NO">
|
|
15
|
+
<BuildableReference
|
|
16
|
+
BuildableIdentifier = "primary"
|
|
17
|
+
BlueprintIdentifier = "4632809915F58C9095914E85"
|
|
18
|
+
BuildableName = "IntegrationTests_watchOS.xctest"
|
|
19
|
+
BlueprintName = "IntegrationTests_watchOS"
|
|
20
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
21
|
+
</BuildableReference>
|
|
22
|
+
</BuildActionEntry>
|
|
23
|
+
</BuildActionEntries>
|
|
24
|
+
</BuildAction>
|
|
25
|
+
<TestAction
|
|
26
|
+
buildConfiguration = "Debug"
|
|
27
|
+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
28
|
+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
29
|
+
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
30
|
+
<Testables>
|
|
31
|
+
<TestableReference
|
|
32
|
+
skipped = "NO">
|
|
33
|
+
<BuildableReference
|
|
34
|
+
BuildableIdentifier = "primary"
|
|
35
|
+
BlueprintIdentifier = "4632809915F58C9095914E85"
|
|
36
|
+
BuildableName = "IntegrationTests_watchOS.xctest"
|
|
37
|
+
BlueprintName = "IntegrationTests_watchOS"
|
|
38
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
39
|
+
</BuildableReference>
|
|
40
|
+
</TestableReference>
|
|
41
|
+
</Testables>
|
|
42
|
+
</TestAction>
|
|
43
|
+
<LaunchAction
|
|
44
|
+
buildConfiguration = "Debug"
|
|
45
|
+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
46
|
+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
47
|
+
launchStyle = "0"
|
|
48
|
+
useCustomWorkingDirectory = "NO"
|
|
49
|
+
ignoresPersistentStateOnLaunch = "NO"
|
|
50
|
+
debugDocumentVersioning = "YES"
|
|
51
|
+
debugServiceExtension = "internal"
|
|
52
|
+
allowLocationSimulation = "YES">
|
|
53
|
+
<MacroExpansion>
|
|
54
|
+
<BuildableReference
|
|
55
|
+
BuildableIdentifier = "primary"
|
|
56
|
+
BlueprintIdentifier = "4632809915F58C9095914E85"
|
|
57
|
+
BuildableName = "IntegrationTests_watchOS.xctest"
|
|
58
|
+
BlueprintName = "IntegrationTests_watchOS"
|
|
59
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
60
|
+
</BuildableReference>
|
|
61
|
+
</MacroExpansion>
|
|
62
|
+
</LaunchAction>
|
|
63
|
+
<ProfileAction
|
|
64
|
+
buildConfiguration = "Release"
|
|
65
|
+
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
66
|
+
savedToolIdentifier = ""
|
|
67
|
+
useCustomWorkingDirectory = "NO"
|
|
68
|
+
debugDocumentVersioning = "YES">
|
|
69
|
+
<MacroExpansion>
|
|
70
|
+
<BuildableReference
|
|
71
|
+
BuildableIdentifier = "primary"
|
|
72
|
+
BlueprintIdentifier = "4632809915F58C9095914E85"
|
|
73
|
+
BuildableName = "IntegrationTests_watchOS.xctest"
|
|
74
|
+
BlueprintName = "IntegrationTests_watchOS"
|
|
75
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
76
|
+
</BuildableReference>
|
|
77
|
+
</MacroExpansion>
|
|
78
|
+
</ProfileAction>
|
|
79
|
+
<AnalyzeAction
|
|
80
|
+
buildConfiguration = "Debug">
|
|
81
|
+
</AnalyzeAction>
|
|
82
|
+
<ArchiveAction
|
|
83
|
+
buildConfiguration = "Release"
|
|
84
|
+
revealArchiveInOrganizer = "YES">
|
|
85
|
+
</ArchiveAction>
|
|
86
|
+
</Scheme>
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<Scheme
|
|
3
|
+
LastUpgradeVersion = "2600"
|
|
4
|
+
version = "1.3">
|
|
5
|
+
<BuildAction
|
|
6
|
+
parallelizeBuildables = "YES"
|
|
7
|
+
buildImplicitDependencies = "YES">
|
|
8
|
+
<BuildActionEntries>
|
|
9
|
+
<BuildActionEntry
|
|
10
|
+
buildForTesting = "YES"
|
|
11
|
+
buildForRunning = "YES"
|
|
12
|
+
buildForProfiling = "YES"
|
|
13
|
+
buildForArchiving = "YES"
|
|
14
|
+
buildForAnalyzing = "YES">
|
|
15
|
+
<BuildableReference
|
|
16
|
+
BuildableIdentifier = "primary"
|
|
17
|
+
BlueprintIdentifier = "95186DE2383671DFA81D7FCB"
|
|
18
|
+
BuildableName = "WebDriverAgentLib_watchOS.framework"
|
|
19
|
+
BlueprintName = "WebDriverAgentLib_watchOS"
|
|
20
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
21
|
+
</BuildableReference>
|
|
22
|
+
</BuildActionEntry>
|
|
23
|
+
</BuildActionEntries>
|
|
24
|
+
</BuildAction>
|
|
25
|
+
<TestAction
|
|
26
|
+
buildConfiguration = "Debug"
|
|
27
|
+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
28
|
+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
29
|
+
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
30
|
+
<MacroExpansion>
|
|
31
|
+
<BuildableReference
|
|
32
|
+
BuildableIdentifier = "primary"
|
|
33
|
+
BlueprintIdentifier = "95186DE2383671DFA81D7FCB"
|
|
34
|
+
BuildableName = "WebDriverAgentLib_watchOS.framework"
|
|
35
|
+
BlueprintName = "WebDriverAgentLib_watchOS"
|
|
36
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
37
|
+
</BuildableReference>
|
|
38
|
+
</MacroExpansion>
|
|
39
|
+
<Testables>
|
|
40
|
+
</Testables>
|
|
41
|
+
</TestAction>
|
|
42
|
+
<LaunchAction
|
|
43
|
+
buildConfiguration = "Debug"
|
|
44
|
+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
45
|
+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
46
|
+
launchStyle = "0"
|
|
47
|
+
useCustomWorkingDirectory = "NO"
|
|
48
|
+
ignoresPersistentStateOnLaunch = "NO"
|
|
49
|
+
debugDocumentVersioning = "YES"
|
|
50
|
+
debugServiceExtension = "internal"
|
|
51
|
+
allowLocationSimulation = "YES">
|
|
52
|
+
<MacroExpansion>
|
|
53
|
+
<BuildableReference
|
|
54
|
+
BuildableIdentifier = "primary"
|
|
55
|
+
BlueprintIdentifier = "95186DE2383671DFA81D7FCB"
|
|
56
|
+
BuildableName = "WebDriverAgentLib_watchOS.framework"
|
|
57
|
+
BlueprintName = "WebDriverAgentLib_watchOS"
|
|
58
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
59
|
+
</BuildableReference>
|
|
60
|
+
</MacroExpansion>
|
|
61
|
+
</LaunchAction>
|
|
62
|
+
<ProfileAction
|
|
63
|
+
buildConfiguration = "Release"
|
|
64
|
+
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
65
|
+
savedToolIdentifier = ""
|
|
66
|
+
useCustomWorkingDirectory = "NO"
|
|
67
|
+
debugDocumentVersioning = "YES">
|
|
68
|
+
<MacroExpansion>
|
|
69
|
+
<BuildableReference
|
|
70
|
+
BuildableIdentifier = "primary"
|
|
71
|
+
BlueprintIdentifier = "95186DE2383671DFA81D7FCB"
|
|
72
|
+
BuildableName = "WebDriverAgentLib_watchOS.framework"
|
|
73
|
+
BlueprintName = "WebDriverAgentLib_watchOS"
|
|
74
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
75
|
+
</BuildableReference>
|
|
76
|
+
</MacroExpansion>
|
|
77
|
+
</ProfileAction>
|
|
78
|
+
<AnalyzeAction
|
|
79
|
+
buildConfiguration = "Debug">
|
|
80
|
+
</AnalyzeAction>
|
|
81
|
+
<ArchiveAction
|
|
82
|
+
buildConfiguration = "Release"
|
|
83
|
+
revealArchiveInOrganizer = "YES">
|
|
84
|
+
</ArchiveAction>
|
|
85
|
+
</Scheme>
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<Scheme
|
|
3
|
+
LastUpgradeVersion = "2600"
|
|
4
|
+
version = "1.3">
|
|
5
|
+
<BuildAction
|
|
6
|
+
parallelizeBuildables = "YES"
|
|
7
|
+
buildImplicitDependencies = "YES">
|
|
8
|
+
<BuildActionEntries>
|
|
9
|
+
<BuildActionEntry
|
|
10
|
+
buildForTesting = "YES"
|
|
11
|
+
buildForRunning = "YES"
|
|
12
|
+
buildForProfiling = "YES"
|
|
13
|
+
buildForArchiving = "YES"
|
|
14
|
+
buildForAnalyzing = "YES">
|
|
15
|
+
<BuildableReference
|
|
16
|
+
BuildableIdentifier = "primary"
|
|
17
|
+
BlueprintIdentifier = "C0A58256FB8AD3E976C8F8D2"
|
|
18
|
+
BuildableName = "WebDriverAgentRunner_watchOS.xctest"
|
|
19
|
+
BlueprintName = "WebDriverAgentRunner_watchOS"
|
|
20
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
21
|
+
</BuildableReference>
|
|
22
|
+
</BuildActionEntry>
|
|
23
|
+
</BuildActionEntries>
|
|
24
|
+
</BuildAction>
|
|
25
|
+
<TestAction
|
|
26
|
+
buildConfiguration = "Debug"
|
|
27
|
+
selectedDebuggerIdentifier = ""
|
|
28
|
+
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
|
|
29
|
+
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
30
|
+
systemAttachmentLifetime = "keepNever">
|
|
31
|
+
<MacroExpansion>
|
|
32
|
+
<BuildableReference
|
|
33
|
+
BuildableIdentifier = "primary"
|
|
34
|
+
BlueprintIdentifier = "C0A58256FB8AD3E976C8F8D2"
|
|
35
|
+
BuildableName = "WebDriverAgentRunner_watchOS.xctest"
|
|
36
|
+
BlueprintName = "WebDriverAgentRunner_watchOS"
|
|
37
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
38
|
+
</BuildableReference>
|
|
39
|
+
</MacroExpansion>
|
|
40
|
+
<Testables>
|
|
41
|
+
<TestableReference
|
|
42
|
+
skipped = "NO">
|
|
43
|
+
<BuildableReference
|
|
44
|
+
BuildableIdentifier = "primary"
|
|
45
|
+
BlueprintIdentifier = "C0A58256FB8AD3E976C8F8D2"
|
|
46
|
+
BuildableName = "WebDriverAgentRunner_watchOS.xctest"
|
|
47
|
+
BlueprintName = "WebDriverAgentRunner_watchOS"
|
|
48
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
49
|
+
</BuildableReference>
|
|
50
|
+
</TestableReference>
|
|
51
|
+
</Testables>
|
|
52
|
+
</TestAction>
|
|
53
|
+
<LaunchAction
|
|
54
|
+
buildConfiguration = "Debug"
|
|
55
|
+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
56
|
+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
57
|
+
launchStyle = "0"
|
|
58
|
+
useCustomWorkingDirectory = "NO"
|
|
59
|
+
ignoresPersistentStateOnLaunch = "NO"
|
|
60
|
+
debugDocumentVersioning = "YES"
|
|
61
|
+
debugServiceExtension = "internal"
|
|
62
|
+
allowLocationSimulation = "YES">
|
|
63
|
+
<MacroExpansion>
|
|
64
|
+
<BuildableReference
|
|
65
|
+
BuildableIdentifier = "primary"
|
|
66
|
+
BlueprintIdentifier = "C0A58256FB8AD3E976C8F8D2"
|
|
67
|
+
BuildableName = "WebDriverAgentRunner_watchOS.xctest"
|
|
68
|
+
BlueprintName = "WebDriverAgentRunner_watchOS"
|
|
69
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
70
|
+
</BuildableReference>
|
|
71
|
+
</MacroExpansion>
|
|
72
|
+
<EnvironmentVariables>
|
|
73
|
+
<EnvironmentVariable
|
|
74
|
+
key = "USE_PORT"
|
|
75
|
+
value = "$(USE_PORT)"
|
|
76
|
+
isEnabled = "YES">
|
|
77
|
+
</EnvironmentVariable>
|
|
78
|
+
<EnvironmentVariable
|
|
79
|
+
key = "USE_IP"
|
|
80
|
+
value = "$(USE_IP)"
|
|
81
|
+
isEnabled = "YES">
|
|
82
|
+
</EnvironmentVariable>
|
|
83
|
+
<EnvironmentVariable
|
|
84
|
+
key = "UPGRADE_TIMESTAMP"
|
|
85
|
+
value = "$(UPGRADE_TIMESTAMP)"
|
|
86
|
+
isEnabled = "YES">
|
|
87
|
+
</EnvironmentVariable>
|
|
88
|
+
<EnvironmentVariable
|
|
89
|
+
key = "WDA_PRODUCT_BUNDLE_IDENTIFIER"
|
|
90
|
+
value = "$(WDA_PRODUCT_BUNDLE_IDENTIFIER)"
|
|
91
|
+
isEnabled = "YES">
|
|
92
|
+
</EnvironmentVariable>
|
|
93
|
+
<EnvironmentVariable
|
|
94
|
+
key = "MAX_HTTP_REQUEST_BODY_SIZE"
|
|
95
|
+
value = "$(MAX_HTTP_REQUEST_BODY_SIZE)"
|
|
96
|
+
isEnabled = "YES">
|
|
97
|
+
</EnvironmentVariable>
|
|
98
|
+
<EnvironmentVariable
|
|
99
|
+
key = "VERBOSE_LOGGING"
|
|
100
|
+
value = "$(VERBOSE_LOGGING)"
|
|
101
|
+
isEnabled = "YES">
|
|
102
|
+
</EnvironmentVariable>
|
|
103
|
+
</EnvironmentVariables>
|
|
104
|
+
</LaunchAction>
|
|
105
|
+
<ProfileAction
|
|
106
|
+
buildConfiguration = "Release"
|
|
107
|
+
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
108
|
+
savedToolIdentifier = ""
|
|
109
|
+
useCustomWorkingDirectory = "NO"
|
|
110
|
+
debugDocumentVersioning = "YES">
|
|
111
|
+
<MacroExpansion>
|
|
112
|
+
<BuildableReference
|
|
113
|
+
BuildableIdentifier = "primary"
|
|
114
|
+
BlueprintIdentifier = "C0A58256FB8AD3E976C8F8D2"
|
|
115
|
+
BuildableName = "WebDriverAgentRunner_watchOS.xctest"
|
|
116
|
+
BlueprintName = "WebDriverAgentRunner_watchOS"
|
|
117
|
+
ReferencedContainer = "container:WebDriverAgent.xcodeproj">
|
|
118
|
+
</BuildableReference>
|
|
119
|
+
</MacroExpansion>
|
|
120
|
+
</ProfileAction>
|
|
121
|
+
<AnalyzeAction
|
|
122
|
+
buildConfiguration = "Debug">
|
|
123
|
+
</AnalyzeAction>
|
|
124
|
+
<ArchiveAction
|
|
125
|
+
buildConfiguration = "Release"
|
|
126
|
+
revealArchiveInOrganizer = "YES">
|
|
127
|
+
</ArchiveAction>
|
|
128
|
+
</Scheme>
|
|
@@ -123,7 +123,12 @@ static NSString *const FB_LIMITED_ACCESS_PROMPT_BUNDLE_ID = @"com.apple.Contacts
|
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
+
#if TARGET_OS_WATCH
|
|
127
|
+
// No popover concept or UIUserInterfaceIdiom on watchOS - treat sheets like phone sheets.
|
|
128
|
+
BOOL isPhone = YES;
|
|
129
|
+
#else
|
|
126
130
|
BOOL isPhone = [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone;
|
|
131
|
+
#endif
|
|
127
132
|
for (XCUIElement *sheet in sheets) {
|
|
128
133
|
if (isPhone) {
|
|
129
134
|
return sheet;
|
|
@@ -435,6 +435,7 @@ NSDictionary<NSString *, NSString *> *customExclusionAttributesMap(void) {
|
|
|
435
435
|
}
|
|
436
436
|
}
|
|
437
437
|
|
|
438
|
+
#if !TARGET_OS_WATCH
|
|
438
439
|
if ([UIDevice.currentDevice userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
|
|
439
440
|
NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"elementType IN %@",
|
|
440
441
|
@[@(XCUIElementTypeKey), @(XCUIElementTypeButton)]];
|
|
@@ -443,6 +444,7 @@ NSDictionary<NSString *, NSString *> *customExclusionAttributesMap(void) {
|
|
|
443
444
|
[matchedKeys[matchedKeys.count - 1] tap];
|
|
444
445
|
}
|
|
445
446
|
}
|
|
447
|
+
#endif
|
|
446
448
|
#endif
|
|
447
449
|
NSString *errorDescription = @"Did not know how to dismiss the keyboard. Try to dismiss it in the way supported by your application under test.";
|
|
448
450
|
return [[[[FBRunLoopSpinner new]
|
|
@@ -166,6 +166,40 @@ typedef NS_ENUM(NSUInteger, FBUIInterfaceAppearance) {
|
|
|
166
166
|
*/
|
|
167
167
|
- (nullable NSNumber *)fb_getAppearance;
|
|
168
168
|
|
|
169
|
+
#if TARGET_OS_WATCH
|
|
170
|
+
/**
|
|
171
|
+
Rotates the Digital Crown on Apple Watch. See
|
|
172
|
+
https://developer.apple.com/documentation/xcuiautomation/xcuidevice/rotatedigitalcrown(delta:velocity:)
|
|
173
|
+
and https://developer.apple.com/documentation/xcuiautomation/xcuidevice/rotatedigitalcrown(delta:)
|
|
174
|
+
Invoked dynamically (this selector was only added to the SDK in Xcode 16.3), so this compiles against
|
|
175
|
+
older Xcode versions too - it just fails at runtime with an error if the OS/SDK combination in use
|
|
176
|
+
doesn't actually implement it.
|
|
177
|
+
|
|
178
|
+
@param delta The number of full crown rotations, e.g. 1.0 is one complete turn.
|
|
179
|
+
The sign gives the direction: positive rotates up/clockwise, negative rotates down/counterclockwise.
|
|
180
|
+
@param velocity The rotation speed, in rotations per second, e.g. 1.0 completes one full
|
|
181
|
+
rotation per second. This is the raw value behind the public XCUIGestureVelocity
|
|
182
|
+
API, which only exposes it via named presets (.slow/.default/.fast).
|
|
183
|
+
Pass nil to use XCTest's own default velocity instead of specifying one explicitly.
|
|
184
|
+
@param error If there is an error, upon return contains an NSError object that describes the problem.
|
|
185
|
+
@return YES if the operation succeeds, otherwise NO.
|
|
186
|
+
*/
|
|
187
|
+
- (BOOL)fb_rotateDigitalCrown:(double)delta velocity:(nullable NSNumber *)velocity error:(NSError **)error;
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
Performs a hand gesture on Apple Watch (e.g. Double Tap, Wrist Flick). See
|
|
191
|
+
https://developer.apple.com/documentation/xcuiautomation/xcuidevice/perform(handgesture:)
|
|
192
|
+
Invoked dynamically (this selector was only added to the SDK in Xcode 16.3), so this compiles against
|
|
193
|
+
older Xcode versions too - it just fails at runtime with an error if the OS/SDK combination in use
|
|
194
|
+
doesn't actually implement it.
|
|
195
|
+
|
|
196
|
+
@param gestureName One of the supported gesture names: doubleTap (watchOS 10+), flick (watchOS 26+).
|
|
197
|
+
@param error If there is an error, upon return contains an NSError object that describes the problem.
|
|
198
|
+
@return YES if the operation succeeds, otherwise NO.
|
|
199
|
+
*/
|
|
200
|
+
- (BOOL)fb_performHandGesture:(NSString *)gestureName error:(NSError **)error;
|
|
201
|
+
#endif // TARGET_OS_WATCH
|
|
202
|
+
|
|
169
203
|
#if !TARGET_OS_TV
|
|
170
204
|
/**
|
|
171
205
|
Allows to set a simulated geolocation coordinates.
|
|
@@ -68,13 +68,13 @@ NSDictionary<NSString *, NSNumber *> *fb_availableButtonNames(void) {
|
|
|
68
68
|
buttons[@"volumeup"] = @(XCUIDeviceButtonVolumeUp); // 2
|
|
69
69
|
buttons[@"volumedown"] = @(XCUIDeviceButtonVolumeDown); // 3
|
|
70
70
|
#endif
|
|
71
|
-
if (@available(iOS 16.0, *)) {
|
|
71
|
+
if (@available(iOS 16.0, watchOS 9.0, *)) {
|
|
72
72
|
#if __clang_major__ >= 15 // likely Xcode 15+
|
|
73
73
|
if ([XCUIDevice.sharedDevice hasHardwareButton:XCUIDeviceButtonAction]) {
|
|
74
74
|
buttons[@"action"] = @(XCUIDeviceButtonAction); // 4
|
|
75
75
|
}
|
|
76
76
|
#endif
|
|
77
|
-
#if (!TARGET_OS_SIMULATOR && __clang_major__ >= 16) // likely Xcode 16
|
|
77
|
+
#if (!TARGET_OS_SIMULATOR && !TARGET_OS_WATCH && __clang_major__ >= 16) // likely Xcode 16+; camera button does not exist on watchOS
|
|
78
78
|
if ([XCUIDevice.sharedDevice hasHardwareButton:XCUIDeviceButtonCamera]) {
|
|
79
79
|
buttons[@"camera"] = @(XCUIDeviceButtonCamera);
|
|
80
80
|
}
|
|
@@ -86,6 +86,27 @@ NSDictionary<NSString *, NSNumber *> *fb_availableButtonNames(void) {
|
|
|
86
86
|
}
|
|
87
87
|
#endif
|
|
88
88
|
|
|
89
|
+
#if TARGET_OS_WATCH
|
|
90
|
+
// Raw values from XCUIDeviceHandGesture (XCUIAutomation/XCUIDeviceHandGesture.h): doubleTap = 1, flick = 2.
|
|
91
|
+
// Referenced by raw integer rather than the enum constant, and invoked via NSInvocation in
|
|
92
|
+
// fb_performHandGesture:error: below, since that enum/selector was only added to the SDK in Xcode 16.3
|
|
93
|
+
// (flick specifically needs watchOS 12.0/26 - see the @available check below). This way the code compiles
|
|
94
|
+
// against any Xcode version; unsupported gestures/selectors are only rejected at runtime.
|
|
95
|
+
NSDictionary<NSString *, NSNumber *> *fb_availableHandGestureNames(void) {
|
|
96
|
+
static dispatch_once_t onceToken;
|
|
97
|
+
static NSDictionary *result;
|
|
98
|
+
dispatch_once(&onceToken, ^{
|
|
99
|
+
NSMutableDictionary *gestures = [NSMutableDictionary dictionary];
|
|
100
|
+
gestures[@"doubletap"] = @(1);
|
|
101
|
+
if (@available(watchOS 12.0, *)) {
|
|
102
|
+
gestures[@"flick"] = @(2);
|
|
103
|
+
}
|
|
104
|
+
result = [gestures copy];
|
|
105
|
+
});
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
#endif // TARGET_OS_WATCH
|
|
109
|
+
|
|
89
110
|
@implementation XCUIDevice (FBHelpers)
|
|
90
111
|
|
|
91
112
|
static bool fb_isLocked;
|
|
@@ -357,9 +378,9 @@ static bool fb_isLocked;
|
|
|
357
378
|
return YES;
|
|
358
379
|
}
|
|
359
380
|
|
|
360
|
-
#if __clang_major__ >= 15 || (__clang_major__ >= 14 && __clang_minor__ >= 0 && __clang_patchlevel__ >= 3)
|
|
381
|
+
#if !TARGET_OS_WATCH && (__clang_major__ >= 15 || (__clang_major__ >= 14 && __clang_minor__ >= 0 && __clang_patchlevel__ >= 3))
|
|
361
382
|
// Xcode 14.3.1 can build these values.
|
|
362
|
-
// For iOS 17
|
|
383
|
+
// For iOS 17+; the `appearance` property does not exist on watchOS
|
|
363
384
|
if ([self respondsToSelector:NSSelectorFromString(@"appearance")]) {
|
|
364
385
|
self.appearance = (XCUIDeviceAppearance) appearance;
|
|
365
386
|
return YES;
|
|
@@ -386,6 +407,57 @@ static bool fb_isLocked;
|
|
|
386
407
|
: nil;
|
|
387
408
|
}
|
|
388
409
|
|
|
410
|
+
#if TARGET_OS_WATCH
|
|
411
|
+
- (BOOL)fb_rotateDigitalCrown:(double)delta velocity:(nullable NSNumber *)velocity error:(NSError **)error
|
|
412
|
+
{
|
|
413
|
+
SEL selector = nil == velocity
|
|
414
|
+
? NSSelectorFromString(@"rotateDigitalCrownByDelta:")
|
|
415
|
+
: NSSelectorFromString(@"rotateDigitalCrownByDelta:withVelocity:");
|
|
416
|
+
if (nil == selector || ![self respondsToSelector:selector]) {
|
|
417
|
+
return [[[FBErrorBuilder builder]
|
|
418
|
+
withDescriptionFormat:@"Digital Crown rotation is not supported by the current Xcode SDK/OS combination"]
|
|
419
|
+
buildError:error];
|
|
420
|
+
}
|
|
421
|
+
NSMethodSignature *signature = [self methodSignatureForSelector:selector];
|
|
422
|
+
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
|
423
|
+
[invocation setSelector:selector];
|
|
424
|
+
[invocation setTarget:self];
|
|
425
|
+
[invocation setArgument:&delta atIndex:2];
|
|
426
|
+
if (velocity) {
|
|
427
|
+
double velocityValue = velocity.doubleValue;
|
|
428
|
+
[invocation setArgument:&velocityValue atIndex:3];
|
|
429
|
+
}
|
|
430
|
+
[invocation invoke];
|
|
431
|
+
return YES;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
- (BOOL)fb_performHandGesture:(NSString *)gestureName error:(NSError **)error
|
|
435
|
+
{
|
|
436
|
+
NSDictionary<NSString *, NSNumber *> *availableGestures = fb_availableHandGestureNames();
|
|
437
|
+
NSNumber *gestureValue = availableGestures[gestureName.lowercaseString];
|
|
438
|
+
if (!gestureValue) {
|
|
439
|
+
NSArray *sortedKeys = [availableGestures.allKeys sortedArrayUsingSelector:@selector(compare:)];
|
|
440
|
+
return [[[FBErrorBuilder builder]
|
|
441
|
+
withDescriptionFormat:@"The hand gesture '%@' is not supported. The device under test only supports the following hand gestures: %@", gestureName, sortedKeys]
|
|
442
|
+
buildError:error];
|
|
443
|
+
}
|
|
444
|
+
SEL selector = NSSelectorFromString(@"performHandGesture:");
|
|
445
|
+
if (nil == selector || ![self respondsToSelector:selector]) {
|
|
446
|
+
return [[[FBErrorBuilder builder]
|
|
447
|
+
withDescriptionFormat:@"Hand gesture automation is not supported by the current Xcode SDK/OS combination"]
|
|
448
|
+
buildError:error];
|
|
449
|
+
}
|
|
450
|
+
NSMethodSignature *signature = [self methodSignatureForSelector:selector];
|
|
451
|
+
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
|
|
452
|
+
[invocation setSelector:selector];
|
|
453
|
+
[invocation setTarget:self];
|
|
454
|
+
NSInteger gestureRawValue = gestureValue.integerValue;
|
|
455
|
+
[invocation setArgument:&gestureRawValue atIndex:2];
|
|
456
|
+
[invocation invoke];
|
|
457
|
+
return YES;
|
|
458
|
+
}
|
|
459
|
+
#endif // TARGET_OS_WATCH
|
|
460
|
+
|
|
389
461
|
#if !TARGET_OS_TV
|
|
390
462
|
- (BOOL)fb_setSimulatedLocation:(CLLocation *)location error:(NSError **)error
|
|
391
463
|
{
|
|
@@ -89,6 +89,10 @@ BOOL FBTypeText(NSString *text, NSUInteger typingSpeed, NSError **error)
|
|
|
89
89
|
#if !TARGET_OS_TV
|
|
90
90
|
[FBLogger logFmt:@"Trying to tap the \"%@\" element to have it focused", snapshot.fb_description];
|
|
91
91
|
[self tap];
|
|
92
|
+
#if TARGET_OS_WATCH
|
|
93
|
+
// watchOS presents a full-screen keyboard sheet (a modal transition) - wait for it.
|
|
94
|
+
[self fb_waitUntilStableWithTimeout:2.0];
|
|
95
|
+
#endif
|
|
92
96
|
// It might take some time to update the UI
|
|
93
97
|
[self fb_standardSnapshot];
|
|
94
98
|
#endif
|
|
@@ -130,7 +134,14 @@ BOOL FBTypeText(NSString *text, NSUInteger typingSpeed, NSError **error)
|
|
|
130
134
|
if (shouldClear && ![self fb_clearTextWithSnapshot:wrapped shouldPrepareForInput:NO error:error]) {
|
|
131
135
|
return NO;
|
|
132
136
|
}
|
|
137
|
+
#if TARGET_OS_WATCH
|
|
138
|
+
// FBTypeText's low-level key synthesis never reaches watchOS's keyboard; -typeText: is a
|
|
139
|
+
// partial workaround (keystrokes still don't always land - a known limitation).
|
|
140
|
+
[self typeText:text];
|
|
141
|
+
return YES;
|
|
142
|
+
#else
|
|
133
143
|
return FBTypeText(text, frequency, error);
|
|
144
|
+
#endif
|
|
134
145
|
}
|
|
135
146
|
|
|
136
147
|
- (BOOL)fb_clearTextWithError:(NSError **)error
|