You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS UITest本地通过但Bitrise失败:CollectionView滚动计数广告Cell异常

解决Bitrise环境下UITest滚动CollectionView提前终止的问题

你的问题核心是:UITest在本地和Fastlane环境能正常滚动到CollectionView底部并统计到2个广告Cell,但在Bitrise上测试提前终止,仅统计到1个,导致断言失败。这大概率是CI环境的模拟器性能限制、滚动后未等待Cell加载完成,或者滚动幅度不足导致的。

以下是针对性的解决方案:

1. 滚动后等待Cell加载完成

Bitrise的模拟器资源通常比本地机器紧张,滚动后Cell可能需要更长时间渲染,直接判断IndexPath会出现误判。在每次swipeUp后,添加等待逻辑,确保可见Cell已更新:

修改测试代码,在swipeUp后加入等待:

func testAdverts() {
    var previousMaxIndexPath: IndexPath = IndexPath(row: 0, section: 0)
    var advertIdentifiers = Set<String>()
    var noNewIndexSwipeCount = 0

    while true {
        app.swipeUp()
        
        // 等待可见Cell更新,超时设为3秒(可根据实际调整)
        let cellUpdateExpectation = XCTNSPredicateExpectation(predicate: NSPredicate(format: "count > 0"), object: app.cells)
        _ = XCTWaiter.wait(for: [cellUpdateExpectation], timeout: 3)

        if let currentMax = currentMaxIndexPath, currentMax > previousMaxIndexPath {
            previousMaxIndexPath = currentMax
            advertIdentifiers.formUnion(visibleAdvertIdentifiers)
            noNewIndexSwipeCount = 0
        } else if noNewIndexSwipeCount >= 3 { // 增加允许的无新Index次数
            break
        } else {
            noNewIndexSwipeCount += 1
        }
    }

    XCTAssertEqual(advertIdentifiers.count, 2, "Expected 2 adverts, but found \(advertIdentifiers.count).")
}

2. 替换swipeUp为更精准的滚动操作

swipeUp的幅度和速度在CI环境中可能不稳定,建议直接针对CollectionView进行滚动,或者滚动到当前可见的最后一个Cell下方:

比如,找到当前可见的最后一个Cell,然后滚动它:

// 在循环内替换swipeUp为:
if let lastCell = app.cells.allElementsBoundByIndex.last {
    lastCell.swipeUp()
} else {
    app.swipeUp() //  fallback
}

这种方式滚动的幅度更可控,能确保每次滚动都触发新Cell加载。

3. 优化终止条件的容错性

当前的noNewIndexSwipeCount >= 2可能在CI环境中过于严格,因为偶尔一次滚动可能因加载慢未刷新IndexPath。可以把阈值提高到3或4,同时增加对广告数量的提前判断:

while advertIdentifiers.count < 2 { // 提前终止:如果已经找到2个广告,直接结束循环
    app.swipeUp()
    // ... 等待和IndexPath判断逻辑
}

这样即使没滚动到底部,只要收集到足够的广告Cell,就能提前通过测试,避免不必要的滚动。

4. 验证CI环境的模拟器配置

检查Bitrise的测试步骤中,模拟器的型号、iOS版本是否和本地一致。比如,低版本iOS的模拟器滚动行为可能有差异;同时确保模拟器没有被设置为"Headless"模式(虽然Bitrise默认是有界面,但部分配置可能影响)。

内容的提问来源于stack exchange,提问作者Shawn Frank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:03:21