【发布时间】:2016-08-04 18:15:42
【问题描述】:
我致力于与服务器通信的应用程序的测试自动化。该应用程序有 7 个预定义的字符串。根据服务器返回的信息,这不是确定性的并且取决于外部因素,应用程序将七个预定义字符串中的一到三个作为可点击的静态文本放置在表格视图中。用户可以选择要点击哪些字符串。 为了自动化这个测试,我需要一种异步方式来确定测试代码中 7 个预定义字符串中的哪个实际出现在屏幕上。 我不能使用 element.exists 因为静态文本出现需要时间,我不想调用 sleep() 因为这会减慢测试速度。 所以我尝试使用 XCTestExpectation 但遇到了问题。当 waitForExpectationsWithTimeout() 超时时,XCTest 总是失败。 为了说明问题,我写了一个简单的测试程序:
func testExample() {
let element = XCUIApplication().staticTexts["Email"]
let gotText = haveElement(element)
print("Got text: \(gotText)")
}
func haveElement(element: XCUIElement) -> Bool{
var elementExists = true
let expectation = self.expectationForPredicate(
NSPredicate(format: "exists == true"),
evaluatedWithObject: element,
handler: nil)
self.waitForExpectationsWithTimeout(NSTimeInterval(5)) { error in
elementExists = error == nil
}
return elementExists
}
测试总是失败
Assertion Failure: Asynchronous wait failed: Exceeded timeout of 5 seconds, with unfulfilled expectations: "Expect predicate `exists == 1` for object "Email" StaticText".
我也试过了
func haveElement(element: XCUIElement) -> Bool {
var elementExists = false
let actionExpectation = self.expectationWithDescription("Expected element")
dispatch_async(dispatch_get_main_queue()) {
while true {
if element.exists {
actionExpectation.fulfill()
elementExists = true
break
} else {
sleep(1)
}
}
}
self.waitForExpectationsWithTimeout(NSTimeInterval(5)) { error in
elementExists = error == nil
}
return elementExists
}
在这种情况下,测试总是失败
Stall on main thread.
错误。 所以问题是我如何检查是否存在异步 UI 元素,该元素可能会在指定时间内出现也可能不会出现,而不会在超时时测试失败?
谢谢。
【问题讨论】:
标签: asynchronous xctest xcode-ui-testing