等待所有HTTP请求在XCode UI测试中完成?

时间:2016-03-31 02:21:42

标签: ios xcode swift xcode-ui-testing ui-testing

在XCode中测试UI时是否有办法等待所有网络请求完成?

我有一个应用程序发送HTTP请求以从服务器获取一些数据,并且在UI测试中,我希望在继续之前等待检索此数据。目前我使用的是sleep(1),但这种做法看起来并不可靠。

2 个答案:

答案 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