在 XCUITests 中,如何等待两个 ui 元素中的任何一个存在

Has*_*Ali 6 xcode swift xcode-ui-testing xcode9 xcuitest

看看 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
Run Code Online (Sandbox Code Playgroud)

但这在提供的期望中使用 AND 之类的。有没有办法在提供的期望中做 OR。

就像我在登录时有一个用例一样,在点击提交后,我想等待两个元素之一。第一个元素是“您已经在另一台设备上登录。如果继续,您另一台设备上的任何未保存数据将丢失?”。第二个元素是登录后的主屏幕。所以任何人都可以出现。目前我首先等待第一个元素,直到超时发生,然后等待第二个元素。但是我想在这里优化时间并在两个元素中的任何一个存在时继续前进==真。然后我将检查 element1 是否存在,然后点击 YES,然后等待主屏幕,否则只需断言 element2 的存在。

如果问题中有不清楚的地方,请发表评论。谢谢

lag*_*man 7

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
}
Run Code Online (Sandbox Code Playgroud)

那么你可以这样做:

let foundElement = waitForEitherElementToExist(elementA, elementB)
if foundElement == elementA {
    // e.g. if it's a button, tap it
} else {
    // element B was found
}
Run Code Online (Sandbox Code Playgroud)