appium-webdriveragent 4.10.4 → 4.10.6
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 +4 -0
- package/WebDriverAgentLib/Categories/XCUIElement+FBFind.m +7 -36
- package/WebDriverAgentLib/Categories/XCUIElement+FBResolve.m +1 -1
- package/WebDriverAgentLib/Categories/XCUIElement+FBUID.h +8 -0
- package/WebDriverAgentLib/Categories/XCUIElement+FBUID.m +6 -1
- package/WebDriverAgentLib/Categories/XCUIElement+FBUtilities.m +6 -3
- package/WebDriverAgentLib/Categories/XCUIElement+FBWebDriverAttributes.h +8 -0
- package/WebDriverAgentLib/Categories/XCUIElement+FBWebDriverAttributes.m +9 -4
- package/WebDriverAgentLib/Routing/FBElementUtils.m +1 -1
- package/WebDriverAgentLib/Routing/FBXCElementSnapshotWrapper.m +7 -0
- package/WebDriverAgentLib/Utilities/NSPredicate+FBFormat.m +4 -0
- package/WebDriverAgentRunner-Runner.app.zip +0 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
## [4.10.6](https://github.com/appium/WebDriverAgent/compare/v4.10.5...v4.10.6) (2022-11-23)
|
|
2
|
+
|
|
3
|
+
## [4.10.5](https://github.com/appium/WebDriverAgent/compare/v4.10.4...v4.10.5) (2022-11-22)
|
|
4
|
+
|
|
1
5
|
## [4.10.4](https://github.com/appium/WebDriverAgent/compare/v4.10.3...v4.10.4) (2022-11-22)
|
|
2
6
|
|
|
3
7
|
## [4.10.3](https://github.com/appium/WebDriverAgent/compare/v4.10.2...v4.10.3) (2022-11-22)
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
#import "FBXCElementSnapshotWrapper+Helpers.h"
|
|
17
17
|
#import "FBXCodeCompatibility.h"
|
|
18
18
|
#import "XCUIElement+FBCaching.h"
|
|
19
|
+
#import "XCUIElement+FBUID.h"
|
|
19
20
|
#import "XCUIElement+FBUtilities.h"
|
|
20
21
|
#import "XCUIElement+FBWebDriverAttributes.h"
|
|
21
22
|
#import "XCUIElementQuery.h"
|
|
@@ -48,7 +49,8 @@
|
|
|
48
49
|
XCUIElementType type = [FBElementTypeTransformer elementTypeWithTypeName:className];
|
|
49
50
|
XCUIElementQuery *query = [self.fb_query descendantsMatchingType:type];
|
|
50
51
|
NSMutableArray *result = [NSMutableArray array];
|
|
51
|
-
[result addObjectsFromArray:[self.class fb_extractMatchingElementsFromQuery:query
|
|
52
|
+
[result addObjectsFromArray:[self.class fb_extractMatchingElementsFromQuery:query
|
|
53
|
+
shouldReturnAfterFirstMatch:shouldReturnAfterFirstMatch]];
|
|
52
54
|
id<FBXCElementSnapshot> cachedSnapshot = [self fb_cachedSnapshotWithQuery:query];
|
|
53
55
|
if (type == XCUIElementTypeAny || cachedSnapshot.elementType == type) {
|
|
54
56
|
if (shouldReturnAfterFirstMatch || result.count == 0) {
|
|
@@ -66,40 +68,10 @@
|
|
|
66
68
|
value:(NSString *)value
|
|
67
69
|
partialSearch:(BOOL)partialSearch
|
|
68
70
|
{
|
|
69
|
-
|
|
70
|
-
[self
|
|
71
|
-
return elements;
|
|
71
|
+
NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:(partialSearch ? @"%K CONTAINS %@" : @"%K == %@"), property, value];
|
|
72
|
+
return [self fb_descendantsMatchingPredicate:searchPredicate shouldReturnAfterFirstMatch:NO];
|
|
72
73
|
}
|
|
73
74
|
|
|
74
|
-
- (void)descendantsWithProperty:(NSString *)property value:(NSString *)value
|
|
75
|
-
partial:(BOOL)partialSearch
|
|
76
|
-
results:(NSMutableArray<XCUIElement *> *)results
|
|
77
|
-
{
|
|
78
|
-
if (partialSearch) {
|
|
79
|
-
NSString *text = [self fb_valueForWDAttributeName:property];
|
|
80
|
-
BOOL isString = [text isKindOfClass:[NSString class]];
|
|
81
|
-
if (isString && [text rangeOfString:value].location != NSNotFound) {
|
|
82
|
-
[results addObject:self];
|
|
83
|
-
}
|
|
84
|
-
} else {
|
|
85
|
-
if ([[self fb_valueForWDAttributeName:property] isEqual:value]) {
|
|
86
|
-
[results addObject:self];
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
property = [FBElementUtils wdAttributeNameForAttributeName:property];
|
|
91
|
-
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id<FBXCElementSnapshot> snapshot,
|
|
92
|
-
NSDictionary<NSString *,id> * _Nullable bindings) {
|
|
93
|
-
FBXCElementSnapshotWrapper *wrappedSnapshot = [FBXCElementSnapshotWrapper ensureWrapped:snapshot];
|
|
94
|
-
NSString *propertyValue = [NSString stringWithFormat:@"%@", [wrappedSnapshot fb_valueForWDAttributeName:property]];
|
|
95
|
-
return partialSearch ? [value containsString:propertyValue] : [value isEqualToString:propertyValue];
|
|
96
|
-
}];
|
|
97
|
-
XCUIElementQuery *query = [[self.fb_query descendantsMatchingType:XCUIElementTypeAny] matchingPredicate:predicate];
|
|
98
|
-
NSArray *childElements = query.fb_allMatches;
|
|
99
|
-
[results addObjectsFromArray:childElements];
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
103
75
|
#pragma mark - Search by Predicate String
|
|
104
76
|
|
|
105
77
|
- (NSArray<XCUIElement *> *)fb_descendantsMatchingPredicate:(NSPredicate *)predicate
|
|
@@ -138,7 +110,7 @@
|
|
|
138
110
|
matchingSnapshots = @[snapshot];
|
|
139
111
|
}
|
|
140
112
|
return [self fb_filterDescendantsWithSnapshots:matchingSnapshots
|
|
141
|
-
selfUID:[FBXCElementSnapshotWrapper
|
|
113
|
+
selfUID:[FBXCElementSnapshotWrapper wdUIDWithSnapshot:self.lastSnapshot]
|
|
142
114
|
onlyChildren:NO];
|
|
143
115
|
}
|
|
144
116
|
|
|
@@ -150,8 +122,7 @@
|
|
|
150
122
|
{
|
|
151
123
|
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id<FBXCElementSnapshot> snapshot,
|
|
152
124
|
NSDictionary<NSString *,id> * _Nullable bindings) {
|
|
153
|
-
|
|
154
|
-
return [wrappedSnapshot.wdName isEqualToString:accessibilityId];
|
|
125
|
+
return [[FBXCElementSnapshotWrapper wdNameWithSnapshot:snapshot] isEqualToString:accessibilityId];
|
|
155
126
|
}];
|
|
156
127
|
return [self fb_descendantsMatchingPredicate:predicate
|
|
157
128
|
shouldReturnAfterFirstMatch:shouldReturnAfterFirstMatch];
|
|
@@ -47,7 +47,7 @@ static char XCUIELEMENT_IS_RESOLVED_NATIVELY_KEY;
|
|
|
47
47
|
return self;
|
|
48
48
|
}
|
|
49
49
|
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id<FBXCElementSnapshot> snapshot, NSDictionary *bindings) {
|
|
50
|
-
return [[FBXCElementSnapshotWrapper
|
|
50
|
+
return [[FBXCElementSnapshotWrapper wdUIDWithSnapshot:snapshot] isEqualToString:uid];
|
|
51
51
|
}];
|
|
52
52
|
return (XCUIElement *)[query matchingPredicate:predicate].fb_firstMatch;
|
|
53
53
|
}
|
|
@@ -30,6 +30,14 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
30
30
|
/*! Represents unique internal element identifier, which is the same for an element and its snapshot */
|
|
31
31
|
@property (nonatomic, readonly) unsigned long long fb_accessibiltyId;
|
|
32
32
|
|
|
33
|
+
/**
|
|
34
|
+
Fetches wdUID attribute value for the given snapshot instance
|
|
35
|
+
|
|
36
|
+
@param snapshot snapshot instance
|
|
37
|
+
@return UID attribute value
|
|
38
|
+
*/
|
|
39
|
+
+ (nullable NSString *)wdUIDWithSnapshot:(id<FBXCElementSnapshot>)snapshot;
|
|
40
|
+
|
|
33
41
|
@end
|
|
34
42
|
|
|
35
43
|
NS_ASSUME_NONNULL_END
|
|
@@ -38,9 +38,14 @@
|
|
|
38
38
|
return [FBElementUtils idWithAccessibilityElement:self.accessibilityElement];
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
+
+ (nullable NSString *)wdUIDWithSnapshot:(id<FBXCElementSnapshot>)snapshot
|
|
42
|
+
{
|
|
43
|
+
return [FBElementUtils uidWithAccessibilityElement:[snapshot accessibilityElement]];
|
|
44
|
+
}
|
|
45
|
+
|
|
41
46
|
- (NSString *)fb_uid
|
|
42
47
|
{
|
|
43
|
-
return [
|
|
48
|
+
return [self.class wdUIDWithSnapshot:self.snapshot];
|
|
44
49
|
}
|
|
45
50
|
|
|
46
51
|
@end
|
|
@@ -134,13 +134,16 @@
|
|
|
134
134
|
}
|
|
135
135
|
NSMutableArray<NSString *> *sortedIds = [NSMutableArray new];
|
|
136
136
|
for (id<FBXCElementSnapshot> snapshot in snapshots) {
|
|
137
|
-
|
|
137
|
+
NSString *uid = [FBXCElementSnapshotWrapper wdUIDWithSnapshot:snapshot];
|
|
138
|
+
if (nil != uid) {
|
|
139
|
+
[sortedIds addObject:uid];
|
|
140
|
+
}
|
|
138
141
|
}
|
|
139
142
|
NSMutableArray<XCUIElement *> *matchedElements = [NSMutableArray array];
|
|
140
143
|
NSString *uid = selfUID;
|
|
141
144
|
if (nil == uid) {
|
|
142
145
|
uid = self.fb_isResolvedFromCache.boolValue
|
|
143
|
-
? [FBXCElementSnapshotWrapper
|
|
146
|
+
? [FBXCElementSnapshotWrapper wdUIDWithSnapshot:self.lastSnapshot]
|
|
144
147
|
: self.fb_uid;
|
|
145
148
|
}
|
|
146
149
|
if ([sortedIds containsObject:uid]) {
|
|
@@ -158,7 +161,7 @@
|
|
|
158
161
|
? [self.fb_query childrenMatchingType:type]
|
|
159
162
|
: [self.fb_query descendantsMatchingType:type];
|
|
160
163
|
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id<FBXCElementSnapshot> snapshot, NSDictionary *bindings) {
|
|
161
|
-
return [sortedIds containsObject:
|
|
164
|
+
return [sortedIds containsObject:[FBXCElementSnapshotWrapper wdUIDWithSnapshot:snapshot] ?: @""];
|
|
162
165
|
}];
|
|
163
166
|
query = [query matchingPredicate:predicate];
|
|
164
167
|
if (1 == snapshots.count) {
|
|
@@ -20,6 +20,14 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
20
20
|
|
|
21
21
|
@interface FBXCElementSnapshotWrapper (WebDriverAttributes) <FBElement>
|
|
22
22
|
|
|
23
|
+
/**
|
|
24
|
+
Fetches wdName attribute value for the given snapshot instance
|
|
25
|
+
|
|
26
|
+
@param snapshot snapshot instance
|
|
27
|
+
@return wdName attribute value or nil
|
|
28
|
+
*/
|
|
29
|
+
+ (nullable NSString *)wdNameWithSnapshot:(id<FBXCElementSnapshot>)snapshot;
|
|
30
|
+
|
|
23
31
|
@end
|
|
24
32
|
|
|
25
33
|
NS_ASSUME_NONNULL_END
|
|
@@ -100,18 +100,23 @@
|
|
|
100
100
|
value = [NSString stringWithFormat:@"%@", value];
|
|
101
101
|
}
|
|
102
102
|
return value;
|
|
103
|
-
|
|
103
|
+
}
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
+ (NSString *)wdNameWithSnapshot:(id<FBXCElementSnapshot>)snapshot
|
|
106
106
|
{
|
|
107
|
-
NSString *identifier =
|
|
107
|
+
NSString *identifier = snapshot.identifier;
|
|
108
108
|
if (nil != identifier && identifier.length != 0) {
|
|
109
109
|
return identifier;
|
|
110
110
|
}
|
|
111
|
-
NSString *label =
|
|
111
|
+
NSString *label = snapshot.label;
|
|
112
112
|
return FBTransferEmptyStringToNil(label);
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
- (NSString *)wdName
|
|
116
|
+
{
|
|
117
|
+
return [self.class wdNameWithSnapshot:self.snapshot];
|
|
118
|
+
}
|
|
119
|
+
|
|
115
120
|
- (NSString *)wdLabel
|
|
116
121
|
{
|
|
117
122
|
NSString *label = self.label;
|
|
@@ -122,7 +122,7 @@ static NSString *const OBJC_PROP_ATTRIBS_SEPARATOR = @",";
|
|
|
122
122
|
}
|
|
123
123
|
attributeNamesMapping = resultCache.copy;
|
|
124
124
|
});
|
|
125
|
-
return attributeNamesMapping
|
|
125
|
+
return attributeNamesMapping;
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
+ (NSString *)uidWithAccessibilityElement:(id<FBXCAccessibilityElement>)element
|
|
@@ -52,6 +52,10 @@
|
|
|
52
52
|
|
|
53
53
|
+ (instancetype)fb_snapshotBlockPredicateWithPredicate:(NSPredicate *)input
|
|
54
54
|
{
|
|
55
|
+
if ([NSStringFromClass(input.class) isEqualToString:@"NSBlockPredicate"]) {
|
|
56
|
+
return input;
|
|
57
|
+
}
|
|
58
|
+
|
|
55
59
|
NSPredicate *wdPredicate = [self.class fb_formatSearchPredicate:input];
|
|
56
60
|
return [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject,
|
|
57
61
|
NSDictionary<NSString *,id> * _Nullable bindings) {
|
|
Binary file
|