使用 Xcode UI 测试测试 UIWebView

Testing UIWebView with Xcode UI Testing

我正在使用来自 XCTest Framework 的新 Xcode UI TestingXcode 7 GM。我有一个带有简单 UIWebView 的应用程序(它只是一个导航控制器 + 带有 web 视图和按钮的视图控制器),我想检查以下场景:

  1. Web 视图加载页面 www.example.com
  2. 用户点击按钮
  3. Web 视图使用 URL 加载一些页面:www.example2.com

我想检查按下按钮后 UIWebView 中加载了哪个页面。现在 UI 测试是否可行?

实际上我得到的网络视图是这样的:

let app:XCUIApplication = XCUIApplication()
let webViewQury:XCUIElementQuery = app.descendantsMatchingType(.WebView)
let webView = webViewQury.elementAtIndex(0)

您将无法分辨 加载了哪个 页面,就像显示的实际 URL 一样。但是,您可以检查断言内容是否在屏幕上。 UI 测试为 links that works great with both UIWebView and WKWebView 提供 XCUIElementQuery

请记住,页面不会同步加载,因此您必须 wait for the actual elements to appear

let app = XCUIApplication()
app.launch()

app.buttons["Go to Google.com"].tap()

let about = self.app.staticTexts["About"]
let exists = NSPredicate(format: "exists == 1")
expectationForPredicate(exists, evaluatedWithObject: about, handler: nil)

waitForExpectationsWithTimeout(5, handler: nil)
XCTAssert(about.exists)

XCTAssert(app.staticTexts["Google Search"].exists)
app.links["I'm Feeling Lukcy"].tap()

如果您想深入了解代码,还有一个 working test host 与这两个链接一起出现。

如果页面标题不一样,您可以查看网页标题。

let app = XCUIApplication()
app.launch()
//Load www.example.com

//Tap on some button    
app.links["Your button"].tap()

//Wait for www.example2.com to load
let webPageTitle = app.otherElements["Example2"]
let exists = NSPredicate(format: "exists == 1")
expectationForPredicate(exists, evaluatedWithObject: webPageTitle, handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)