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

时间:2018-10-12 11:51:10

标签: ios swift xctest xcuitest

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

4 个答案:

答案 0 :(得分:1)

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

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
}

答案 1 :(得分:0)

更简洁的版本:

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

        Thread.sleep(forTimeInterval: 1)
    }

    return false
}

答案 2 :(得分:0)

也请检查以下内容:https://pspdfkit.com/blog/2016/running-ui-tests-with-ludicrous-speed/

您基本上可以将其用作等待任何东西,这将给您Bool作为回报(多种条件等)

答案 3 :(得分:0)

使用可变参数函数:

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)