访问 Xcode 中嵌套的 UI 元素 7 UI 测试
Accessing nested UIElements in Xcode 7 UI Testing
我无法在我正在测试的应用程序的屏幕上定位 XCUI元素。我知道您可以通过以下方式访问按钮:
app.buttons[].elementBoundByIndex(0)
但有时会出现找不到组件的问题。就像我在 UITableView 的单元格中有一个 Button 的情况一样。我尝试创建一个 XCUIElementQuery 来查找按钮,但它不存在。我尝试查找表或表视图或集合视图,即使它们在视图控制器中,但在 UI 测试中找不到它们。返回数组的计数将为零。
我最初尝试记录测试,但单击我尝试访问的元素不起作用。 Xcode 将其检测为 "Other Element" 并且在此期间尝试点击时,播放应用程序不会前进。
是否有高级方法来访问组件,例如 UIView 在 UI 层次结构中的高层以向下级联?
理想情况下,您应该在按钮上设置 accessibilityIdentifier
并通过它进行搜索。 accessibilityIdentifier
对于屏幕上的元素应该是唯一的。您可以在 Interface Builder(command-option-3)或直接在代码中的身份检查器中设置 accessibilityIdentifier
。一旦你有一个,查询看起来像:
app.buttons["SomeAccessibilityIdentifier"]
当时不知道这个,我找的基本上是debugDescription:
当您到达要调试的区域时设置一个断点。那么
po print(app.debugDescription)
在调试控制台中。然后您将看到层次结构。
根据我自己的经验,您能否通过 accessibilityIdentifier
找到一个元素(在您的情况下是一个 UIView,因为 UIButton 继承自 UIview)取决于您将其添加到视图的方式。
我假设在您的情况下,您使用 addSubView
以编程方式将按钮添加到单元格。如果是这种情况,您可能无法访问它。我遇到了同样的问题并提出了问题 here 但目前没有合适的解决方案,所以我的建议是尽量避免在 addSubView
时添加视图...
Ryan Poolos 答案对我来说是最好的答案,因为它解决了我的嵌套 UI 元素问题
We had to solve it by removing a few accessibility identifiers on superviews in the stack. Not ideal but did get it working without changing actual functionality. – Ryan Poolos
因此,考虑到这一点,我找到了包含相关元素的 xib 文件,选择了该元素,选择了右侧面板上的选项卡 "Show the Identity Inspector" 并取消选中了“辅助功能”复选框。
然后我对元素进行了记录,结果是:
[[[[[XCUIApplication alloc] init].scrollViews.tables childrenMatchingType:XCUIElementTypeOther] elementBoundByIndex:index] childrenMatchingType:XCUIElementTypeButton].element;
注意 XCUIElementTypeOther 在查询中的表现。启用可访问性标识符时情况并非如此,因为我会得到:
[[[[[XCUIApplication alloc] init].scrollViews.tables.otherElements containingType:XCUIElementTypeStaticText identifier:@"username"] childrenMatchingType:XCUIElementTypeButton].element tap];
显然我不知道用户名,因为它总是会改变,这是一个主要问题。但是在删除可访问性标识符之后,
containingType:XCUIElementTypeStaticText identifier:@"username"
改为
childrenMatchingType:XCUIElementTypeOther] elementBoundByIndex:index
成功:)
我无法在我正在测试的应用程序的屏幕上定位 XCUI元素。我知道您可以通过以下方式访问按钮:
app.buttons[].elementBoundByIndex(0)
但有时会出现找不到组件的问题。就像我在 UITableView 的单元格中有一个 Button 的情况一样。我尝试创建一个 XCUIElementQuery 来查找按钮,但它不存在。我尝试查找表或表视图或集合视图,即使它们在视图控制器中,但在 UI 测试中找不到它们。返回数组的计数将为零。
我最初尝试记录测试,但单击我尝试访问的元素不起作用。 Xcode 将其检测为 "Other Element" 并且在此期间尝试点击时,播放应用程序不会前进。
是否有高级方法来访问组件,例如 UIView 在 UI 层次结构中的高层以向下级联?
理想情况下,您应该在按钮上设置 accessibilityIdentifier
并通过它进行搜索。 accessibilityIdentifier
对于屏幕上的元素应该是唯一的。您可以在 Interface Builder(command-option-3)或直接在代码中的身份检查器中设置 accessibilityIdentifier
。一旦你有一个,查询看起来像:
app.buttons["SomeAccessibilityIdentifier"]
当时不知道这个,我找的基本上是debugDescription:
当您到达要调试的区域时设置一个断点。那么
po print(app.debugDescription)
在调试控制台中。然后您将看到层次结构。
根据我自己的经验,您能否通过 accessibilityIdentifier
找到一个元素(在您的情况下是一个 UIView,因为 UIButton 继承自 UIview)取决于您将其添加到视图的方式。
我假设在您的情况下,您使用 addSubView
以编程方式将按钮添加到单元格。如果是这种情况,您可能无法访问它。我遇到了同样的问题并提出了问题 here 但目前没有合适的解决方案,所以我的建议是尽量避免在 addSubView
时添加视图...
Ryan Poolos 答案对我来说是最好的答案,因为它解决了我的嵌套 UI 元素问题
We had to solve it by removing a few accessibility identifiers on superviews in the stack. Not ideal but did get it working without changing actual functionality. – Ryan Poolos
因此,考虑到这一点,我找到了包含相关元素的 xib 文件,选择了该元素,选择了右侧面板上的选项卡 "Show the Identity Inspector" 并取消选中了“辅助功能”复选框。
然后我对元素进行了记录,结果是:
[[[[[XCUIApplication alloc] init].scrollViews.tables childrenMatchingType:XCUIElementTypeOther] elementBoundByIndex:index] childrenMatchingType:XCUIElementTypeButton].element;
注意 XCUIElementTypeOther 在查询中的表现。启用可访问性标识符时情况并非如此,因为我会得到:
[[[[[XCUIApplication alloc] init].scrollViews.tables.otherElements containingType:XCUIElementTypeStaticText identifier:@"username"] childrenMatchingType:XCUIElementTypeButton].element tap];
显然我不知道用户名,因为它总是会改变,这是一个主要问题。但是在删除可访问性标识符之后,
containingType:XCUIElementTypeStaticText identifier:@"username"
改为
childrenMatchingType:XCUIElementTypeOther] elementBoundByIndex:index
成功:)