本篇文章由 使用 Xcode 執行 UI 自動化測試 – Part 1 繼續延伸,列出測試過程中較進階的用法,將使用 Swift 2.3 來說明。
-
判斷測試 App 跑在 iPhone 或 iPad
可透過 horizontalSizeClass 跟 verticalSizeClass 來判斷
let window = XCUIApplication().windows.elementBoundByIndex(0) if (window.horizontalSizeClass == .Compact || window.verticalSizeClass == .Compact) { // iPhone 的 test script } else { // iPad 的 test script }
或
let window = XCUIApplication().windows.elementBoundByIndex(0) if (window.horizontalSizeClass == .Regular || window.verticalSizeClass == .Regular) { // iPad 的 test script } else { // iPhone 的 test script }
基本上 .Compact 是 iPhone 而 .Regulat 是 iPad,詳細說明可參考 Auto Layout Guide_ Size-Class-Specific Layout,這邊值得注意的是如果把原本 if 判斷式改用 XCUIApplication().horizontalSizeClass 或 XCUIApplication().verticalSizeClass 反而會造成判斷錯誤。
-
按下 Home 鍵
XCUIDevice.sharedDevice().pressButton(XCUIDeviceButton.Home)
-
調整螢幕方向
// 將畫面轉成直向 Portrait XCUIDevice().orientation = UIDeviceOrientation.Portrait // 將畫面轉成直向 Portrait Upside Down XCUIDevice().orientation = UIDeviceOrientation.PortraitUpsideDown // 將畫面轉成橫向 Landscape Left XCUIDevice().orientation = UIDeviceOrientation.LandscapeLeft // 將畫面轉成橫向 Landscape Right XCUIDevice().orientation = UIDeviceOrientation.LandscapeRight
-
判斷元件是否會包含在某個元件裡
let app = XCUIApplication() let container = app.tables.cells["info"] let element = app.buttons["more"] XCTAssertTrue(CGRectContainsRect(container.frame, element.frame)) // 確認 container 中會包含 element
-
判斷元件是否有顯示在畫面上
可透過 hittable 來判斷,當回傳為 true 表示元件有顯示在畫面的可視範圍內:
let loginButton = XCUIApplication().buttons["login"] XCTAssertTrue(loginButton.hittable)
-
點擊元件中特定的座標位置
預設的 tap() 會點擊元件的中心點,但如果要點選的元件中心點有一個 button 就會點到這 button,導致無法點擊要點選的元件,此時就必須調整 tap 點擊的位置
func tapAtPosition(position: CGPoint) { let cooridnate = self.coordinateWithNormalizedOffset(CGVector(dx: 0, dy: 0)) .coordinateWithOffset(CGVector(dx: position.x, dy: position.y)) cooridnate.tap() } let customControl = XCUIApplication().tables.cells["View"] customControl.tapAtPosition(CGPoint(x: 20.0, y: 10.0)) // 原點為左上角
-
取得畫面的 Accessibility Hierarchy
let app = XCUIApplication() print(app.debugDescription)
參考文章:
That’s a crakjercack answer to an interesting question
讚讚