appium-webdriveragent 13.2.4 → 14.0.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 CHANGED
@@ -1,3 +1,19 @@
1
+ ## [14.0.0](https://github.com/appium/WebDriverAgent/compare/v13.3.0...v14.0.0) (2026-06-09)
2
+
3
+ ### ⚠ BREAKING CHANGES
4
+
5
+ * bump the deployment target to 15
6
+
7
+ ### Features
8
+
9
+ * bump the deployment target to 15 ([#1152](https://github.com/appium/WebDriverAgent/issues/1152)) ([74498f7](https://github.com/appium/WebDriverAgent/commit/74498f79c9f00678f2bc37b9afb50f70e30d0f88))
10
+
11
+ ## [13.3.0](https://github.com/appium/WebDriverAgent/compare/v13.2.4...v13.3.0) (2026-06-09)
12
+
13
+ ### Features
14
+
15
+ * Expose native isAccessibilityElement ([#1146](https://github.com/appium/WebDriverAgent/issues/1146)) ([e615621](https://github.com/appium/WebDriverAgent/commit/e6156212e6fba6af98a69a400f5fa18b67f1e3e3))
16
+
1
17
  ## [13.2.4](https://github.com/appium/WebDriverAgent/compare/v13.2.3...v13.2.4) (2026-06-08)
2
18
 
3
19
  ### Bug Fixes
@@ -52,7 +52,6 @@
52
52
  641EE5D92240C5CA00173FCB /* XCUIElement+FBPickerWheel.m in Sources */ = {isa = PBXBuildFile; fileRef = 7136A4781E8918E60024FC3D /* XCUIElement+FBPickerWheel.m */; };
53
53
  641EE5DA2240C5CA00173FCB /* XCUIApplicationProcessDelay.m in Sources */ = {isa = PBXBuildFile; fileRef = 6385F4A5220A40760095BBDB /* XCUIApplicationProcessDelay.m */; };
54
54
  641EE5DB2240C5CA00173FCB /* FBXPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 711084431DA3AA7500F913D6 /* FBXPath.m */; };
55
- 71B2E0042733FB970074B004 /* FBXPathExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 71B2E0022733FB970074B002 /* FBXPathExtensions.m */; };
56
55
  641EE5DC2240C5CA00173FCB /* XCUIApplication+FBAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 719CD8FB2126C88B00C7D0C2 /* XCUIApplication+FBAlert.m */; };
57
56
  641EE5DE2240C5CA00173FCB /* XCUIApplication+FBTouchAction.m in Sources */ = {isa = PBXBuildFile; fileRef = 71BD20721F86116100B36EC2 /* XCUIApplication+FBTouchAction.m */; };
58
57
  641EE5DF2240C5CA00173FCB /* FBWebServer.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9AB78D1CAEDF0C008C271F /* FBWebServer.m */; };
@@ -317,7 +316,6 @@
317
316
  64E3502F2AC0B6FE005F3ACB /* NSDictionary+FBUtf8SafeDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 716F0D9F2A16CA1000CDD977 /* NSDictionary+FBUtf8SafeDictionary.h */; };
318
317
  711084441DA3AA7500F913D6 /* FBXPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 711084421DA3AA7500F913D6 /* FBXPath.h */; settings = {ATTRIBUTES = (Public, ); }; };
319
318
  711084451DA3AA7500F913D6 /* FBXPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 711084431DA3AA7500F913D6 /* FBXPath.m */; };
320
- 71B2E0062733FB970074B006 /* FBXPathExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 71B2E0022733FB970074B002 /* FBXPathExtensions.m */; };
321
319
  7119097C2152580600BA3C7E /* XCUIScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = 7119097B2152580600BA3C7E /* XCUIScreen.h */; settings = {ATTRIBUTES = (Public, ); }; };
322
320
  7119E1EC1E891F8600D0B125 /* FBPickerWheelSelectTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7119E1EB1E891F8600D0B125 /* FBPickerWheelSelectTests.m */; };
323
321
  711CD03425ED1106001C01D2 /* XCUIScreenDataSource-Protocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 711CD03325ED1106001C01D2 /* XCUIScreenDataSource-Protocol.h */; };
@@ -469,6 +467,8 @@
469
467
  71B155DC230711E900646AFB /* FBCommandStatus.m in Sources */ = {isa = PBXBuildFile; fileRef = 71B155DB230711E900646AFB /* FBCommandStatus.m */; };
