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

Posted

技术标签:

【中文标题】在 XCUITests 中,如何等待多个 ui 元素的存在?【英文标题】:In XCUITests, how to wait for existence of several ui elements? 【发布时间】:2018-10-12 11:51:09 【问题描述】:

在 XCode 中进行 UITests 时等待多个 XCUIElements 存在的最佳方法是什么?

【问题讨论】:

【参考方案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

【讨论】:

【参考方案2】:

稍微简洁一点的版本:

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

【讨论】:

【参考方案3】:

使用可变参数函数:

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)

【讨论】:

以上是关于在 XCUITests 中,如何等待多个 ui 元素的存在?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式启动 XCUITests?

XCUITests - 通过命令行传递环境变量

Firebase 测试实验室是不是支持 iOS XCUITests 附件?

如何通过 .ipa 在 Xcode for iOS 中运行自动化 XCUITests

运行特定的 XCUITests 集

MFC:如何从主线程使用 MsgWaitForMultipleObjects() 来等待多个线程完成使用 SendMessage()?