appium-mac2-driver 4.1.1 → 4.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 (59) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/WebDriverAgentMac/IntegrationTests/AMFindElementTests.m +165 -2
  3. package/WebDriverAgentMac/IntegrationTests/AMIntegrationTestCase.h +11 -0
  4. package/WebDriverAgentMac/IntegrationTests/AMIntegrationTestCase.m +33 -0
  5. package/WebDriverAgentMac/IntegrationTests/AMW3CActionsTests.m +7 -9
  6. package/WebDriverAgentMac/WebDriverAgent/Base.lproj/Main.storyboard +16 -1
  7. package/WebDriverAgentMac/WebDriverAgent/WebViewController.h +21 -0
  8. package/WebDriverAgentMac/WebDriverAgent/WebViewController.m +49 -0
  9. package/WebDriverAgentMac/WebDriverAgentLib/Categories/NSPredicate+FBFormat.m +80 -0
  10. package/WebDriverAgentMac/WebDriverAgentLib/Categories/XCUIElement+AMAttributes.h +29 -1
  11. package/WebDriverAgentMac/WebDriverAgentLib/Categories/XCUIElement+AMAttributes.m +66 -15
  12. package/WebDriverAgentMac/WebDriverAgentLib/Routing/AMHTTPServer.h +84 -0
  13. package/WebDriverAgentMac/WebDriverAgentLib/Routing/AMHTTPServer.m +493 -0
  14. package/WebDriverAgentMac/WebDriverAgentLib/Routing/AMTCPSocket.h +109 -0
  15. package/WebDriverAgentMac/WebDriverAgentLib/Routing/AMTCPSocket.m +235 -0
  16. package/WebDriverAgentMac/WebDriverAgentLib/Routing/FBWebServer.h +1 -1
  17. package/WebDriverAgentMac/WebDriverAgentLib/Routing/FBWebServer.m +9 -21
  18. package/WebDriverAgentMac/WebDriverAgentLib/Routing/RouteRequest.h +36 -0
  19. package/WebDriverAgentMac/WebDriverAgentLib/Routing/RouteRequest.m +33 -0
  20. package/WebDriverAgentMac/WebDriverAgentLib/Routing/RouteResponse.h +37 -0
  21. package/WebDriverAgentMac/WebDriverAgentLib/Routing/RouteResponse.m +62 -0
  22. package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMSnapshotUtils.h +22 -0
  23. package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMSnapshotUtils.m +5 -11
  24. package/WebDriverAgentMac/WebDriverAgentLib/Utilities/FBElementUtils.m +7 -1
  25. package/WebDriverAgentMac/WebDriverAgentMac.xcodeproj/project.pbxproj +46 -180
  26. package/npm-shrinkwrap.json +75 -146
  27. package/package.json +2 -1
  28. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncSocket.h +0 -1226
  29. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncSocket.m +0 -8513
  30. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncUdpSocket.h +0 -1036
  31. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncUdpSocket.m +0 -5632
  32. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDNumber.h +0 -12
  33. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDNumber.m +0 -88
  34. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDRange.h +0 -56
  35. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDRange.m +0 -106
  36. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPConnection.h +0 -107
  37. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPConnection.m +0 -2238
  38. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPLogging.h +0 -122
  39. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPMessage.h +0 -48
  40. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPMessage.m +0 -114
  41. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPResponse.h +0 -149
  42. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPServer.h +0 -200
  43. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPServer.m +0 -720
  44. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPDataResponse.h +0 -13
  45. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPDataResponse.m +0 -83
  46. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPErrorResponse.h +0 -9
  47. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPErrorResponse.m +0 -40
  48. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/HTTPResponseProxy.h +0 -13
  49. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/HTTPResponseProxy.m +0 -84
  50. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/Route.h +0 -18
  51. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/Route.m +0 -11
  52. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteRequest.h +0 -16
  53. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteRequest.m +0 -50
  54. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteResponse.h +0 -20
  55. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteResponse.m +0 -66
  56. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingConnection.h +0 -5
  57. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingConnection.m +0 -142
  58. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.h +0 -55
  59. package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.m +0 -288
@@ -25,6 +25,12 @@
25
25
  #import "FBMacros.h"
26
26
  #import "XCUIElementQuery+AMHelpers.h"
27
27
 
28
+ NSString *const AM_IDENTIFIER_ATTRIBUTE_NAME = @"amIdentifier";
29
+ NSString *const AM_RECT_ATTRIBUTE_NAME = @"amRect";
30
+ NSString *const AM_TEXT_ATTRIBUTE_NAME = @"amText";
31
+ NSString *const AM_TYPE_ATTRIBUTE_NAME = @"amType";
32
+ NSString *const AM_HAS_KEYBOARD_INPUT_FOCUS_ATTRIBUTE_NAME = @"amHasKeyboardInputFocus";
33
+
28
34
  @implementation XCUIElement (AMAttributes)
29
35
 
30
36
  - (id)am_wdAttributeValueWithName:(NSString *)name
@@ -50,8 +56,17 @@
50
56
  return self.title;