470
468
  71B155DF23080CA600646AFB /* FBProtocolHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 71B155DD23080CA600646AFB /* FBProtocolHelpers.h */; };
471
469
  71B155E123080CA600646AFB /* FBProtocolHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 71B155DE23080CA600646AFB /* FBProtocolHelpers.m */; };
470
+ 71B2E0042733FB970074B004 /* FBXPathExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 71B2E0022733FB970074B002 /* FBXPathExtensions.m */; };
471
+ 71B2E0062733FB970074B006 /* FBXPathExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 71B2E0022733FB970074B002 /* FBXPathExtensions.m */; };
472
472
  71B49EC71ED1A58100D51AD6 /* XCUIElement+FBUID.h in Headers */ = {isa = PBXBuildFile; fileRef = 71B49EC51ED1A58100D51AD6 /* XCUIElement+FBUID.h */; };
473
473
  71B49EC81ED1A58100D51AD6 /* XCUIElement+FBUID.m in Sources */ = {isa = PBXBuildFile; fileRef = 71B49EC61ED1A58100D51AD6 /* XCUIElement+FBUID.m */; };
474
474
  71BB58DE2B9631B700CB9BFE /* FBVideoRecordingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 71BB58DD2B9631B700CB9BFE /* FBVideoRecordingTests.m */; };
@@ -535,6 +535,7 @@
535
535
  71F5BE50252F14EB00EE9EBA /* FBExceptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 71F5BE4D252F14EB00EE9EBA /* FBExceptions.h */; };
536
536
  71F5BE51252F14EB00EE9EBA /* FBExceptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 71F5BE4E252F14EB00EE9EBA /* FBExceptions.m */; };
537
537
  71F5BE52252F14EB00EE9EBA /* FBExceptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 71F5BE4E252F14EB00EE9EBA /* FBExceptions.m */; };
538
+ A1B2C3D4E5F600000000001B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A1B2C3D4E5F600000000001A /* Assets.xcassets */; };
538
539
  AABBCCDDEEFF001122334457 /* SceneDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = AABBCCDDEEFF001122334456 /* SceneDelegate.m */; };
539
540
  AD35D06C1CF1C35500870A75 /* WebDriverAgentLib.framework in Copy frameworks */ = {isa = PBXBuildFile; fileRef = EE158A991CBD452B00A3E3F0 /* WebDriverAgentLib.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
540
541
  AD6C26941CF2379700F8B5FF /* FBAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = AD6C26921CF2379700F8B5FF /* FBAlert.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -832,7 +833,6 @@
832
833
  F59CD6D52EF16E5E00F91287 /* XCUIElement+FBCustomActions.m in Sources */ = {isa = PBXBuildFile; fileRef = F59CD6D32EF16E5E00F91287 /* XCUIElement+FBCustomActions.m */; };
833
834
  F59CD6D62EF16E5E00F91287 /* XCUIElement+FBCustomActions.h in Headers */ = {isa = PBXBuildFile; fileRef = F59CD6D22EF16E5E00F91287 /* XCUIElement+FBCustomActions.h */; };
834
835
  F59CD6D72EF16E5E00F91287 /* XCUIElement+FBCustomActions.m in Sources */ = {isa = PBXBuildFile; fileRef = F59CD6D32EF16E5E00F91287 /* XCUIElement+FBCustomActions.m */; };
835
- A1B2C3D4E5F600000000001B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A1B2C3D4E5F600000000001A /* Assets.xcassets */; };
836
836
  /* End PBXBuildFile section */
837
837
 
838
838
  /* Begin PBXContainerItemProxy section */
