在XCode中测试UI时是否有办法等待所有网络请求完成?
我有一个应用程序发送HTTP请求以从服务器获取一些数据,并且在UI测试中,我希望在继续之前等待检索此数据。目前我使用的是sleep(1)
,但这种做法看起来并不可靠。
答案 0 :(得分:7)
最好的办法是等待一些UI元素出现或消失。想一想:
框架就像一个用户。它并不关心什么代码在底层运行。唯一重要的是屏幕上可见的内容。
也就是说,您可以在UI测试中wait for a label titled "Go!" to appear进行操作。
let app = XCUIApplication()
let goLabel = self.app.staticTexts["Go!"]
XCTAssertFalse(goLabel.exists)
let exists = NSPredicate(format: "exists == true")
expectationForPredicate(exists, evaluatedWithObject: goLabel, handler: nil)
app.buttons["Ready, set..."].tap()
waitForExpectationsWithTimeout(5, handler: nil)
XCTAssert(goLabel.exists)
你也可以extract that into a helper method。如果你使用一些Swift编译器魔法,你甚至可以在调用方法的行上发生失败消息。
private fund waitForElementToAppear(element: XCUIElement, file: String = #file, line: UInt = #line) {
let existsPredicate = NSPredicate(format: "exists == true")
expectationForPredicate(existsPredicate, evaluatedWithObject: element, handler: nil)
waitForExpectationsWithTimeout(5) { (error) -> Void in
if (error != nil) {
let message = "Failed to find \(element) after 5 seconds."
self.recordFailureWithDescription(message, inFile: file, atLine: line, expected: true)
}
}
}
答案 1 :(得分:2)
您可以使用委托或完成块设置方法,并在测试用例中使用XCTestExpectation
,您可以在返回数据时fulfill
。