5

假设我有一个包含三个图像的表格,这些图像accessiblityIdentifier设置为“fooImage”。

XCTAssertTrue(table["tableName"].images.count == 3)会起作用,但这很糟糕——如果有人添加了另一种图像类型怎么办?我想要标识符==“fooImage”的所有图像的计数。

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

4

2 回答 2

10

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

XCUIApplication().images.matching(identifier: "fooImage").count
于 2018-03-01T15:33:51.240 回答
1

为了允许这个XCUIElement,它有一个私人query吸气剂。由于私有 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
    }
}

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

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

于 2018-08-30T19:26:09.237 回答