@@ -982,8 +982,6 @@
982
982
  64B26509228CE4FF002A5025 /* FBTVNavigationTracker-Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "FBTVNavigationTracker-Private.h"; sourceTree = "<group>"; };
983
983
  711084421DA3AA7500F913D6 /* FBXPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBXPath.h; sourceTree = "<group>"; };
984
984
  711084431DA3AA7500F913D6 /* FBXPath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBXPath.m; sourceTree = "<group>"; };
985
- 71B2E0012733FB970074B001 /* FBXPathExtensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBXPathExtensions.h; sourceTree = "<group>"; };
986
- 71B2E0022733FB970074B002 /* FBXPathExtensions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBXPathExtensions.m; sourceTree = "<group>"; };
987
985
  7119097B2152580600BA3C7E /* XCUIScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XCUIScreen.h; sourceTree = "<group>"; };
988
986
  7119E1EB1E891F8600D0B125 /* FBPickerWheelSelectTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBPickerWheelSelectTests.m; sourceTree = "<group>"; };
989
987
  711CD03325ED1106001C01D2 /* XCUIScreenDataSource-Protocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "XCUIScreenDataSource-Protocol.h"; sourceTree = "<group>"; };
@@ -1090,6 +1088,8 @@
1090
1088
  71B155DB230711E900646AFB /* FBCommandStatus.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBCommandStatus.m; sourceTree = "<group>"; };
1091
1089
  71B155DD23080CA600646AFB /* FBProtocolHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBProtocolHelpers.h; sourceTree = "<group>"; };
1092
1090
  71B155DE23080CA600646AFB /* FBProtocolHelpers.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBProtocolHelpers.m; sourceTree = "<group>"; };
1091
+ 71B2E0012733FB970074B001 /* FBXPathExtensions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBXPathExtensions.h; sourceTree = "<group>"; };
1092
+ 71B2E0022733FB970074B002 /* FBXPathExtensions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBXPathExtensions.m; sourceTree = "<group>"; };
1093
1093
  71B49EC51ED1A58100D51AD6 /* XCUIElement+FBUID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "XCUIElement+FBUID.h"; sourceTree = "<group>"; };
1094
1094
  71B49EC61ED1A58100D51AD6 /* XCUIElement+FBUID.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "XCUIElement+FBUID.m"; sourceTree = "<group>"; };
1095
1095
  71BB58DD2B9631B700CB9BFE /* FBVideoRecordingTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBVideoRecordingTests.m; sourceTree = "<group>"; };
@@ -1125,6 +1125,7 @@
1125
1125
  71F5BE33252E5B2200EE9EBA /* FBElementSwipingTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBElementSwipingTests.m; sourceTree = "<group>"; };
1126
1126
  71F5BE4D252F14EB00EE9EBA /* FBExceptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FBExceptions.h; sourceTree = "<group>"; };
1127
1127
  71F5BE4E252F14EB00EE9EBA /* FBExceptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FBExceptions.m; sourceTree = "<group>"; };
1128
+ A1B2C3D4E5F600000000001A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = WebDriverAgentRunner/Assets.xcassets; sourceTree = SOURCE_ROOT; };
1128
1129
  AABBCCDDEEFF001122334455 /* SceneDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SceneDelegate.h; sourceTree = "<group>"; };
1129
1130
  AABBCCDDEEFF001122334456 /* SceneDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SceneDelegate.m; sourceTree = "<group>"; };
1130
1131
  AD42DD2A1CF121E600806E5D /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = "<group>"; };
@@ -1379,7 +1380,6 @@
1379
1380
  EE9AB7921CAEDF0C008C271F /* FBRuntimeUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBRuntimeUtils.m; sourceTree = "<group>"; };
1380
1381
  EE9AB7FC1CAEE048008C271F /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = WebDriverAgentRunner/Info.plist; sourceTree = SOURCE_ROOT; };
1381
1382
  EE9AB7FD1CAEE048008C271F /* UITestingUITests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = UITestingUITests.m; path = WebDriverAgentRunner/UITestingUITests.m; sourceTree = SOURCE_ROOT; };
1382
- A1B2C3D4E5F600000000001A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = WebDriverAgentRunner/Assets.xcassets; sourceTree = SOURCE_ROOT; };
1383
1383
  EE9AB8031CAEE182008C271F /* build.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = build.sh; sourceTree = "<group>"; };
1384
1384
  EE9B75D41CF7956C00275851 /* IntegrationApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IntegrationApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
1385
1385
  EE9B75EC1CF7956C00275851 /* IntegrationTests_1.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IntegrationTests_1.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -2012,11 +2012,11 @@
2012
2012
  714D88CA2733FB970074A925 /* FBXMLGenerationOptions.h */,
2013
2013
  714D88CB2733FB970074A925 /* FBXMLGenerationOptions.m */,
2014
2014
  712A0C861DA3E55D007D02E5 /* FBXPath-Private.h */,
