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.
Files changed (66) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h +3 -3
  3. package/PrivateHeaders/XCTest/XCUIApplication.h +1 -1
  4. package/PrivateHeaders/XCTest/XCUIDevice.h +0 -1
  5. package/PrivateHeaders/XCTest/XCUIElement.h +1 -1
  6. package/Scripts/build.sh +6 -0
  7. package/WebDriverAgent.xcodeproj/project.pbxproj +1482 -2
  8. package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp_watchOS.xcscheme +76 -0
  9. package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_watchOS.xcscheme +86 -0
  10. package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_watchOS.xcscheme +85 -0
  11. package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner.xcscheme +1 -1
  12. package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_watchOS.xcscheme +128 -0
  13. package/WebDriverAgentLib/Categories/XCUIApplication+FBAlert.m +5 -0
  14. package/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m +2 -0
  15. package/WebDriverAgentLib/Categories/XCUIApplication+FBTouchAction.m +1 -1
  16. package/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.h +34 -0
  17. package/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m +76 -4
  18. package/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h +1 -1
  19. package/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m +1 -1
  20. package/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.m +1 -1
  21. package/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m +11 -0
  22. package/WebDriverAgentLib/Commands/FBCustomCommands.m +55 -4
  23. package/WebDriverAgentLib/Commands/FBElementCommands.m +6 -5
  24. package/WebDriverAgentLib/Commands/FBOrientationCommands.m +1 -1
  25. package/WebDriverAgentLib/Commands/FBSessionCommands.m +29 -5
  26. package/WebDriverAgentLib/Info.plist +2 -2
  27. package/WebDriverAgentLib/Routing/FBTCPSocket.h +70 -0
  28. package/WebDriverAgentLib/Routing/FBTCPSocket.m +199 -0
  29. package/WebDriverAgentLib/Routing/FBWebServer.m +33 -3
  30. package/WebDriverAgentLib/Routing/WatchOS/FBWatchHTTPServer.h +68 -0
  31. package/WebDriverAgentLib/Routing/WatchOS/FBWatchHTTPServer.m +376 -0
  32. package/WebDriverAgentLib/Routing/WatchOS/RouteRequest.h +30 -0
  33. package/WebDriverAgentLib/Routing/WatchOS/RouteRequest.m +25 -0
  34. package/WebDriverAgentLib/Routing/WatchOS/RouteResponse.h +30 -0
  35. package/WebDriverAgentLib/Routing/WatchOS/RouteResponse.m +54 -0
  36. package/WebDriverAgentLib/Utilities/FBActiveAppDetectionPoint.m +8 -0
  37. package/WebDriverAgentLib/Utilities/FBBaseActionsSynthesizer.h +1 -1
  38. package/WebDriverAgentLib/Utilities/FBBaseActionsSynthesizer.m +1 -1
  39. package/WebDriverAgentLib/Utilities/FBConfiguration.h +1 -1
  40. package/WebDriverAgentLib/Utilities/FBConfiguration.m +3 -3
  41. package/WebDriverAgentLib/Utilities/FBImageProcessor.m +7 -2
  42. package/WebDriverAgentLib/Utilities/FBMacros.h +14 -5
  43. package/WebDriverAgentLib/Utilities/FBMathUtils.h +1 -1
  44. package/WebDriverAgentLib/Utilities/FBMathUtils.m +1 -1
  45. package/WebDriverAgentLib/Utilities/FBPasteboard.h +1 -1
  46. package/WebDriverAgentLib/Utilities/FBPasteboard.m +1 -1
  47. package/WebDriverAgentLib/Utilities/FBSettingsHandler.m +2 -2
  48. package/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.h +1 -1
  49. package/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.m +1 -1
  50. package/WebDriverAgentTests/IntegrationApp_watchOS/ContentView.swift +31 -0
  51. package/WebDriverAgentTests/IntegrationApp_watchOS/WatchSpikeApp.swift +18 -0
  52. package/WebDriverAgentTests/IntegrationTests/FBForceTouchTests.m +3 -0
  53. package/WebDriverAgentTests/IntegrationTests/FBPasteboardTests.m +3 -2
  54. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAAlertIntegrationTests.swift +23 -0
  55. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAAppLifecycleIntegrationTests.swift +57 -0
  56. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAClickIntegrationTests.swift +31 -0
  57. package/WebDriverAgentTests/IntegrationTests_watchOS/WDADeviceIntegrationTests.swift +113 -0
  58. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAElementAttributeIntegrationTests.swift +57 -0
  59. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAFindIntegrationTests.swift +126 -0
  60. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAScreenshotAndSourceIntegrationTests.swift +52 -0
  61. package/WebDriverAgentTests/IntegrationTests_watchOS/WDASessionIntegrationTests.swift +72 -0
  62. package/WebDriverAgentTests/IntegrationTests_watchOS/WDATypingIntegrationTests.swift +57 -0
  63. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAUnknownCommandIntegrationTests.swift +24 -0
  64. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAWatchHTTPClient.swift +95 -0
  65. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAWatchIntegrationTestCase.swift +61 -0
  66. 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>
@@ -1,7 +1,7 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <Scheme
3
3
  LastUpgradeVersion = "2600"
4
- version = "1.3">
4
+ version = "1.7">
5
5
  <BuildAction
6
6
  parallelizeBuildables = "YES"
7
7
  buildImplicitDependencies = "YES">
@@ -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]
@@ -18,7 +18,7 @@
18
18
  #import "FBXCTestDaemonsProxy.h"
19
19
  #import "XCUIElement+FBUtilities.h"
20
20
 
21
- #if !TARGET_OS_TV
21
+ #if !TARGET_OS_TV && !TARGET_OS_WATCH
22
22
 
23
23
  @implementation XCUIApplication (FBTouchAction)
24
24
 
@@ -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
  {
@@ -10,7 +10,7 @@
10
10
 
11
11
  NS_ASSUME_NONNULL_BEGIN
12
12
 
13
- #if !TARGET_OS_TV
13
+ #if !TARGET_OS_TV && !TARGET_OS_WATCH
14
14
  @interface XCUIDevice (FBRotation)
15
15
 
16
16
  /**
@@ -13,7 +13,7 @@
13
13
  #import "XCUIApplication+FBHelpers.h"
14
14
  #import "XCUIElement+FBUtilities.h"
15
15
 
16
- # if !TARGET_OS_TV
16
+ # if !TARGET_OS_TV && !TARGET_OS_WATCH
17
17
 
18
18
  @implementation XCUIDevice (FBRotation)
19
19
 
@@ -16,7 +16,7 @@
16
16
  #import "XCUIElement+FBCaching.h"
17
17
  #import "XCUIElement+FBResolve.h"
18
18
 
19
- #if !TARGET_OS_TV
19
+ #if !TARGET_OS_TV && !TARGET_OS_WATCH
20
20
  @implementation XCUIElement (FBPickerWheel)
21
21
 
22
22
  static const NSTimeInterval VALUE_CHANGE_TIMEOUT = 2;
@@ -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