【问题标题】:Prevent accessing non-existant element from failing test防止访问不存在的元素使测试失败
【发布时间】:2017-07-18 04:22:13
【问题描述】:

在一个只包含 20 行的表格视图的应用程序中,所有这些都包含文本“单元格 X”,X 是行的索引,我有以下测试:

func testTwentyFirstRow()
{
    let cell = XCUIApplication().staticTexts["Cell 20"]
    let label = cell.label  
    XCTAssert(label == "Cell 20", "Label is not equal to Cell 20")
}

此测试在第二行失败并出现以下错误

No matches found for Find: Elements matching predicate '"Cell 20" IN identifiers' from input {(
    StaticText, 0x60800019b930, traits: 8589934656, label: 'Cell 0',
    ...
    StaticText, 0x60800019d740, traits: 8589934656, label: 'Cell 19'
)}

是否有任何方法可以防止它在那里失败,但让它在下一行失败,而不是在我断言标签值的地方失败?

【问题讨论】:

    标签: swift xctest xcode-ui-testing


    【解决方案1】:

    如果您访问 XCUIElement 的 exists 以外的属性,框架将尝试解析指向该元素的查询,然后检查它以查找该属性的值。

    如果您在检查任何其他内容或与之交互之前检查元素exists,您可以处理它尚不存在的情况。

    if cell.exists {
        let label = cell.label
        XCTAssertEqual(label, "text")
    } else {
        XCTFail("Cell did not exist")
    }
    

    此时您不必通过测试,您可以采取措施使单元格存在,使用循环继续滚动直到它存在,或者您喜欢的任何内容。

    【讨论】:

    • 但是由于 cell.existscell.label 在应用程序的不同状态下执行,因此当 cell.label 执行时,单元格可能不再存在。不过,我可能对这个表格视图示例的问题过于简单化了。我真正的问题是我的视频播放器在视频播放完毕后消失,这导致我的测试失败。
    • 这应该是一个近乎即时的检查,因为相同的快照将用于检查存在和标签。你能把视频拉长一点来稳定测试吗?或者,标签检查测试作为单元测试工作得很好,您可以在其中模拟未测试的实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2019-03-07
    相关资源
    最近更新 更多