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 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 shouldReturnAfterFirstMatch:shouldReturnAfterFirstMatch]];
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
- NSMutableArray *elements = [NSMutableArray array];
70
- [self descendantsWithProperty:property value:value partial:partialSearch results:elements];
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 ensureWrapped:self.lastSnapshot].wdUID
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
- FBXCElementSnapshotWrapper *wrappedSnapshot = [FBXCElementSnapshotWrapper ensureWrapped:snapshot];
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 ensureWrapped:snapshot].fb_uid isEqualToString:uid];
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 [FBElementUtils uidWithAccessibilityElement:[self accessibilityElement]];
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
- [sortedIds addObject:(NSString *)[FBXCElementSnapshotWrapper ensureWrapped:snapshot].fb_uid];
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 ensureWrapped:self.lastSnapshot].fb_uid
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:(NSString *)[FBXCElementSnapshotWrapper ensureWrapped:snapshot].fb_uid];
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
- - (NSString *)wdName
105
+ + (NSString *)wdNameWithSnapshot:(id<FBXCElementSnapshot>)snapshot
106
106
  {
107
- NSString *identifier = self.identifier;
107
+ NSString *identifier = snapshot.identifier;
108
108
  if (nil != identifier && identifier.length != 0) {
109
109
  return identifier;
110
110
  }
111
- NSString *label = self.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.copy;
125
+ return attributeNamesMapping;
126
126
  }
127
127
 
128
128
  + (NSString *)uidWithAccessibilityElement:(id<FBXCAccessibilityElement>)element
@@ -93,6 +93,13 @@
93
93
  return self.snapshot.selected;
94
94
  }
95
95
 
96
+ #if !TARGET_OS_OSX
97
+ - (BOOL)hasFocus
98
+ {
99
+ return self.snapshot.hasFocus;
100
+ }
101
+ #endif
102
+
96
103
  - (id)forwardingTargetForSelector:(SEL)aSelector
97
104
  {
98
105
  static dispatch_once_t onceToken;
@@ -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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-webdriveragent",
3
- "version": "4.10.4",
3
+ "version": "4.10.6",
4
4
  "description": "Package bundling WebDriverAgent",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {