appium-webdriveragent 16.2.2 → 16.3.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 (64) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h +3 -3
  3. package/PrivateHeaders/XCTest/XCUIApplication.h +1 -1
  4. package/PrivateHeaders/XCTest/XCUIElement.h +1 -1
  5. package/Scripts/build.sh +6 -0
  6. package/WebDriverAgent.xcodeproj/project.pbxproj +1482 -2
  7. package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationApp_watchOS.xcscheme +76 -0
  8. package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/IntegrationTests_watchOS.xcscheme +86 -0
  9. package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentLib_watchOS.xcscheme +85 -0
  10. package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner.xcscheme +1 -1
  11. package/WebDriverAgent.xcodeproj/xcshareddata/xcschemes/WebDriverAgentRunner_watchOS.xcscheme +128 -0
  12. package/WebDriverAgentLib/Categories/XCUIApplication+FBAlert.m +5 -0
  13. package/WebDriverAgentLib/Categories/XCUIApplication+FBHelpers.m +2 -0
  14. package/WebDriverAgentLib/Categories/XCUIApplication+FBTouchAction.m +1 -1
  15. package/WebDriverAgentLib/Categories/XCUIDevice+FBHelpers.m +4 -4
  16. package/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.h +1 -1
  17. package/WebDriverAgentLib/Categories/XCUIDevice+FBRotation.m +1 -1
  18. package/WebDriverAgentLib/Categories/XCUIElement+FBPickerWheel.m +1 -1
  19. package/WebDriverAgentLib/Categories/XCUIElement+FBTyping.m +11 -0
  20. package/WebDriverAgentLib/Commands/FBCustomCommands.m +19 -4
  21. package/WebDriverAgentLib/Commands/FBElementCommands.m +6 -5
  22. package/WebDriverAgentLib/Commands/FBOrientationCommands.m +1 -1
  23. package/WebDriverAgentLib/Commands/FBSessionCommands.m +29 -5
  24. package/WebDriverAgentLib/Info.plist +2 -2
  25. package/WebDriverAgentLib/Routing/FBTCPSocket.h +70 -0
  26. package/WebDriverAgentLib/Routing/FBTCPSocket.m +199 -0
  27. package/WebDriverAgentLib/Routing/FBWebServer.m +33 -3
  28. package/WebDriverAgentLib/Routing/WatchOS/FBWatchHTTPServer.h +68 -0
  29. package/WebDriverAgentLib/Routing/WatchOS/FBWatchHTTPServer.m +376 -0
  30. package/WebDriverAgentLib/Routing/WatchOS/RouteRequest.h +30 -0
  31. package/WebDriverAgentLib/Routing/WatchOS/RouteRequest.m +25 -0
  32. package/WebDriverAgentLib/Routing/WatchOS/RouteResponse.h +30 -0
  33. package/WebDriverAgentLib/Routing/WatchOS/RouteResponse.m +54 -0
  34. package/WebDriverAgentLib/Utilities/FBActiveAppDetectionPoint.m +8 -0
  35. package/WebDriverAgentLib/Utilities/FBBaseActionsSynthesizer.h +1 -1
  36. package/WebDriverAgentLib/Utilities/FBBaseActionsSynthesizer.m +1 -1
  37. package/WebDriverAgentLib/Utilities/FBConfiguration.h +1 -1
  38. package/WebDriverAgentLib/Utilities/FBConfiguration.m +3 -3
  39. package/WebDriverAgentLib/Utilities/FBImageProcessor.m +7 -2
  40. package/WebDriverAgentLib/Utilities/FBMacros.h +14 -5
  41. package/WebDriverAgentLib/Utilities/FBMathUtils.h +1 -1
  42. package/WebDriverAgentLib/Utilities/FBMathUtils.m +1 -1
  43. package/WebDriverAgentLib/Utilities/FBPasteboard.h +1 -1
  44. package/WebDriverAgentLib/Utilities/FBPasteboard.m +1 -1
  45. package/WebDriverAgentLib/Utilities/FBSettingsHandler.m +2 -2
  46. package/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.h +1 -1
  47. package/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.m +1 -1
  48. package/WebDriverAgentTests/IntegrationApp_watchOS/ContentView.swift +31 -0
  49. package/WebDriverAgentTests/IntegrationApp_watchOS/WatchSpikeApp.swift +18 -0
  50. package/WebDriverAgentTests/IntegrationTests/FBForceTouchTests.m +3 -0
  51. package/WebDriverAgentTests/IntegrationTests/FBPasteboardTests.m +3 -2
  52. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAAlertIntegrationTests.swift +23 -0
  53. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAAppLifecycleIntegrationTests.swift +57 -0
  54. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAClickIntegrationTests.swift +31 -0
  55. package/WebDriverAgentTests/IntegrationTests_watchOS/WDADeviceIntegrationTests.swift +50 -0
  56. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAElementAttributeIntegrationTests.swift +57 -0
  57. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAFindIntegrationTests.swift +126 -0
  58. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAScreenshotAndSourceIntegrationTests.swift +52 -0
  59. package/WebDriverAgentTests/IntegrationTests_watchOS/WDASessionIntegrationTests.swift +72 -0
  60. package/WebDriverAgentTests/IntegrationTests_watchOS/WDATypingIntegrationTests.swift +57 -0
  61. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAUnknownCommandIntegrationTests.swift +24 -0
  62. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAWatchHTTPClient.swift +95 -0
  63. package/WebDriverAgentTests/IntegrationTests_watchOS/WDAWatchIntegrationTestCase.swift +61 -0
  64. 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
 
