UI 测试中集合视图的单元格计数错误

Wrong cells count for collection view in UI Tests

我有一个像这样工作的集合视图测试:

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,在第二项中它仍然存在。

我找到了解决方案,但这是针对错误 API 行为的解决方法。集合视图正在缓存单元格,这可能就是我有 3 个单元格的原因,即使我已经删除了一个单元格。删除的单元格在屏幕外,所以你可以测试它是否是 hittable:

XCTAssertFalse(app.cells.staticTexts["Item"].hittable)

为了找到一个计数,我创建了扩展:

extension XCUIElementQuery {
    var countForHittables: UInt {
        return UInt(allElementsBoundByIndex.filter { [=11=].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)
}

我也遇到过这个问题,但就我而言,.cells 查询未正确评估。使用

而不是 .cells
XCUIApplication().collectionViews.element.childrenMatchingType(.Cell).count

为我工作并返回了正确的计数。


更新:

我还发现滚动视图以便在获取计数之前所有单元格都出队可以解决此问题。似乎可访问性框架在其他单元格出列之前找不到它们(我想这是有道理的)。

XCUIApplication().collectionViews.element.swipeUp()

我在寻找相同答案时 运行 进入了这个问题,但在 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];.

我遇到了同样的问题。即使因为等待 API 的响应而未填充集合,cells.count >= 1 始终为真。

我做了什么,基于我创建了一个扩展来等待集合被填充:

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})

我认为单元格查询 returns 当前在视图层次结构中的所有表中的所有单元格。尝试这样做 app.tables.firstMatch.cells.count,它对我有用。