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)
}
假设您设置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..
我 运行 我的应用程序 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)
}
假设您设置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..