2015
- 711084421DA3AA7500F913D6 /* FBXPath.h */,
2016
- 711084431DA3AA7500F913D6 /* FBXPath.m */,
2017
- 71B2E0012733FB970074B001 /* FBXPathExtensions.h */,
2018
- 71B2E0022733FB970074B002 /* FBXPathExtensions.m */,
2019
- EE6B64FB1D0F86EF00E85F5D /* XCTestPrivateSymbols.h */,
2015
+ 711084421DA3AA7500F913D6 /* FBXPath.h */,
2016
+ 711084431DA3AA7500F913D6 /* FBXPath.m */,
2017
+ 71B2E0012733FB970074B001 /* FBXPathExtensions.h */,
2018
+ 71B2E0022733FB970074B002 /* FBXPathExtensions.m */,
2019
+ EE6B64FB1D0F86EF00E85F5D /* XCTestPrivateSymbols.h */,
2020
2020
  EE6B64FC1D0F86EF00E85F5D /* XCTestPrivateSymbols.m */,
2021
2021
  633E904A220DEE7F007CADF9 /* XCUIApplicationProcessDelay.h */,
2022
2022
  6385F4A5220A40760095BBDB /* XCUIApplicationProcessDelay.m */,
@@ -3976,13 +3976,13 @@
3976
3976
  "$(SDKROOT)/usr/include/libxml2",
3977
3977
  "$(SRCROOT)/Modules",
3978
3978
  );
3979
- IPHONEOS_DEPLOYMENT_TARGET = 13.0;
3979
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
3980
3980
  MTL_ENABLE_DEBUG_INFO = YES;
3981
3981
  ONLY_ACTIVE_ARCH = YES;
3982
3982
  SDKROOT = iphoneos;
3983
3983
  STRING_CATALOG_GENERATE_SYMBOLS = YES;
3984
3984
  TARGETED_DEVICE_FAMILY = "1,2";
3985
- TVOS_DEPLOYMENT_TARGET = 13.0;
3985
+ TVOS_DEPLOYMENT_TARGET = 15.0;
3986
3986
  VALIDATE_WORKSPACE = NO;
3987
3987
  };
3988
3988
  name = Debug;
@@ -4039,12 +4039,12 @@
4039
4039
  "$(SDKROOT)/usr/include/libxml2",
4040
4040
  "$(SRCROOT)/Modules",
4041
4041
  );
4042
- IPHONEOS_DEPLOYMENT_TARGET = 13.0;
4042
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
4043
4043
  MTL_ENABLE_DEBUG_INFO = NO;
4044
4044
  SDKROOT = iphoneos;
4045
4045
  STRING_CATALOG_GENERATE_SYMBOLS = YES;
4046
4046
  TARGETED_DEVICE_FAMILY = "1,2";
4047
- TVOS_DEPLOYMENT_TARGET = 13.0;
4047
+ TVOS_DEPLOYMENT_TARGET = 15.0;
4048
4048
  VALIDATE_PRODUCT = YES;
4049
4049
  VALIDATE_WORKSPACE = NO;
4050
4050
  };
@@ -44,6 +44,7 @@ static NSString* const FBExclusionAttributeFrame = @"frame";
44
44
  static NSString* const FBExclusionAttributeEnabled = @"enabled";
45
45
  static NSString* const FBExclusionAttributeVisible = @"visible";
46
46
  static NSString* const FBExclusionAttributeAccessible = @"accessible";
47
+ static NSString* const FBExclusionAttributeNativeAccessibilityElement = @"nativeAccessibilityElement";
47
48
  static NSString* const FBExclusionAttributeFocused = @"focused";
48
49
  static NSString* const FBExclusionAttributePlaceholderValue = @"placeholderValue";
49
50
  static NSString* const FBExclusionAttributeNativeFrame = @"nativeFrame";
@@ -51,6 +52,13 @@ static NSString* const FBExclusionAttributeTraits = @"traits";
51
52
  static NSString* const FBExclusionAttributeMinValue = @"minValue";
52
53
  static NSString* const FBExclusionAttributeMaxValue = @"maxValue";
53
54
 
55
+ static NSString *FBJsonPrefixedAttributeKey(NSString *key)
56
+ {
57
+ return [NSString stringWithFormat:@"is%@%@",
58
+ [[key substringToIndex:1] uppercaseString],
59
+ [key substringFromIndex:1]];
60
+ }
61
+
54
62
  _Nullable id extractIssueProperty(id issue, NSString *propertyName) {
55
63
  SEL selector = NSSelectorFromString(propertyName);
56
64
  NSMethodSignature *methodSignature = [issue methodSignatureForSelector:selector];
@@ -223,7 +231,7 @@ NSDictionary<NSString *, NSString *> *customExclusionAttributesMap(void) {
223
231
  if ([nonPrefixedKeys containsObject:key]) {
224
232
  info[key] = value;
225
233
  } else {
226
- info[[NSString stringWithFormat:@"is%@", [key capitalizedString]]] = value;
234
+ info[FBJsonPrefixedAttributeKey(key)] = value;
227
235
  }
228
236
  }
229
237
  }
