在UI测试中,错误的单元格计入集合视图

时间:2015-11-12 19:36:03

标签: ios xcode swift ui-testing xcode-ui-testing

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

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

5 个答案:

答案 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,它对我有用。