UI测试 - 横向模式下的系统警报

时间:2015-12-17 01:08:57

标签: swift ios-simulator xctest xcode-ui-testing

我正在为连续几个系统警报进行UI测试(即获得摄像头,麦克风和照片许可的视频应用)。对于示例项目,似乎新方法addUIInterruptionMonitorWithDescription不适用于横向模式。

我遇到过这篇文章Swift UI Test - User Notifications System Alert,但案例对我来说有所不同。

我的代码如下所示:

    let desc = "\u{201c}Alert\u{201d} Would Like to Access the Camera"

    let app = XCUIApplication()

    addUIInterruptionMonitorWithDescription(desc) { (alert) -> Bool in
        let okButton = alert.buttons["OK"]
        print(okButton.frame)
        okButton.tap()
        return true
    }
    app.buttons["Alert"].tap()

适用于肖像,而非风景。案例可以通过模拟器和设备重现。

此外,我在Portrait中获得的okButton.frame

 CGRect
  ▿ origin : CGPoint
    - x : 207.0
    - y : 387.666666666667
  ▿ size : CGSize
    - width : 135.0
    - height : 44.0

但横向中的框架显示如下

Landscape System Alert

 CGRect
  ▿ origin : CGPoint
    - x : 143.333333333333
    - y : 368.0
  ▿ size : CGSize
    - width : 44.0
    - height : 135.0

我得到的测试失败错误就是这个

  

测试失败: - [AlertUITests testExample()]失败:UI测试失败 - 无法滚动到可见(通过AX操作)按钮0x14df73840:特征:8589934593,{{277.0,345.0},{46.0,30.0}}, label:'Button',错误:执行AXAction 2003的错误-25204

有什么想法吗?

编辑1

提交至Radar rdar:// 23931990

1 个答案:

答案 0 :(得分:0)

这是一个框架错误。

尝试使用以下内容:

助手:

var device: XCUIDevice {return XCUIDevice.shared()}

extension XCUIDevice {

    func type() -> String {

        if XCUIApplication().windows.element(boundBy: 0).horizontalSizeClass == .compact || XCUIApplication().windows.element(boundBy: 0).verticalSizeClass == .compact {

            return "iPhone"

        } else {

            return "iPad"
        }
    }
}

方法:

func handleOrientation(_ orientationAltered: Bool) -> Bool {

        guard device.type() == "iPad" else {return false}

        if !orientationAltered && device.orientation == .landscapeLeft {

            device.orientation = .portrait
            return true

        } else if orientationAltered && (device.orientation == .landscapeLeft || device.orientation == .landscapeRight) {

            device.orientation = .landscapeLeft
            return false

        } else {return false}
    }