看看XCTWaiter()。wait(...)我相信我们可以使用这段代码等待多个期望成为现实
let notHittablePredicate = NSPredicate(format: "hittable == false")
let myExpectation = XCTNSPredicateExpectation(predicate: notHittablePredicate, object: element)
let result = XCTWaiter().wait(for: [myExpectation], timeout: timeout)
//for takes array of expectations
但这在所提供的期望中使用了AND。有没有办法在提供的期望中做OR。
就像我在登录时有一个用例,在点击提交后,我想等待两个元素中的一个。第一个元素是“您已经登录到另一台设备。如果您继续在其他设备上保存任何未保存的数据,将会丢失?”。第二个元素是登录后的主屏幕。所以任何人都可以出现。目前我首先等待第一个元素,直到超时,然后是第二个元素。但我希望在这里优化时间,并在两个元素中的任何一个存在时继续前进== true。然后我将检查element1是否存在然后点击YES然后等待主屏幕,否则只断言element2的存在。
如果问题不明确,请发表评论。谢谢
受http://masilotti.com/ui-testing-tdd/的启发,你不必依赖XCTWaiter
。您可以简单地运行循环并测试其中一个是否存在。
/// Waits for either of the two elements to exist (i.e. for scenarios where you might have
/// conditional UI logic and aren't sure which will show)
///
/// - Parameters:
/// - elementA: The first element to check for
/// - elementB: The second, or fallback, element to check for
/// - Returns: the element that existed
@discardableResult
func waitForEitherElementToExist(_ elementA: XCUIElement, _ elementB: XCUIElement) -> XCUIElement? {
let startTime = NSDate.timeIntervalSinceReferenceDate
while (!elementA.exists && !elementB.exists) { // while neither element exists
if (NSDate.timeIntervalSinceReferenceDate - startTime > 5.0) {
XCTFail("Timed out waiting for either element to exist.")
break
}
sleep(1)
}
if elementA.exists { return elementA }
if elementB.exists { return elementB }
return nil
}
然后你可以这样做:
let foundElement = waitForEitherElementToExist(elementA, elementB)
if foundElement == elementA {
// e.g. if it's a button, tap it
} else {
// element B was found
}