如何获取与标识符匹配的元素数,例如 XCUIQuery 返回的 "fooImage"?

How do I get the number of elements matching an identifier, say "fooImage" returned by an XCUIQuery?

假设我有一个 table,其中包含三个图像,其 accessiblityIdentifier 设置为 "fooImage"。

XCTAssertTrue(table["tableName"].images.count == 3) 可以,但这很糟糕——如果有人添加了另一种图像类型怎么办?我想要标识符 == "fooImage".

的所有图像的计数

XCUIApplication().images["fooImage"].count 是编译失败 Value of type 'XCUIElement' has no member 'count'

XCUIElementQuery 上使用下标会给你一个 XCUIElement,它没有 count 属性。你想像这样在 XCUIElementQuery 上使用 count

XCUIApplication().images.matching(identifier: "fooImage").count

为了允许 XCUIElement,它有一个私有 query getter。由于私有 API 仅在 UI 测试中使用(因此未嵌入到应用程序中),因此没有被拒绝的风险, 它仍然容易受到攻击内部变化,所以如果你知道这意味着什么,请使用。

可以使用以下扩展来添加所需的行为:

extension XCUIElement {
    @nonobjc var query: XCUIElementQuery? {
        final class QueryGetterHelper { // Used to allow compilation of the `responds(to:)` below
            @objc var query: XCUIElementQuery?
        }

        if !self.responds(to: #selector(getter: QueryGetterHelper.query)) {
            XCTFail("Internal interface changed: tests needs updating")
            return nil
        }
        return self.value(forKey: "query") as? XCUIElementQuery
    }

    @nonobjc var count: Int {
        return self.query?.count ?? 0
    }
}

如果内部接口发生变化(如果内部 query getter 被重命名),扩展将无法通过测试,防止测试在没有解释的情况下突然无法工作(此代码已经过测试当时最新的 Xcode,Xcode 10 beta 6)。

添加扩展后,问题 XCUIApplication().images["fooImage"].count 中的代码将编译并具有预期的行为。