Тест пользовательского интерфейса — системное оповещение в ландшафтном режиме

Я работаю над тестом пользовательского интерфейса для нескольких системных предупреждений подряд (например, видеоприложение для получения разрешения на камеру, микрофон и фотографии). В примере проекта кажется, что новый метод addUIInterruptionMonitorWithDescription не работает в ландшафтном режиме.

Я наткнулся на этот пост Swift UI Test - Системное оповещение пользовательских уведомлений, но у меня дело обстоит иначе.

Мой код выглядит так:

    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()

Это работает для портрета, а не для пейзажа. Дело может быть воспроизведено Симулятором и Устройством.

Более того, okButton.frame, которое я получил в Портрете,

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

но кадр в Пейзаже показывает вот так

оповещение о горизонтальной ориентации

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

Ошибка сбоя теста, которую я получил, это

ошибка теста: -[AlertUITests testExample()] не удалось: ошибка тестирования пользовательского интерфейса - не удалось прокрутить до видимой (действием AX) кнопки 0x14df73840: черты: 8589934593, {{277.0, 345.0}, {46.0, 30.0}}, метка: ' Кнопка», ошибка: Ошибка -25204 при выполнении AXAction 2003

Есть идеи?

ИЗМЕНИТЬ 1

Представлено на Радар rdar://23931990


person Harry Ng    schedule 17.12.2015    source источник
comment
Это точная проблема вопроса, на который вы ссылаетесь. Проверьте изменения спрашивающего, они также упоминают, что приложение находится в ландшафтном режиме.   -  person Joe Masilotti    schedule 17.12.2015
comment
@JoeMasilotti Я заметил правку. Однако это другая проблема. Как упомянул спрашивающий, его приложение нажимает на кнопку Dont Allow, а в моем случае показывает ошибку с действием AX.   -  person Harry Ng    schedule 17.12.2015
comment
Похоже, что есть ошибка с оповещениями ландшафтной системы, верно? Я думаю, радар - это все, что мы можем здесь сделать.   -  person Joe Masilotti    schedule 17.12.2015


Ответы (1)


Это баг фреймворка.

Попробуйте использовать что-то вроде этого:

Помощники:

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}
    }
person Oxi Ros    schedule 09.01.2018