UI Testing 可以通過 XCUIApplication()
獲取整個 app 的對象邀层。通過其 staticTexts
左胞、 buttons
等屬性得到一個 XCUIElementQuery
對象,進一步獲取 XCUIElement
對象來操作 UI 達到測試的目的熙侍。
WebView 中的 html 對象忍啤,也是可以通過以上方式獲得的。UITesting 是基于 Accessibility胎食。UI Accessibility 在 iOS 3.0 就被引入了扰才,功能是對屏幕上的 UI 進行分類和標記,配合屏幕閱讀技術(shù) VoiceOver 和語音控制厕怜,用戶在不觸摸屏幕的情況下就可以通過聲音來控制 app , 達到讓身體不便的人士使用 app 的目的衩匣。
但是因為最初 Accessibility 和 VoiceOver 都是基于英文的,中國國情相對對殘障人士的關(guān)愛也比較有限(例如無障礙通道的數(shù)量粥航,盲道的設(shè)計和維護)琅捏,
所以這些功能并不收到重視。不僅如此递雀,完善這些功能對于開發(fā)者來說也是很大的工作量柄延,所以基本不受到重視。
UI Testing 的本質(zhì)就是定位屏幕上的元素缀程,進行點擊搜吧、拖動、輸入等操作交互杨凑,然后獲取狀態(tài)判斷是否符合預(yù)期滤奈。例如在 UI-Testing-Cheat-Sheet 中,就可以很方便的在 WebView 中使用 UI Testing:
func testTextExistsInAWebView() {
app.buttons["More Info"].tap()
let volleyballLabel = app.staticTexts["Volleyball"]
waitForElementToAppear(volleyballLabel)
XCTAssert(volleyballLabel.exists)
}
func testTappingALinkInAWebView() {
app.buttons["More Info"].tap()
let disambiguationLink = app.links["Volleyball (disambiguation)"]
waitForElementToAppear(disambiguationLink)
XCTAssert(disambiguationLink.exists)
disambiguationLink.tap()
let volleyballLink = app.links["Volleyball (ball)"]
waitForElementToAppear(volleyballLink)
XCTAssert(volleyballLink.exists)
}
但是很遺憾撩满,通過 staticTexts[xxx]
蜒程、 links[xxx]
這樣的方式在 WebView 中獲取元素暫不支持中文,在中文網(wǎng)頁中伺帘,我們無法通過這樣的方式完成 UI Testing昭躺。
這里只能通過一種死板的方式進行 UI Testing: 獲取到 webView 元素后,直接觸摸一個指定的坐標曼追,從而達到操作元素的目的:
func testLogin() {
let app = XCUIApplication()
let webView = app.webViews.element
// 這里簡單的用 sleep() 來等待
// 根據(jù)網(wǎng)頁加載速度適當(dāng)調(diào)整窍仰,尤其是第一次需要等待較長時間
sleep(5)
// 觸摸一個位置
let coordinate = webView.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))
coordinate.tap()
// 這里等待是為了看到操作效果
sleep(5)
}
注意:
CGVector
中的dx
、dy
并不是像素礼殊,而是以webView
元素的origin
為原點驹吮,以webView
的frame
為大小,做出偏移的百分比晶伦。例子中的
CGVector(dx: 0.5, dy: 0.5)
即是webView
的中心點碟狞,左上角為CGVector(dx: 0, dy: 0)
,右下角為CGVector(dx: 1, dy: 1)
婚陪∽逦郑可能在不同大小的屏幕中元素的位置還有差別,要引起注意泌参。
如果要想測試輸入功能脆淹,只要在彈起鍵盤之后,調(diào)用 XCUIApplication().typeText("admin123")
的方式即可完成沽一。只需要注意網(wǎng)頁的響應(yīng)時間盖溺,在適當(dāng)?shù)牟僮髦屑尤脒m當(dāng)?shù)牡却龝r間,在 WebView 中使用 UI Testing 也就不成問題了铣缠。