@@ -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
  }
@@ -357,9 +357,9 @@ static bool fb_isLocked;
357
357
  return YES;
358
358
  }
359
359
 
360
- #if __clang_major__ >= 15 || (__clang_major__ >= 14 && __clang_minor__ >= 0 && __clang_patchlevel__ >= 3)
360
+ #if !TARGET_OS_WATCH && (__clang_major__ >= 15 || (__clang_major__ >= 14 && __clang_minor__ >= 0 && __clang_patchlevel__ >= 3))
361
361
  // Xcode 14.3.1 can build these values.
362
- // For iOS 17+
362
+ // For iOS 17+; the `appearance` property does not exist on watchOS
363
363
  if ([self respondsToSelector:NSSelectorFromString(@"appearance")]) {
364
364
  self.appearance = (XCUIDeviceAppearance) appearance;
365
365
  return YES;
@@ -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
@@ -8,6 +8,9 @@
8
8
 
9
9
  #import "FBCustomCommands.h"
10
10
 
11
+ #if TARGET_OS_WATCH
12
+ @import WatchKit;
13
+ #endif
11
14
  #import <XCTest/XCUIDevice.h>
12
15
  #import <CoreLocation/CoreLocation.h>
13
16
 
@@ -52,7 +55,7 @@
52
55
  [[FBRoute GET:@"/wda/screen"].withoutSession respondWithTarget:self action:@selector(handleGetScreen:)],
53
56
  [[FBRoute GET:@"/wda/activeAppInfo"] respondWithTarget:self action:@selector(handleActiveAppInfo:)],
54
57
  [[FBRoute GET:@"/wda/activeAppInfo"].withoutSession respondWithTarget:self action:@selector(handleActiveAppInfo:)],
55
- #if !TARGET_OS_TV // tvOS does not provide relevant APIs
58
+ #if !TARGET_OS_TV && !TARGET_OS_WATCH // tvOS/watchOS do not provide relevant APIs
56
59
  [[FBRoute POST:@"/wda/setPasteboard"] respondWithTarget:self action:@selector(handleSetPasteboard:)],
57
60
  [[FBRoute POST:@"/wda/setPasteboard"].withoutSession respondWithTarget:self action:@selector(handleSetPasteboard:)],
58
61
  [[FBRoute POST:@"/wda/getPasteboard"] respondWithTarget:self action:@selector(handleGetPasteboard:)],
@@ -72,8 +75,10 @@
72
75
  [[FBRoute GET:@"/wda/device/location"] respondWithTarget:self action:@selector(handleGetLocation:)],
73
76
  [[FBRoute GET:@"/wda/device/location"].withoutSession respondWithTarget:self action:@selector(handleGetLocation:)],
74
77
  #if !TARGET_OS_TV // tvOS does not provide relevant APIs
78
+ #if !TARGET_OS_WATCH
75
79
  #if __clang_major__ >= 15
76
80
  [[FBRoute POST:@"/wda/element/:uuid/keyboardInput"] respondWithTarget:self action:@selector(handleKeyboardInput:)],
81
+ #endif
77
82
  #endif
78
83
  [[FBRoute GET:@"/wda/simulatedLocation"] respondWithTarget:self action:@selector(handleGetSimulatedLocation:)],
79
84
  [[FBRoute GET:@"/wda/simulatedLocation"].withoutSession respondWithTarget:self action:@selector(handleGetSimulatedLocation:)],
@@ -151,7 +156,7 @@
151
156
  XCUIElement *mainStatusBar = app.statusBars.allElementsBoundByIndex.firstObject;
152
157
  CGSize statusBarSize = (nil == mainStatusBar) ? CGSizeZero : mainStatusBar.frame.size;
153
158
 
154
- #if TARGET_OS_TV
159
+ #if TARGET_OS_TV || TARGET_OS_WATCH
155
160
  CGSize screenSize = app.frame.size;
156
161
  #else
157
162
  CGSize screenSize = FBAdjustDimensionsForApplication(app.wdFrame.size, app.interfaceOrientation);
@@ -240,7 +245,7 @@
240
245
  };