51
57
  } else if ([wdAttributeName isEqualToString:FBStringify(XCUIElement, value)]) {
52
58
  return [FBElementUtils stringValueWithValue:self.value];
53
- } else if ([wdAttributeName isEqualToString:FBStringify(XCUIElement, identifier)]) {
54
- return self.am_wdIdentifier;
59
+ } else if ([wdAttributeName isEqualToString:FBStringify(XCUIElement, identifier)]
60
+ || [wdAttributeName isEqualToString:AM_IDENTIFIER_ATTRIBUTE_NAME]) {
61
+ return self.am_identifier;
62
+ } else if ([wdAttributeName isEqualToString:AM_RECT_ATTRIBUTE_NAME]) {
63
+ return self.am_rect;
64
+ } else if ([wdAttributeName isEqualToString:AM_TEXT_ATTRIBUTE_NAME]) {
65
+ return self.am_text;
66
+ } else if ([wdAttributeName isEqualToString:AM_TYPE_ATTRIBUTE_NAME]) {
67
+ return self.am_type;
68
+ } else if ([wdAttributeName isEqualToString:AM_HAS_KEYBOARD_INPUT_FOCUS_ATTRIBUTE_NAME]) {
69
+ return FBBoolToStr(self.am_hasKeyboardInputFocus);
55
70
  }
56
71
  // This should not happen
57
72
  NSString *description = [NSString stringWithFormat:@"The attribute '%@' is unknown", wdAttributeName];
@@ -60,32 +75,69 @@
60
75
  userInfo:@{}];
61
76
  }
62
77
 
