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.
- package/CHANGELOG.md +12 -0
- package/WebDriverAgentMac/IntegrationTests/AMFindElementTests.m +165 -2
- package/WebDriverAgentMac/IntegrationTests/AMIntegrationTestCase.h +11 -0
- package/WebDriverAgentMac/IntegrationTests/AMIntegrationTestCase.m +33 -0
- package/WebDriverAgentMac/IntegrationTests/AMW3CActionsTests.m +7 -9
- package/WebDriverAgentMac/WebDriverAgent/Base.lproj/Main.storyboard +16 -1
- package/WebDriverAgentMac/WebDriverAgent/WebViewController.h +21 -0
- package/WebDriverAgentMac/WebDriverAgent/WebViewController.m +49 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Categories/NSPredicate+FBFormat.m +80 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Categories/XCUIElement+AMAttributes.h +29 -1
- package/WebDriverAgentMac/WebDriverAgentLib/Categories/XCUIElement+AMAttributes.m +66 -15
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/AMHTTPServer.h +84 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/AMHTTPServer.m +493 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/AMTCPSocket.h +109 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/AMTCPSocket.m +235 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/FBWebServer.h +1 -1
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/FBWebServer.m +9 -21
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/RouteRequest.h +36 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/RouteRequest.m +33 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/RouteResponse.h +37 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/RouteResponse.m +62 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMSnapshotUtils.h +22 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMSnapshotUtils.m +5 -11
- package/WebDriverAgentMac/WebDriverAgentLib/Utilities/FBElementUtils.m +7 -1
- package/WebDriverAgentMac/WebDriverAgentMac.xcodeproj/project.pbxproj +46 -180
- package/npm-shrinkwrap.json +75 -146
- package/package.json +2 -1
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncSocket.h +0 -1226
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncSocket.m +0 -8513
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncUdpSocket.h +0 -1036
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaAsyncSocket/GCDAsyncUdpSocket.m +0 -5632
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDNumber.h +0 -12
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDNumber.m +0 -88
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDRange.h +0 -56
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Categories/DDRange.m +0 -106
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPConnection.h +0 -107
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPConnection.m +0 -2238
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPLogging.h +0 -122
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPMessage.h +0 -48
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPMessage.m +0 -114
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPResponse.h +0 -149
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPServer.h +0 -200
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/HTTPServer.m +0 -720
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPDataResponse.h +0 -13
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPDataResponse.m +0 -83
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPErrorResponse.h +0 -9
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/CocoaHTTPServer/Responses/HTTPErrorResponse.m +0 -40
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/HTTPResponseProxy.h +0 -13
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/HTTPResponseProxy.m +0 -84
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/Route.h +0 -18
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/Route.m +0 -11
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteRequest.h +0 -16
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteRequest.m +0 -50
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteResponse.h +0 -20
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RouteResponse.m +0 -66
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingConnection.h +0 -5
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingConnection.m +0 -142
- package/WebDriverAgentMac/WebDriverAgentLib/Vendor/RoutingHTTPServer/RoutingHTTPServer.h +0 -55
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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 [
|
|
150
|
+
return [self.class am_valueForPredicateAttributeName:AM_TYPE_ATTRIBUTE_NAME target:self];
|
|
99
151
|
}
|
|
100
152
|
|
|
101
153
|
- (BOOL)am_hasKeyboardInputFocus
|
|
102
154
|
{
|
|
103
|
-
|
|
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
|
-
|
|
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
|