241
246
  }
242
247
 
243
- #if !TARGET_OS_TV
248
+ #if !TARGET_OS_TV && !TARGET_OS_WATCH
244
249
  + (id<FBResponsePayload>)handleSetPasteboard:(FBRouteRequest *)request
245
250
  {
246
251
  NSString *contentType = request.arguments[@"contentType"] ?: @"plaintext";
@@ -357,7 +362,9 @@
357
362
  [locationManager setDistanceFilter:kCLHeadingFilterNone];
358
363
  // Always return the best acurate location data
359
364
  [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
365
+ #if !TARGET_OS_WATCH
360
366
  [locationManager setPausesLocationUpdatesAutomatically:NO];
367
+ #endif
361
368
  [locationManager startUpdatingLocation];
362
369
 
363
370
  CLAuthorizationStatus authStatus;
@@ -438,11 +445,17 @@
438
445
  @{
439
446
  @"currentLocale": currentLocale,
440
447
  @"timeZone": self.timeZone,
448
+ #if TARGET_OS_WATCH
449
+ @"name": WKInterfaceDevice.currentDevice.name,
450
+ @"model": WKInterfaceDevice.currentDevice.model,
451
+ @"uuid": @"unknown",
452
+ #else
441
453
  @"name": UIDevice.currentDevice.name,
442
454
  @"model": UIDevice.currentDevice.model,
443
455
  @"uuid": [UIDevice.currentDevice.identifierForVendor UUIDString] ?: @"unknown",
444
456
  // https://developer.apple.com/documentation/uikit/uiuserinterfaceidiom?language=objc
445
457
  @"userInterfaceIdiom": @(UIDevice.currentDevice.userInterfaceIdiom),
458
+ #endif
446
459
  @"userInterfaceStyle": self.userInterfaceStyle,
447
460
  #if TARGET_OS_SIMULATOR
448
461
  @"isSimulator": @(YES),
@@ -473,6 +486,7 @@
473
486
  }
474
487
 
475
488
  static id userInterfaceStyle = nil;
489
+ #if !TARGET_OS_WATCH
476
490
  static dispatch_once_t styleOnceToken;
477
491
  dispatch_once(&styleOnceToken, ^{
478
492
  if ([UITraitCollection respondsToSelector:NSSelectorFromString(@"currentTraitCollection")]) {
@@ -482,6 +496,7 @@
482
496
  }
483
497
  }
484
498
  });
499
+ #endif
485
500
 
486
501
  if (nil == userInterfaceStyle) {
487
502
  return @"unsupported";
@@ -571,7 +586,7 @@
571
586
  return FBResponseWithOK();
572
587
  }
573
588
 
574
- #if __clang_major__ >= 15
589
+ #if __clang_major__ >= 15 && !TARGET_OS_WATCH
575
590
  + (id<FBResponsePayload>)handleKeyboardInput:(FBRouteRequest *)request
576
591
  {
577
592
  FBElementCache *elementCache = request.session.elementCache;
@@ -73,7 +73,8 @@
73
73
  #if TARGET_OS_TV
74
74
  [[FBRoute GET:@"/element/:uuid/attribute/focused"] respondWithTarget:self action:@selector(handleGetFocused:)],
75
75
  [[FBRoute POST:@"/wda/element/:uuid/focuse"] respondWithTarget:self action:@selector(handleFocuse:)],
76
- #else
76
+ #elif !TARGET_OS_WATCH
77
+ // Gesture synthesis isn't supported on watchOS - only /element/:uuid/click is available.
77
78
  [[FBRoute POST:@"/wda/element/:uuid/swipe"] respondWithTarget:self action:@selector(handleSwipe:)],
78
79
  [[FBRoute POST:@"/wda/swipe"] respondWithTarget:self action:@selector(handleSwipe:)],
79
80
 
@@ -205,7 +206,7 @@
205
206
  ? [value componentsJoinedByString:@""]
206
207
  : value;
207
208
  XCUIElementType elementType = [element elementType];
208
- #if !TARGET_OS_TV
209
+ #if !TARGET_OS_TV && !TARGET_OS_WATCH
209
210
  if (elementType == XCUIElementTypePickerWheel) {
210
211
  [element adjustToPickerWheelValue:textToType];
211
212
  return FBResponseWithOK();
@@ -239,7 +240,7 @@
239
240
  {
240
241
  FBElementCache *elementCache = request.session.elementCache;
241
242
  XCUIElement *element = [elementCache elementForUUID:(NSString *)request.parameters[@"uuid"] checkStaleness:YES];
242
- #if TARGET_OS_IOS
243
+ #if TARGET_OS_IOS || TARGET_OS_WATCH
243
244
  [element tap];
244
245
  #elif TARGET_OS_TV
245
246
  NSError *error = nil;
@@ -534,7 +535,7 @@
534
535
  XCUIApplication *app = request.session.activeApplication ?: XCUIApplication.fb_activeApplication;
535
536
 
536
537
  CGRect frame = app.wdFrame;
537
- #if TARGET_OS_TV
538
+ #if TARGET_OS_TV || TARGET_OS_WATCH
538
539
  CGSize screenSize = frame.size;
539
540
  #else
540
541
  CGSize screenSize = FBAdjustDimensionsForApplication(frame.size, app.interfaceOrientation);
@@ -551,7 +552,7 @@
551
552
  XCUIApplication *app = request.session.activeApplication ?: XCUIApplication.fb_activeApplication;
552
553
 
553
554
  CGRect frame = app.wdFrame;
554
- #if TARGET_OS_TV
555
+ #if TARGET_OS_TV || TARGET_OS_WATCH
555
556
  CGSize screenSize = frame.size;
556
557
  #else
557
558
  CGSize screenSize = FBAdjustDimensionsForApplication(frame.size, app.interfaceOrientation);
@@ -29,7 +29,7 @@ const struct FBWDOrientationValues FBWDOrientationValues = {
29
29
  .portraitUpsideDown = @"UIA_DEVICE_ORIENTATION_PORTRAIT_UPSIDEDOWN",
30
30
  };
31
31
 
32
- #if !TARGET_OS_TV
32
+ #if !TARGET_OS_TV && !TARGET_OS_WATCH
33
33
 
34
34
  @implementation FBOrientationCommands
35
35