【问题标题】:Xcode 11: _XCTestCaseInterruptionException when using XCUIElement waitForExistenceXcode 11:使用 XCUIElement waitForExistence 时出现 _XCTestCaseInterruptionException
【发布时间】:2020-03-07 16:19:48
【问题描述】:

我目前正在使用标准 XCUIElement 函数 waitForExistence(timeout: TimeInterval) 来等待按钮出现。我总是将超时设置为大于 2.0 秒,但总是遇到同样的问题。

断言失败:无法获取匹配的快照:无法在主运行循环上执行工作,处理主线程忙 2.0 秒 - 建议客户端重试 *** 由于未捕获的异常“_XCTestCaseInterruptionException”而终止应用程序,原因:“中断测试”

这太令人沮丧了,因为这开始发生在 Xcode 11 及更高版本上。更糟糕的是,您无法捕获异常,因为 waitForExistence 方法设置为从不抛出异常。关于如何捕捉这个的任何想法?目标元素只是 XCUIApplication().buttons["id"],所以它应该很适合 go。当应用程序正在检索数据时,不应与主线程断开连接。

【问题讨论】:

  • 遗憾的是,添加睡眠计数器似乎有所帮助。我仍然会真正避免使用硬编码的睡眠。这个问题仍然悬而未决。
  • 我对 Travis CI 的 UI 测试有这样的问题。这似乎是一个性能问题。有更新吗?

标签: swift xcode xctest xcode11 xcuitest


【解决方案1】:

我在 UI 测试中使用了自定义等待,它始终有效(我为 XCTestCase 创建了一个扩展):

public class var defaultTimeOut: TimeInterval { return 5 }

public func wait(forFulfillmentOf predicate: NSPredicate,
                 for element: XCUIElement,
                 withFailingMessage message: String = "Failed to fulfill predicate %@ for %@ within %.2f seconds.",
                 timeout: TimeInterval = XCTestCase.defaultTimeOut,
                 file: StaticString = #file,
                 line: UInt = #line) {

    expectation(for: predicate, evaluatedWith: element, handler: nil)

    waitForExpectations(timeout: timeout) { (error) -> Void in
        guard error != nil else {
            return
        }
        let failingMessage = String(format: message, arguments: [predicate, element, timeout])
        self.recordFailure(withDescription: failingMessage, inFile: String(describing: file), atLine: Int(clamping: line), expected: true)
    }
}

那么你就可以在 UI 测试中实际使用这个方法了:

public func wait(forExistanceOf element: XCUIElement, timeout: TimeInterval = XCTestCase.defaultTimeOut, file: StaticString = #file, line: UInt = #line) {
    let existancePredicate = NSPredicate(format: "exists == true")
    wait(forFulfillmentOf: existancePredicate, for: element, withFailingMessage: "Failed to find %2$@ within %3$.2f seconds. Predicate was: %1$@.", timeout: timeout, file: file, line: line)
}

希望这会有所帮助!

【讨论】:

  • 不过,这并不能回答 OP 的问题......您是否遇到了与他们第一次实施此操作之前相同的问题?
  • 这个例子不完整。如果您认为这样可以解决问题,请添加缺少的函数作为期望、waitForExpectations 和 recordFailure。
猜你喜欢
  • 2016-12-28
  • 2019-10-19
  • 1970-01-01
  • 2018-06-13
  • 2021-11-06
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多