【问题标题】:Xcuitest - How can I wait until image finished to loadXcuitest - 我怎样才能等到图像完成加载
【发布时间】:2020-07-13 11:36:13
【问题描述】:

我正在使用相机胶卷/Google 照片/等中的图像/视频的应用上运行我的 UiTests。

所有图像/视频都在 CollectionView 中,每个资产都在特定单元格中。

当应用打开“素材屏幕”时,它同时包含 15 个资源,我正在尝试创建一个函数,等待所有图像完成加载。

我为什么需要它: 我有选择图像/视频的测试,有时 Xctest 可以选择第一个,因为并非所有资产都完成加载。

注意: 我没有任何迹象表明“所有资产都已完成加载”。

有什么建议吗?

【问题讨论】:

    标签: swift coded-ui-tests xcuitest


    【解决方案1】:

    XCTest框架中有expectation方法来测试异步工作。

    expectation

    使用此方法创建 XCTestExpectation 实例,这些实例可以在测试中的异步任务完成时实现。

    您可以创建一个用于使用存在预测的函数,如下所示:

    // create a function to wait for prediction
    func waitNotExistance(for element: XCUIElement, timeout: Double = 5) {
        let notExists = NSPredicate(format: "exists != 1")
        let elementShown = expectation(for: notExists, evaluatedWith: element)
        wait(for: [elementShown], timeout: timeout, enforceOrder: false)
    }
    

    假设您将accessibilityIdentifier "loading" 设置为初始值,并在完成后设置"loaded"。你可以等到它们不存在。

    用法

    // your loading cell
    let ladingElement = app.collectionViews.element(boundBy: 0).cells.matching(identifier: "loading").element
    
    // wait until timeout reached 
    waitNotExistance(for: ladingElement)
    
    // assert here what you expect..
    

    【讨论】:

      【解决方案2】:
      • 您应该在加载前后检查您的app.debugDescription。查找任何可以异步验证的内容。

      • 如有必要,将无障碍标识符添加到应用代码中,这些标识符在加载之前/之后是不同的。您还应该添加一些辅助功能标签,以帮助 VoiceOver 和 VoiceControl 用户与您的应用进行交互。

      • 您可以使用 SUITCase 进行屏幕截图测试和等待。 https://github.com/devexperts/suitcase/

      • 您可以添加一些 EarlGrey 2 断言。这个测试框架更灵活一点,自动等待异步操作。好处是您可以将它与现有的 XCTest 测试一起使用。

      • 最后,你可以sleep(5) :D

      【讨论】:

        【解决方案3】:

        第二个建议解决问题,

        我已向包含图像的单元格添加了可访问性标识符 1:图片还在加载时“selectFootageCellImageEmpty” 2.图片加载完成时“selectFootageCellImageLoaded” 现在我等到屏幕上没有“selectFootageCellImageEmpty”,例如:

                let endOfLoop = Date().addingTimeInterval(TimeInterval(10))
                while app.collectionViews.element(boundBy: 2).cells.matching(identifier: "selectFootageCellImageEmpty").element.exists {
                sleep(1)
                print("Waiting for all images to finish loading")
                if Date() > endOfLoop {
                    break
                }
            }
        
        • 我可以添加一个 XCTAssert 而不是“break”行,但我现在不需要它。

        【讨论】:

        • 最好使用timeout 而不是sleep。我对此添加了一个答案。
        猜你喜欢
        • 2011-12-14
        • 2016-05-19
        • 2014-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多