Как правильно протестировать UITest приложение с помощью UIImagePickerController (или любого другого родного VC)

Я пытаюсь автоматизировать создание скриншотов своего приложения с помощью Snapshot, и все идет хорошо, пока я не захочу для навигации по UIImagePickerController, который установил allowsEditing на true.

Странно то, что в симуляторах iPhone 4s, 5s и 6s все работает нормально, но в iPhone 6(s) ) Кроме того, тест не может нажать кнопку «Выбрать» («Kies» на голландском языке) в режиме обрезки.

Моя первая попытка не работала ни в одной версии:

app.buttons.elementBoundByIndex(2).tap()

И привел к следующей ошибке:

file:///%3Cunknown%3E: сбой теста: -[MyAppSnapshots testExample()] не удалось: сбой тестирования пользовательского интерфейса - не удалось прокрутить до видимой (действием AX) кнопки 0x7f82d450ae30: черты: 8589934593, {{327.0, 613.5}, {35.0, 34.0}}, метка: "Kies", ошибка: Ошибка -25204 при выполнении AXAction 2003

Затем из этого ответа я взял решение forceTapElement, которое работает на всех, кроме iPhone 6(s) Plus. .

app.buttons.elementBoundByIndex(2).forceTapElement()

Затем я попытался нажать на координату;

let window = app.windows.elementBoundByIndex(0)
let rightBottom = window.coordinateWithNormalizedOffset(CGVectorMake(
  CGRectGetWidth(window.frame) - 20,
  CGRectGetHeight(window.frame) - 20
))
rightBottom.tap()

Но это снова не сработало ни на одном из устройств.

Итак, как мне протестировать эти родные интерфейсы? Или я должен просто добавить какой-то переключатель в свой код, чтобы UIImagePickerController заменялся чем-то неинтерактивным.


person Koen.    schedule 09.02.2016    source источник
comment
Удалось ли вам решить эту проблему? Так как я сейчас тоже с этим сталкиваюсь! Я попробовал все упомянутые решения, но ничего не работает ни на одном из устройств, если только я не установил .allowsEditing = false.   -  person Battle Eagle    schedule 15.03.2021
comment
Нет, так и не нашел решения. Хотя прошло уже довольно много времени, как я попробовал это.   -  person Koen.    schedule 10.06.2021
comment
Спасибо за ваш ответ! Если вам это все еще нужно (или кому-то еще), я смог исправить это, просто поместив сон (1) перед нажатием кнопки «Выбрать». Не уверен, что так должно быть у всех.   -  person Battle Eagle    schedule 11.06.2021


Ответы (1)


Похоже на рабочий подход:

func waitForElementToAppear(element: XCUIElement,
                            timeout seconds: TimeInterval = 5,
                            file: String = #file,
                            line: UInt = #line) {
    let existsPredicate = NSPredicate(format: "exists == true")
    let expectation = expectation(for: existsPredicate, evaluatedWith: element, handler: nil)
    XCTWaiter().wait(for: [expectation], timeout: seconds)
    XCTAssert(element.exists, "Element \(element.identifier) not found")
}

func tapAtPosition(position: CGPoint,
                   file: String = #file,
                   line: UInt = #line) {
    let cooridnate = app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0)).withOffset(CGVector(dx: position.x, dy: position.y))
    cooridnate.tap()
}

func selectPhotoFromGalary(index: Int = 0) {
    waitForElementToAppear(element: app.buttons["Photos"], timeout: 10)
    let position = app.images.containing(NSPredicate(format: "label BEGINSWITH 'Photo'")).element(boundBy: index).frame.origin
    tapAtPosition(position: position)
    let chooseButton = app.buttons["Choose"]
    waitForElementToAppear(element: chooseButton, timeout: 5)
    chooseButton.tap()
}
person Splash    schedule 02.07.2021