@@ -268,6 +276,9 @@ NSDictionary<NSString *, NSString *> *customExclusionAttributesMap(void) {
268
276
  },
269
277
  FBExclusionAttributeAccessible: ^{
270
278
  return [@([wrappedSnapshot isWDAccessible]) stringValue];
279
+ },
280
+ FBExclusionAttributeNativeAccessibilityElement: ^{
281
+ return [@([wrappedSnapshot isWDNativeAccessibilityElement]) stringValue];
271
282
  },
272
283
  FBExclusionAttributeFocused: ^{
273
284
  return [@([wrappedSnapshot isWDFocused]) stringValue];
@@ -202,6 +202,11 @@
202
202
  return self.hasFocus;
203
203
  }
204
204
 
205
+ - (BOOL)isWDNativeAccessibilityElement
206
+ {
207
+ return self.fb_isAccessibilityElement;
208
+ }
209
+
205
210
  - (BOOL)isWDAccessible
206
211
  {
207
212
  XCUIElementType elementType = self.elementType;
@@ -15,11 +15,11 @@
15
15
  <key>CFBundlePackageType</key>
16
16
  <string>FMWK</string>
17
17
  <key>CFBundleShortVersionString</key>
18
- <string>13.2.4</string>
18
+ <string>14.0.0</string>
19
19
  <key>CFBundleSignature</key>
20
20
  <string>????</string>
21
21
  <key>CFBundleVersion</key>
22
- <string>13.2.4</string>
22
+ <string>14.0.0</string>
23
23
  <key>NSPrincipalClass</key>
24
24
  <string/>
25
25
  </dict>
@@ -55,6 +55,9 @@ NS_ASSUME_NONNULL_BEGIN
55
55
  /*! Whether element is accessible */
56
56
  @property (nonatomic, readonly, getter = isWDAccessible) BOOL wdAccessible;
57
57
 
58
+ /*! The raw, native `isAccessibilityElement` value reported by the accessibility framework, without WebDriverAgent's custom computation applied by `wdAccessible` */
59
+ @property (nonatomic, readonly, getter = isWDNativeAccessibilityElement) BOOL wdNativeAccessibilityElement;
60
+
58
61
  /*! Whether element is an accessibility container (contains children of any depth that are accessible) */
59
62
  @property (nonatomic, readonly, getter = isWDAccessibilityContainer) BOOL wdAccessibilityContainer;
60
63
 
@@ -366,6 +366,24 @@ typedef NS_ENUM(NSInteger, FBConfigurationKeyboardPreference) {
366
366
  + (void)setIncludeNativeFrameInPageSource:(BOOL)enabled;
367
367
  + (BOOL)includeNativeFrameInPageSource;
368
368
 
369
+ /**
370
+ * Whether to include the `nativeAccessibilityElement` attribute in the XML page source.
371
+ *
372
+ * When enabled, the XML representation will contain the raw, native
373
+ * `isAccessibilityElement` value as reported by the accessibility framework,
374
+ * without the custom computation that WebDriverAgent applies to the
375
+ * `accessible` attribute (cell/text field special cases and parent absorption).
376
+ *
377
+ * This is useful for consumers that need to reason about the unmodified
378
+ * accessibility flag alongside the computed `accessible` value.
379
+ *
380
+ * The value is disabled by default to keep the default page source stable.
381
+ *
382
+ * @param enabled Either YES or NO
383
+ */
384
+ + (void)setIncludeNativeAccessibilityElementInPageSource:(BOOL)enabled;
385
+ + (BOOL)includeNativeAccessibilityElementInPageSource;
386
+
369
387
  /**
370
388
  * Whether to include `minValue`/`maxValue` attributes in the page source.
371
389
  * These attributes are retrieved from native element snapshots and represent
@@ -61,6 +61,7 @@ static UIInterfaceOrientation FBScreenshotOrientation;
61
61
  #endif
62
62
  static BOOL FBShouldIncludeHittableInPageSource = NO;
63
63
  static BOOL FBShouldIncludeNativeFrameInPageSource = NO;
64
+ static BOOL FBShouldIncludeNativeAccessibilityElementInPageSource = NO;
64
65
  static BOOL FBShouldIncludeMinMaxValueInPageSource = NO;
65
66
  static BOOL FBShouldIncludeCustomActionsInPageSource = NO;
66
67
  static BOOL FBShouldEnforceCustomSnapshots = NO;
@@ -665,6 +666,16 @@ static BOOL FBShouldEnforceCustomSnapshots = NO;
665
666
  return FBShouldIncludeNativeFrameInPageSource;
666
667
  }
667
668
 
669
+ + (void)setIncludeNativeAccessibilityElementInPageSource:(BOOL)enabled
670
+ {
671
+ FBShouldIncludeNativeAccessibilityElementInPageSource = enabled;
672
+ }
673
+
674
+ + (BOOL)includeNativeAccessibilityElementInPageSource
675
+ {
676
+ return FBShouldIncludeNativeAccessibilityElementInPageSource;
677
+ }
678
+
668
679
  + (void)setIncludeMinMaxValueInPageSource:(BOOL)enabled
669
680
  {
670
681
  FBShouldIncludeMinMaxValueInPageSource = enabled;
@@ -41,6 +41,7 @@ extern NSString* const FB_SETTING_LIMIT_XPATH_CONTEXT_SCOPE;
41
41
  extern NSString* const FB_SETTING_AUTO_CLICK_ALERT_SELECTOR;
42
42
  extern NSString *const FB_SETTING_INCLUDE_HITTABLE_IN_PAGE_SOURCE;
43
43
  extern NSString *const FB_SETTING_INCLUDE_NATIVE_FRAME_IN_PAGE_SOURCE;
44
+ extern NSString *const FB_SETTING_INCLUDE_NATIVE_ACCESSIBILITY_ELEMENT_IN_PAGE_SOURCE;
44
45
  extern NSString *const FB_SETTING_INCLUDE_MIN_MAX_VALUE_IN_PAGE_SOURCE;
45
46
  extern NSString *const FB_SETTING_INCLUDE_CUSTOM_ACTIONS_IN_PAGE_SOURCE;
46
47
  extern NSString *const FB_SETTING_ENFORCE_CUSTOM_SNAPSHOTS;
@@ -37,6 +37,7 @@ NSString* const FB_SETTING_LIMIT_XPATH_CONTEXT_SCOPE = @"limitXPathContextScope"
37
37
  NSString* const FB_SETTING_AUTO_CLICK_ALERT_SELECTOR = @"autoClickAlertSelector";
38
38
  NSString* const FB_SETTING_INCLUDE_HITTABLE_IN_PAGE_SOURCE = @"includeHittableInPageSource";
39
39
  NSString* const FB_SETTING_INCLUDE_NATIVE_FRAME_IN_PAGE_SOURCE = @"includeNativeFrameInPageSource";
40
+ NSString* const FB_SETTING_INCLUDE_NATIVE_ACCESSIBILITY_ELEMENT_IN_PAGE_SOURCE = @"includeNativeAccessibilityElementInPageSource";
40
41
  NSString* const FB_SETTING_INCLUDE_MIN_MAX_VALUE_IN_PAGE_SOURCE = @"includeMinMaxValueInPageSource";
41
42
  NSString* const FB_SETTING_INCLUDE_CUSTOM_ACTIONS_IN_PAGE_SOURCE = @"includeCustomActionsInPageSource";
42
43
  NSString* const FB_SETTING_ENFORCE_CUSTOM_SNAPSHOTS = @"enforceCustomSnapshots";
@@ -162,6 +162,10 @@ static NSSet<NSString *> *FBNilClearableSettingKeys(void)
162
162
  [FBConfiguration setIncludeNativeFrameInPageSource:[value boolValue]];
163
163
  return nil;
164
164
  };
165
+ map[FB_SETTING_INCLUDE_NATIVE_ACCESSIBILITY_ELEMENT_IN_PAGE_SOURCE] = ^FBCommandStatus *(FBSession *session, id value) {
166
+ [FBConfiguration setIncludeNativeAccessibilityElementInPageSource:[value boolValue]];
167
+ return nil;
168
+ };
165
169
  map[FB_SETTING_INCLUDE_MIN_MAX_VALUE_IN_PAGE_SOURCE] = ^FBCommandStatus *(FBSession *session, id value) {
166
170
  [FBConfiguration setIncludeMinMaxValueInPageSource:[value boolValue]];
167
171
  return nil;
@@ -280,6 +284,9 @@ static NSSet<NSString *> *FBNilClearableSettingKeys(void)
280
284
  map[FB_SETTING_INCLUDE_NATIVE_FRAME_IN_PAGE_SOURCE] = ^id(FBSession *session) {
281
285
  return @([FBConfiguration includeNativeFrameInPageSource]);
282
286
  };
287
+ map[FB_SETTING_INCLUDE_NATIVE_ACCESSIBILITY_ELEMENT_IN_PAGE_SOURCE] = ^id(FBSession *session) {
288
+ return @([FBConfiguration includeNativeAccessibilityElementInPageSource]);
289
+ };
283
290
  map[FB_SETTING_INCLUDE_MIN_MAX_VALUE_IN_PAGE_SOURCE] = ^id(FBSession *session) {
284
291
  return @([FBConfiguration includeMinMaxValueInPageSource]);
285
292
  };
@@ -120,6 +120,10 @@
120
120
 
121
121
  @end
122
122
 
123
+ @interface FBNativeAccessibilityElementAttribute : FBElementAttribute
124
+
125
+ @end
126
+
123
127
  @interface FBTraitsAttribute : FBElementAttribute
124
128
 
125
129
  @end
@@ -409,6 +413,10 @@ static NSString *const topNodeIndexPath = @"top";
409
413
  // Include nativeFrame only when requested
410
414
  [includedAttributes removeObject:FBNativeFrameAttribute.class];
411
415
  }
416
+ if (!FBConfiguration.includeNativeAccessibilityElementInPageSource) {
417
+ // Include the raw native accessibility flag only when requested
418
+ [includedAttributes removeObject:FBNativeAccessibilityElementAttribute.class];
419
+ }
412
420
  if (!FBConfiguration.includeMinMaxValueInPageSource) {
413
421
  // minValue/maxValue are retrieved from private APIs and may be slow on deep trees
414
422
  [includedAttributes removeObject:FBMinValueAttribute.class];
@@ -686,6 +694,7 @@ static NSString *const FBAbstractMethodInvocationException = @"AbstractMethodInv
686
694
  FBEnabledAttribute.class,
687
695
  FBVisibleAttribute.class,
688
696
  FBAccessibleAttribute.class,
697
+ FBNativeAccessibilityElementAttribute.class,
689
698
  #if TARGET_OS_TV
690
699
  FBFocusedAttribute.class,
691
700
  #endif
@@ -954,6 +963,19 @@ static NSString *const FBAbstractMethodInvocationException = @"AbstractMethodInv
954
963
  }
955
964
  @end
956
965
 
966
+ @implementation FBNativeAccessibilityElementAttribute
967
+
968
+ + (NSString *)name
969
+ {
970
+ return @"nativeAccessibilityElement";
971
+ }
972
+
973
+ + (NSString *)valueForElement:(id<FBElement>)element
974
+ {
975
+ return FBBoolToString(element.wdNativeAccessibilityElement);
976
+ }
977
+ @end
978
+
957
979
  @implementation FBTraitsAttribute
958
980
 
959
981
  + (NSString *)name
@@ -41,6 +41,15 @@
41
41
  XCTAssertFalse(buttonElement.isWDAccessibilityContainer);
42
42
  }
43
43
 
44
+ - (void)testNativeAccessibilityElementAttribute
45
+ {
46
+ // wdNativeAccessibilityElement must expose the raw, native isAccessibilityElement flag
47
+ // without WebDriverAgent's custom computation applied by wdAccessible
48
+ XCUIElement *buttonElement = self.testedApplication.buttons[@"Button"];
49
+ XCTAssertTrue(buttonElement.exists);
50
+ XCTAssertEqual(buttonElement.wdNativeAccessibilityElement, buttonElement.fb_isAccessibilityElement);
51
+ }
52
+
44
53
  - (void)testContainerAccessibilityAttributes
45
54
  {
46
55
  // "not_accessible" isn't accessibility element, but contains accessibility elements, so it is accessibility container
@@ -31,6 +31,7 @@
31
31
  @property (nonatomic, readwrite) NSUInteger wdIndex;
32
32
  @property (nonatomic, readwrite, getter=isWDVisible) BOOL wdVisible;
33
33
  @property (nonatomic, readwrite, getter=isWDAccessible) BOOL wdAccessible;
34
+ @property (nonatomic, readwrite, getter=isWDNativeAccessibilityElement) BOOL wdNativeAccessibilityElement;
34
35
  @property (nonatomic, readwrite, getter = isWDFocused) BOOL wdFocused;
35
36
  @property (nonatomic, readwrite, getter = isWDHittable) BOOL wdHittable;
36
37
  @property (nonatomic, copy, readwrite, nullable) NSString *wdPlaceholderValue;
@@ -28,6 +28,7 @@
28
28
  self.wdCustomActions = nil;
29
29
  self.wdVisible = YES;
30
30
  self.wdAccessible = YES;
31
+ self.wdNativeAccessibilityElement = YES;
31
32
  self.wdEnabled = YES;
32
33
  self.wdSelected = YES;
33
34
  self.wdFocused = YES;
@@ -92,8 +92,8 @@
92
92
  NSString *resultXml = [self xmlStringWithElement:(id<FBXCElementSnapshot>)element
93
93
  xpathQuery:[NSString stringWithFormat:@"//%@[@*]", element.wdType]
94
94
  excludingAttributes:@[@"visible"]];
95
- NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" value=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\" hittable=\"%@\" traits=\"%@\" nativeFrame=\"%@\" customActions=\"%@\" private_indexPath=\"top\"/>\n",
96
- element.wdType, element.wdType, @"йоло&lt;&gt;&amp;&quot;", element.wdName, @"a&#10;b", FBBoolToString(element.wdEnabled), FBBoolToString(element.wdVisible), FBBoolToString(element.wdAccessible), element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"], element.wdIndex, FBBoolToString(element.wdHittable), element.wdTraits, NSStringFromCGRect(element.wdNativeFrame), element.wdCustomActions];
95
+ NSString *expectedXml = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<%@ type=\"%@\" value=\"%@\" name=\"%@\" label=\"%@\" enabled=\"%@\" visible=\"%@\" accessible=\"%@\" nativeAccessibilityElement=\"%@\" x=\"%@\" y=\"%@\" width=\"%@\" height=\"%@\" index=\"%lu\" hittable=\"%@\" traits=\"%@\" nativeFrame=\"%@\" customActions=\"%@\" private_indexPath=\"top\"/>\n",
96
+ element.wdType, element.wdType, @"йоло&lt;&gt;&amp;&quot;", element.wdName, @"a&#10;b", FBBoolToString(element.wdEnabled), FBBoolToString(element.wdVisible), FBBoolToString(element.wdAccessible), FBBoolToString(element.wdNativeAccessibilityElement), element.wdRect[@"x"], element.wdRect[@"y"], element.wdRect[@"width"], element.wdRect[@"height"], element.wdIndex, FBBoolToString(element.wdHittable), element.wdTraits, NSStringFromCGRect(element.wdNativeFrame), element.wdCustomActions];
97
97
  XCTAssertEqualObjects(expectedXml, resultXml);
98
98
  }
99
99
 
@@ -29,6 +29,7 @@
29
29
  @property (nonatomic, readwrite) NSUInteger wdIndex;
30
30
  @property (nonatomic, readwrite, getter=isWDVisible) BOOL wdVisible;
31
31
  @property (nonatomic, readwrite, getter=isWDAccessible) BOOL wdAccessible;
32
+ @property (nonatomic, readwrite, getter=isWDNativeAccessibilityElement) BOOL wdNativeAccessibilityElement;
32
33
  @property (nonatomic, readwrite, getter=isWDFocused) BOOL wdFocused;
33
34
  @property (nonatomic, readwrite, getter = isWDHittable) BOOL wdHittable;
34
35
  @property (copy, nonnull) NSArray *children;
@@ -24,6 +24,7 @@
24
24
  self.wdValue = @"magicValue";
25
25
  self.wdVisible = YES;
26
26
  self.wdAccessible = YES;
27
+ self.wdNativeAccessibilityElement = YES;
27
28
  self.wdEnabled = YES;
28
29
  self.wdSelected = YES;
29
30
  self.wdHittable = YES;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-webdriveragent",
3
- "version": "13.2.4",
3
+ "version": "14.0.0",
4
4
  "description": "Package bundling WebDriverAgent",
5
5
  "main": "./build/lib/index.js",
6
6
  "types": "./build/lib/index.d.ts",