无法在具有相同元素的 viewController 上方的模式上断言元素

Posted

技术标签:

【中文标题】无法在具有相同元素的 viewController 上方的模式上断言元素【英文标题】:Unable to assert an element on modal that's above viewController with the same element 【发布时间】:2019-10-25 13:36:49 【问题描述】:

有一些带有一些 HITTABLE 文本“exampleText”的 viewController。当您点击它时,会打开一个带有相同“exampleText”的模式(甚至是两个具有相同静态文本“exampleText”的单元格) 我的意图是通过 countHittableElements 计算那些“exampleTexts”

但问题是我的方法在模态和视图控制器上搜索元素(在该模态下) 因此,如果模态上有 2 个“exampleTexts”并尝试使用 countHittableElements(name:“exampleTexts”),我总是会得到一个额外的 1 个元素并且我的计数失败。

func countHittableElements(name: String) -> Int 
    return filterHittableElements(name: name).count


func getElements(name: String) -> XCUIElementQuery 
    let predicate = NSPredicate(format: "label CONTAINS[c] %@", name)
    return application.cells.staticTexts.containing(predicate)


func filterHittableElements(name: String) -> [XCUIElement] 
    let all = getElements(name: name).allElementsBoundByAccessibilityElement
    let onlyfilt = all.filter  $0.isHittable 
    return onlyfilt

有没有办法在视图控制器上方打开模式时忽略它?

【问题讨论】:

这是专门用于测试可击中的,还是只是为了可见,甚至加载? 可见或可点击 - 在此特定测试范围内无关紧要 从未尝试过单元测试,但我认为模态的 subViews 数组可以访问?然后您可以按标签过滤,然后按特定文本过滤并计算这些? 【参考方案1】:

如果您有权访问您正在测试的应用程序的代码,您可以尝试计算特定表中的这些元素,如下所示(树中的第一个表):

func getElements(name: String) -> XCUIElementQuery 
    let predicate = NSPredicate(format: "label CONTAINS[c] %@", name)
    return application.tables.element(boundBy: 0).cells.staticTexts.containing(predicate)

func getElements(name: String) -> XCUIElementQuery 
    let predicate = NSPredicate(format: "label CONTAINS[c] %@", name)
    return application.tables[<table identifier goes here>]cells.staticTexts.containing(predicate)

您可以通过在测试中的某个位置放置一个断点然后在 XCode 控制台中输入来检查 UI 树结构:

po print(XCUIApplication().debugDescription)

【讨论】:

以上是关于无法在具有相同元素的 viewController 上方的模式上断言元素的主要内容,如果未能解决你的问题,请参考以下文章

具有相同操作的所有 viewController 的通用导航栏

从具有相同 ViewController 类的相同情节提要中调用第二个视图

无法使用 mapKit 从 ViewController 将坐标发送到具有委托的另一个 viewController

对 2 个 Storyboard 使用相同的 ViewController 文件(以获得相同的视图)

如何选择具有相同css选择器的元素

Xcode 6 使用具有 4 个不同视图控制器的相同视图