Swift UI测试 - 等待元素出现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift UI测试 - 等待元素出现相关的知识,希望对你有一定的参考价值。

我希望测试暂停并等待元素出现在屏幕上然后再继续。

我没有看到为此创建期望并等待使用的好方法

public func waitForExpectationsWithTimeout(timeout: NSTimeInterval, handler: XCWaitCompletionHandler?)

创造我一直在使用的期望的方法一直是

public func expectationForPredicate(predicate: NSPredicate, evaluatedWithObject object: AnyObject, handler: XCPredicateExpectationHandler?) -> XCTestExpectation

但这需要一个已经存在的元素,而我想让测试等待一个尚不存在的元素。

有谁知道最好的方法吗?

答案

expectationForPredicate(predicate: evaluatedWithObject: handler:)中,您不提供实际对象,而是查询在视图层次结构中查找它。因此,例如,这是一个有效的测试:

let predicate = NSPredicate(format: "exists == 1")
let query = XCUIApplication().buttons["Button"]
expectationForPredicate(predicate, evaluatedWithObject: query, handler: nil)

waitForExpectationsWithTimeout(3, handler: nil)

查看由标题生成的UI Testing Cheat Sheetdocumentation(目前没有官方文档),全部由Joe Masilotti提供。

另一答案

你可以在Swift 3中使用它

func wait(element: XCUIElement, duration: TimeInterval) {
  let predicate = NSPredicate(format: "exists == true")
  let _ = expectation(for: predicate, evaluatedWith: element, handler: nil)

  // We use a buffer here to avoid flakiness with Timer on CI
  waitForExpectations(timeout: duration + 0.5)
}

在Xcode 9,ios 11中,您可以使用新的API waitForExistence

另一答案

它不需要已有的元素。您只需要定义以下谓词:

let exists = NSPredicate(format: "exists = 1")

然后在你的期望中使用这个谓词。然后当然等待你的期望。

另一答案

对于Xcode 8.3及更高版本,您可以使用新类等待期望 - XCTWaiter,示例测试如下所示:

func testExample() {
  let element = // ...
  let predicate = NSPredicate(format: "exists == true")
  let expectation = XCTNSPredicateExpectation(predicate: predicate, object: element)

  let result = XCTWaiter().wait(for: [expectation], timeout: 1)
  XCTAssertEqual(.completed, result)
}

Read the documentation了解更多信息。

另一答案

基于onmyway133 code我想出了扩展(Swift 3.2):

extension XCTestCase {
  func wait(for element: XCUIElement, timeout: TimeInterval) {
    let p = NSPredicate(format: "exists == true")
    let e = expectation(for: p, evaluatedWith: element, handler: nil)
    wait(for: [e], timeout: timeout)
  }
}

extension XCUIApplication {
  func getElement(withIdentifier identifier: String) -> XCUIElement {
    return otherElements[identifier]
  }
}

因此,在您的呼叫网站上,您可以使用:

wait(for: app.getElement(withIdentifier: "ViewController"), timeout: 10)

以上是关于Swift UI测试 - 等待元素出现的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 3 UI 测试中访问自定义视图组件中的元素

python如何实现元素等待

使用绑定从片段访问父活动的 UI 元素

Swift UI 测试静态文本值

Xcode UI 测试(目标 C):通过 Accessibility Label 查找元素

如何在swift中等待ui委托