Xcode 9+Swift+XCUI Test表格分页后单元格计数异常求助
问题根源分析
你遇到的这个问题其实是XCUI框架的一个「隐性特性」:当你调用table.cells.count时,XCUI会自动尝试遍历表格中的所有元素,为了做到这一点,它会自动滚动到表格底部去发现所有单元格——刚好触发了你设置的分页逻辑(滚动到最后一个单元格时加载下一页),导致计数结果变成了加载后的总数量,而不是你预期的初始50个。
解决方案
这里给你三个不同场景下的解决思路,你可以根据测试需求选择:
1. 只统计当前可见/已加载的单元格(无需修改App代码)
如果你的测试只需要验证初始加载的50个单元格,不需要触发分页,可以通过筛选出表格可见区域内的单元格来计数:
let app = XCUIApplication() let targetTable = app.tables.firstMatch // 获取表格的可见区域范围 let tableVisibleFrame = targetTable.frame // 筛选出与可见区域有交集的已加载单元格 let loadedCells = targetTable.cells.allElementsBoundByIndex.filter { cell in cell.frame.intersects(tableVisibleFrame) } // 验证初始加载数量 XCTAssertEqual(loadedCells.count, 50, "初始加载的单元格数量不符合预期")
2. 测试环境下禁用自动分页(推荐,更稳定)
如果你的测试场景不需要验证分页逻辑,只是要确认初始加载的正确性,可以在App代码中添加测试环境开关,临时关闭滚动触发分页的逻辑:
首先在App的表格滚动代理方法中添加判断:
func scrollViewDidScroll(_ scrollView: UIScrollView) { // 只有非测试环境才执行分页逻辑 #if !TESTING let offsetY = scrollView.contentOffset.y let contentHeight = scrollView.contentSize.height let frameHeight = scrollView.frame.size.height // 原来的分页触发逻辑 if offsetY > contentHeight - frameHeight - 10 { loadNextPage() } #endif }
然后在XCUI测试的setUp方法中添加测试启动参数:
override func setUp() { super.setUp() continueAfterFailure = false let app = XCUIApplication() // 传递测试环境标识 app.launchArguments.append("TESTING") app.launch() }
这样测试运行时,分页逻辑不会被触发,直接调用targetTable.cells.count就能得到准确的初始50个单元格数量。
3. 逐个确认单元格存在(避免自动滚动)
如果你不想修改App代码,也可以通过逐个检查单元格存在性的方式计数,同时限制到50个就停止,避免触发滚动:
let app = XCUIApplication() let targetTable = app.tables.firstMatch // 先等待最后一个初始单元格加载完成 let lastInitialCell = targetTable.cells.element(boundBy: 49) XCTAssertTrue(lastInitialCell.waitForExistence(timeout: 5), "初始单元格未全部加载完成") // 逐个计数,到50就停止 var cellCount = 0 while cellCount < 50 && targetTable.cells.element(boundBy: cellCount).exists { cellCount += 1 } XCTAssertEqual(cellCount, 50, "初始加载的单元格数量不正确")
内容的提问来源于stack exchange,提问作者reutsey
相关产品推荐
相关产品推荐

