我测试了一个像这样工作的集合视图:
func testDeleteItem() {
app.collectionViews.staticTexts["Item"].tap()
app.buttons["Delete"].tap()
XCTAssertEqual(app.collectionViews.cells.count, 2)
XCTAssertFalse(app.collectionViews.cells.staticTexts["Item"].exists)
}
点按后,会出现一个带删除按钮的新屏幕。点击按钮时,屏幕自动解除并重新加载集合视图。在UI中,一切都如预期的那样,但我得到两个断言都失败了。在第一个计数中它仍然是3,在第二个项目中它仍然存在。
答案 0 :(得分:10)
我找到了解决方案,但这是错误的API行为的解决方法。集合视图是缓存单元格,这可能就是为什么我有3个单元格,即使我已经删除了一个单元格。已删除的单元格位于屏幕外,因此您可以测试它是否为hittable
:
XCTAssertFalse(app.cells.staticTexts["Item"].hittable)
为了找到一个计数,我创建了扩展名:
extension XCUIElementQuery {
var countForHittables: UInt {
return UInt(allElementsBoundByIndex.filter { $0.hittable }.count)
}
}
我的测试看起来像这样:
func testDeleteItem() {
app.collectionViews.staticTexts["Item"].tap()
app.buttons["Delete"].tap()
XCTAssertEqual(app.collectionViews.cells.countForHittables, 2)
XCTAssertFalse(app.collectionViews.cells.staticTexts["Item"].hittable)
}
答案 1 :(得分:3)
我也遇到过这个问题,但就我而言,.cells查询没有正确评估。而不是.cells,使用
XCUIApplication().collectionViews.element.childrenMatchingType(.Cell).count
为我工作并返回正确的计数。
<强>更新强>:
我还发现滚动视图以便在计数之前所有单元格都会出列,从而解决了问题。似乎可访问性框架在它们已经出列之前找不到其他单元格(我想这是有道理的)。
XCUIApplication().collectionViews.element.swipeUp()
答案 2 :(得分:0)
当我寻找相同的答案时,我遇到了这个问题,但是在Objective-C中。对于像我这样的人,我采用@ Tomasz的方法来计算UI测试中的Collection View单元格:
-(NSInteger)countForHittables:(NSArray<XCUIElement*>*)collectionView{
__block int hittables = 0;
[collectionView enumerateObjectsUsingBlock:^(XCUIElement * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.hittable){
hittables++;
}
}];
return hittables;
}
致电:[self countForHittables:app.collectionViews.cells.allElementsBoundByIndex];
。
答案 3 :(得分:0)
我有同样的问题。即使由于等待API的响应而未填充集合, cells.count&gt; = 1 也始终为真。
我做了什么,基于Tomasz Bąk's answer我创建了一个扩展来等待集合的填充:
extension XCTestCase {
func waitForCollectionToBePopulated(_ element: XCUIElement, timeout: TimeInterval) {
let query = element.cells
let p = NSPredicate(format: "countForHittables >= 1")
let e = expectation(for: p, evaluatedWith: query, handler: nil)
wait(for: [e], timeout: timeout)
}
}
在来电网站上会看:
waitForCollectionToBePopulated(collection, timeout: {timeOut})
答案 4 :(得分:0)
我认为单元格查询返回当前视图层次结构中所有表的所有单元格。尝试这样做app.tables.firstMatch.cells.count
,它对我有用。