63
- - (NSString *)am_wdIdentifier
78
+ + (NSArray<NSString *> *)am_predicateAttributeNames
79
+ {
80
+ return @[
81
+ AM_IDENTIFIER_ATTRIBUTE_NAME,
82
+ AM_RECT_ATTRIBUTE_NAME,
83
+ AM_TEXT_ATTRIBUTE_NAME,
84
+ AM_TYPE_ATTRIBUTE_NAME,
85
+ AM_HAS_KEYBOARD_INPUT_FOCUS_ATTRIBUTE_NAME,
86
+ ];
87
+ }
88
+
89
+ + (nullable id)am_valueForPredicateAttributeName:(NSString *)name target:(id)target
64
90
  {
65
- NSString *identifier = self.identifier;
66
- // Snapshotting is not free, so only pay for it when the fallback can apply.
67
- if (identifier.length > 0 || !FBConfiguration.sharedConfiguration.useDomIdAsAccessibilityId) {
68
- return identifier;
91
+ if ([name isEqualToString:AM_IDENTIFIER_ATTRIBUTE_NAME]) {
92
+ NSString *identifier = [target valueForKey:@"identifier"];
93
+ // Snapshotting is not free, so only pay for it when the fallback can apply.
94
+ if (identifier.length > 0 || !FBConfiguration.sharedConfiguration.useDomIdAsAccessibilityId) {
95
+ return identifier;
96
+ }
97
+ // domIdentifierWithSnapshot: relies on snapshot-only key paths (_accessibilityElement._token),
98
+ // which a live XCUIElement does not have, so it must be snapshotted first.
99
+ id snapshotTarget = [target isKindOfClass:XCUIElement.class]
100
+ ? [(XCUIElement *)target snapshotWithError:nil]
101
+ : target;
102
+ return [AMSnapshotUtils domIdentifierWithSnapshot:snapshotTarget] ?: identifier;
69
103
  }
70
- return [AMSnapshotUtils wdIdentifierWithSnapshot:[self snapshotWithError:nil]] ?: identifier;
104
+ if ([name isEqualToString:AM_RECT_ATTRIBUTE_NAME]) {
105
+ return AMCGRectToDict([[target valueForKey:@"frame"] rectValue]);
106
+ }
107
+ if ([name isEqualToString:AM_TEXT_ATTRIBUTE_NAME]) {
108
+ return [self am_textWithSource:target];
109
+ }
110
+ if ([name isEqualToString:AM_TYPE_ATTRIBUTE_NAME]) {
111
+ return [FBElementTypeTransformer stringWithElementType:[[target valueForKey:@"elementType"] unsignedLongLongValue]];
112
+ }
113
+ if ([name isEqualToString:AM_HAS_KEYBOARD_INPUT_FOCUS_ATTRIBUTE_NAME]) {
114
+ NSPredicate *predicate = [NSPredicate predicateWithFormat:@"hasKeyboardFocus == YES"];
115
+ return @([predicate evaluateWithObject:target]);
116
+ }
117
+ return nil;
118
+ }
119
+
120
+ - (NSString *)am_identifier
121
+ {
122
+ return [self.class am_valueForPredicateAttributeName:AM_IDENTIFIER_ATTRIBUTE_NAME target:self];
71
123
  }
72
124
 
73
125
  - (NSDictionary<NSString *, NSNumber *> *)am_rect
74
126
  {
75
- return AMCGRectToDict(self.frame);
127
+ return [self.class am_valueForPredicateAttributeName:AM_RECT_ATTRIBUTE_NAME target:self];
76
128
  }
77
129
 
78
130
  - (NSString *)am_text
79
131
  {
80
132
  if (!FBConfiguration.sharedConfiguration.fetchFullText) {
81
- return [self am_textWithSource:self];
133
+ return [self.class am_valueForPredicateAttributeName:AM_TEXT_ATTRIBUTE_NAME target:self];
82
134
  }
83
135
 
84
136
  NSError *error;
85
137
  XCUIElementQuery *query = [self valueForKey:@"query"];
86
138
  id<XCUIElementAttributes> snapshot = [query am_uniqueSnapshotWithError:&error];
87
139
  if (nil != snapshot) {
88
- return [self am_textWithSource:snapshot];
140
+ return [self.class am_valueForPredicateAttributeName:AM_TEXT_ATTRIBUTE_NAME target:snapshot];
89
141
  }
90
142
 
91
143
  NSString *reason = [NSString stringWithFormat:@"Cannot extract the full text of '%@' element. Original error: %@",
@@ -95,16 +147,15 @@
95
147
 
96
148
  - (NSString *)am_type
97
149
  {
98
- return [FBElementTypeTransformer stringWithElementType:self.elementType];
150
+ return [self.class am_valueForPredicateAttributeName:AM_TYPE_ATTRIBUTE_NAME target:self];
99
151
  }
100
152
 
101
153
  - (BOOL)am_hasKeyboardInputFocus
102
154
  {
103
- NSPredicate *predicate = [NSPredicate predicateWithFormat:@"hasKeyboardFocus == YES"];
104
- return [predicate evaluateWithObject:self];
155
+ return [[self.class am_valueForPredicateAttributeName:AM_HAS_KEYBOARD_INPUT_FOCUS_ATTRIBUTE_NAME target:self] boolValue];
105
156
  }
106
157
 
107
- - (NSString *)am_textWithSource:(id<XCUIElementAttributes>)source
158
+ + (NSString *)am_textWithSource:(id<XCUIElementAttributes>)source
108
159
  {
109
160
  NSArray<NSString *> *candidates = @[
110
161
  [FBElementUtils stringValueWithValue:source.value],
@@ -0,0 +1,84 @@
1
+ /*
2
+ * Licensed under the Apache License, Version 2.0 (the "License");
3
+ * you may not use this file except in compliance with the License.
4
+ * See the NOTICE file distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ // A minimal HTTP/1.1 server on top of AMTCPSocket (Network.framework-backed).
18
+ //
19
+ // No chunked encoding, range requests, or pipelining - just request line + headers +
20
+ // Content-Length body, and ":param" path matching.
21
+
22
+ #import <Foundation/Foundation.h>
23
+
24
+ #import "RouteRequest.h"
25
+ #import "RouteResponse.h"
26
+
27
+ NS_ASSUME_NONNULL_BEGIN
28
+
29
+ @interface AMHTTPServer : NSObject
30
+
31
+ /*! The port the server is (or will be) listening on */
32
+ @property (nonatomic) uint16_t port;
33
+
34
+ /*! Whether the server is currently listening for connections */
35
+ @property (nonatomic, readonly) BOOL isRunning;
36
+
37
+ /**
38
+ Sets the dispatch queue on which route blocks are invoked. Pass NULL to invoke them
39
+ synchronously on the socket's own queue.
40
+ */
41
+ - (void)setRouteQueue:(nullable dispatch_queue_t)queue;
42
+
43
+ /**
44
+ Sets a header which is added to every response, unless overridden by the route itself.
45
+ */
46
+ - (void)setDefaultHeader:(NSString *)field value:(NSString *)value;
47
+
48
+ /**
49
+ Sets the local IP address to bind the listener to. Must be called before -start:. Pass nil (the
50
+ default) to listen on all interfaces.
51
+ */
52
+ - (void)setInterface:(nullable NSString *)interface;
53
+
54
+ /**
55
+ Registers a route handler for the given HTTP method and path pattern (":param" segments are
56
+ captured into the request's `params`).
57
+ */
58
+ - (void)handleMethod:(NSString *)method
59
+ withPath:(NSString *)path
60
+ block:(void (^)(RouteRequest *request, RouteResponse *response))block;
61
+
62
+ /**
63
+ Convenience for -handleMethod:@"GET" withPath:path block:block.
64
+ */
65
+ - (void)get:(NSString *)path withBlock:(void (^)(RouteRequest *request, RouteResponse *response))block;
66
+
67
+ /**
68
+ Convenience for -handleMethod:@"DELETE" withPath:path block:block.
69
+ */
70
+ - (void)delete:(NSString *)path withBlock:(void (^)(RouteRequest *request, RouteResponse *response))block;
71
+
72
+ /**
73
+ Starts listening on `port`.
74
+ */
75
+ - (BOOL)start:(NSError **)error;
76
+
77
+ /**
78
+ Stops listening and disconnects all clients.
79
+ */
80
+ - (void)stop:(BOOL)immediately;
81
+
82
+ @end
83
+
84
+ NS_ASSUME_NONNULL_END