XCUITests中,如何等待多个ui元素的存在?

In XCUITests, how to wait for existence of several ui elements?

在 XCode 中执行 UITest 时等待多个 XCUIElement 存在的最佳方法是什么?

我发现此代码有效。我们 运行 一个超时持续时间的循环,在迭代之间等待 1 秒。在每一步中,我们都会检查所有元素是否存在,return 如果存在,则为真,否则继续。

func waitForExistenceOfAll(elements: [XCUIElement], for timeout: TimeInterval) -> Bool {
        guard elements.count > 0 else {
            return true
        }
        let startTime = NSDate.timeIntervalSinceReferenceDate
        while (NSDate.timeIntervalSinceReferenceDate - startTime <= timeout) {
            var allExist = true
            for element in elements {
                if !element.exists {
                    allExist = false
                    break
                }
            }
            if allExist {
                return true
            }
            sleep(1)
        }
        return false
}

稍微简洁一点的版本:

func waitForExistenceOfAll(elements: [XCUIElement], for timeout: TimeInterval) -> Bool {
    for _ in 0 ... Int(timeout) {
        if elements.filter({ [=10=].exists == false }).isEmpty {
            return true
        }

        Thread.sleep(forTimeInterval: 1)
    }

    return false
}

使用可变函数:

public func exists(_ elements: XCUIElement..., timeout: TimeInterval = 5.0) -> Bool {
    for element in elements {
        if !element.waitForExistence(timeout: timeout) {
            return false
        }
    }
    return true
}

用法:

exists(el1, el2, el3)