代码之家  ›  专栏  ›  技术社区  ›  damjandd

UI测试UITableView单元格计数

  •  3
  • damjandd  · 技术社区  · 7 年前

    我试图验证在UI测试中,表视图中是否已填充了一定数量的单元格。这是我的代码:

    XCUIApplication().tables.element.swipeUp()
    let count = XCUIApplication().tables.element.children(matching: .cell).count
    XCTAssert(count > 0)
    

    断言失败,因为 count 始终为0,即使向上滑动滚动显然已成功填充的表视图。我也尝试过:

    XCTAssert(app.tables.cells.count > 0)
    

    同样的结果。我甚至在一个屏幕上创建了一个带有3个静态单元格的表视图的空项目,以消除UI测试中任何其他可能的干扰,它仍然始终返回0。我正在使用Xcode 9在iOS 11上进行测试。

    2 回复  |  直到 7 年前
        1
  •  12
  •   Chase Holland    7 年前

    单元格并不总是注册为单元格,这取决于您配置可访问性的方式。再次检查可访问性是否确实在中看到单元格 Xcode menu -> Open Developer Tool -> Accessibility Inspector .

    这很可能是可访问性所看到的 staticTexts 而不是 cells ,这取决于布局代码--在这种情况下,您应该断言

    XCTAssert(app.tables.staticTexts.count > 0)
    

    如果需要单元格,请在中按如下方式配置单元格 tableView:cellForItemAtIndexPath :

    cell.isAccessibilityElement = true
    cell.accessibilityLabel = cell.titleLabel.text // (for example)
    cell.accessibilityIdentifier = "MyCellId" // (or whatever you want XCUITest to identify it as)
    

    这将单元格标记为根可访问项,而不是单元格的每个子视图都是离散元素。

        2
  •  0
  •   Ramis    5 年前
    XCUIApplication().tables.children(matching: .cell).count
    

    从表视图中删除所有行。使用Xcode 11.1编写,并使用SwiftUI进行测试。

    func deleteAllCellsFromTable() {
        let app = XCUIApplication()
        let tablesQuery = app.tables
    
        app.navigationBars["Navigation Bar Title"].buttons["Edit"].tap()
    
        while app.tables.children(matching: .cell).count > 0 {
            let deleteButton = tablesQuery.children(matching: .cell).element(boundBy: 0).buttons["Delete "]
            deleteButton.tap()
    
            let deleteButton2 = tablesQuery.children(matching: .cell).element(boundBy: 0).buttons["trailing0"]
            deleteButton2.tap()
        }
    }