如何为 UITableView 中的最后一个 UITableViewCell 创建 XCUIElement 查询?

How to create an XCUIElement query for the last UITableViewCell in a UITableView?

我正在创建一个 XCTestCase。对于其中一种测试方法,将其称为 func testConfirmLastCellContent() { ... },我想确认在 UITableViewCell 中存在一个值为 "98765"staticText 子元素(我将table 视图单元格的 textLabel.text 属性 中的文本值)。此单元格上方列出了 4 table 个视图单元格。每个单元格的 textLabel.textString 值为 "12345",除了第二个单元格,它与最后一个单元格具有相同的文本值:"98765".

每个单元格的 textLabel.text 属性 的 String 值,则如下所示:

这些 textLabel.text 值分别是 视图单元格中的视觉子元素。

如果我像这样创建一个简单的 XCUIElementQuery...

let staticTextForLastCell = XCUIApplication().staticTexts["98765"]

...并像这样断言其存在 true...

XCTAssert(staticTextForLastCell.exists == true)

...然后测试将 通过 ,但我怎么知道我得到了最后一个单元格?显然,我无法从该查询中得知,因为它可能是从第二个单元格中提取的。

到目前为止,我找不到 XCTest class/method 来专门获取最后一个 UITableViewCell 并查询其详细信息。

我的目标是获取最后一个单元格并确认其 textLabel.text 值符合我的预期。我该怎么做?

注意:我无法在任何 table 视图单元格上 add/subtract/change 文本、视觉等元素。

编辑:

我还应注意,UITableViewCell 是由正在测试的应用程序动态生成的。因此,我无法 tag 它们或为 textLabel 或单元格填充 accessibilityIdentifier 属性。

我的设置如下:

您或许应该为 XCUIElementQuery

添加一个扩展
extension XCUIElementQuery {
    var lastMatch : XCUIElement {return self.element(boundBy: self.count - 1)}
}

然后你可以这样断言你的单元格:

XCTAssertEqual(app.cells.lastMatch.staticTexts.element.label, 
               "98765", 
               "Unexpected text of the last cell")

这是有用的东西...

let app = XCUIApplication()
let cells = app.cells
let lastCell = cells.element(boundBy: cells.count - 1)
let textOfLastCell = lastCell.staticTexts["98765"]
XCTAssert(textOfLastCell.exists)

注意:Smart Monkey 的回答使用了扩展名,这可能是可取的。上面是一种更内联的方式。

编辑:我之前说过,如果不在查询 cells 之前查询 tables,我将无法让它工作。它 在没有 tables 查询的情况下工作

编辑:根据 Chris 的评论将 XCTAssert(textOfLastCell.exists == true) 更改为 XCTAssert(textOfLastCell.exists)。干净一点。