2017-07-18 30 views
1

在仅包含具有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' 
)} 

第二行是否有任何阻止它失败存在,但有它失败的下一行,而不是在那里我主张的价值标签?

回答

0

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

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

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

您没有失败,在这一点上的测试,你可以采取行动,以使小区中存在使用循环一直滚动,直到它确实存在,或任何你喜欢的。

+0

但是由于'cell.exists'和'cell.label'是在应用程序的不同状态下执行的,所以有可能在cell.label执行时单元不再存在。尽管如此,我可能会过分简化我的问题。我真正的问题是,我有一台视频播放器在视频播放完毕后消失,这使我的测试失败。 –

+0

它应该是一个近乎即时的检查,因为将使用相同的快照来检查存在和标签。你能否延长视频以稳定测试?或者,标签检查测试可以很好地作为单元测试,在那里你可以模拟未经测试的实体。 – Oletha