在Xcode 7 UI测试中访问嵌套的UIElements

时间:2015-10-02 17:43:17

标签: ios xcode7 ui-testing xcode-ui-testing

我无法在我正在测试的应用的屏幕上找到XCUIElements。我意识到你可以通过以下方式访问按钮:

var app_table = 5;

但问题有时候,找不到组件。就像我在UITableView中的单元格中有一个Button的情况一样。我尝试使用XCUIElementQuery来查找按钮,但它不在那里。我尝试查找表或tableviews或集合视图,即使它们在视图控制器中,它们也不会在UI测试中找到。返回数组的计数将为零。

我最初尝试记录测试,但点击我尝试访问的元素不起作用。 Xcode将其检测为"其他元素"并且在尝试点击期间,播放应用程序不会前进。

是否有一种高级方式来访问UI层次结构中UIView高的组件以便级联下来?

4 个答案:

答案 0 :(得分:5)

理想情况下,您应在按钮上设置accessibilityIdentifier并通过该按钮进行搜索。 accessibilityIdentifier对于屏幕上的元素应该是唯一的。您可以在Interface Builder中的Identity Inspector中设置accessibilityIdentifier(命令选项-3)或直接在代码中设置app.buttons["SomeAccessibilityIdentifier"] 。一旦你有一个,查询看起来像:

{{1}}

答案 1 :(得分:5)

我当时不知道这个,但我所寻找的基本上是debugDescription:

当您点击要尝试调试的区域时设置断点。然后

po print(app.debugDescription)

在调试控制台中。然后,您将看到层次结构。

答案 2 :(得分:0)

Ryan Poolos回答对我来说是最好的答案,因为它解决了我使用嵌套UI元素的问题

  

我们必须通过删除堆栈中超级视图上的一些辅助功能标识符来解决它。不理想,但确实让它工作而不改变实际功能。 - Ryan Poolos

因此,考虑到这一点,我找到了带有问题元素的xib文件,选择了元素,选择了选项卡"显示身份检查器"在右侧面板上,取消选中“辅助功能”复选框。

right panel

然后我录制了导致该元素的元素:

[[[[[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

成功:)

答案 3 :(得分:-1)

根据我自己的经验,你能够通过accessibilityIdentifier找到一个元素(UIButton继承自UIview的UIView)取决于你如何将它添加到视图中。

我认为在您的情况下,您使用addSubView以编程方式将按钮添加到单元格。如果是这种情况,可能您将无法访问它。我遇到了同样的问题并且问了here但目前没有正确的解决方案,所以我的建议是尽量避免在addSubView添加观看次数...