Xcuitest - 我怎样才能等到图像完成加载

Xcuitest - How can I wait until image finished to load

我 运行 我的应用程序 UiTests 使用 images/videos 来自相机 roll/Google photos/Etc..

所有 images/videos 都在 CollectionView 中,每个资产都在一个特定的单元格中。

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

我为什么需要它: 我有测试 select images/videos 有时 Xctest 可以 select 第一个,因为并非所有资产都完成加载。

注意: 我没有任何指示告诉我“所有资产已完成加载”。

有什么建议吗?

  • 您应该在加载前后检查您的 app.debugDescription。找到您可以异步验证的任何内容。

  • 如有必要,将可访问性标识符添加到应用程序代码中,这是不同的 before/after 加载。您还应该添加一些辅助功能标签,以帮助 VoiceOver 和 VoiceControl 用户与您的应用进行交互。

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

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

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

第二个建议解决问题,

我已将辅助功能标识符添加到包含图像的单元格 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 而不是“中断”行,但我现在不需要它。

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

expectation

Use this method to create XCTestExpectation instances that can be fulfilled when asynchronous tasks in your tests complete.

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

// 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)
}

假设您设置accessibilityIdentifierloading”为初始值,完成后设置为“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..