Есть ли способ автоматизировать SFSafariViewController в тестах пользовательского интерфейса?

Есть ли способ автоматизировать SFSafariViewController? Мне нравится функция тестирования пользовательского интерфейса Xcode 7, но, похоже, она не поддерживает автоматизацию SFSafariViewController. Для некоторых потоков пользовательского интерфейса, которые я тестирую, требуется веб-браузер, поэтому приложение использует SFSafariViewController, чтобы сделать его более безопасным по сравнению с веб-представлением.


person Bryant Luk    schedule 24.09.2015    source источник
comment
Я тоже очень заинтересован в этом. Вы нашли какой-то способ обойти это?   -  person Martin    schedule 16.12.2015
comment
@Martin К сожалению, сейчас ничего.   -  person Bryant Luk    schedule 17.12.2015
comment
Мне непонятно, что именно вы хотите автоматизировать.   -  person Titouan de Bailleul    schedule 06.07.2017
comment
В моем случае я хочу автоматизировать процесс входа в стороннюю службу с тестовой учетной записью.   -  person Bryant Luk    schedule 06.07.2017


Ответы (2)


Если это похоже на запуск расширений (в настоящее время не работает с прямым взаимодействием), попробуйте коснуться экрана в том месте, где находится искомый элемент:

Пример нажатия листа действий, который запускает расширение:

func tapElementInActionSheetByPosition(element: XCUIElement!) {
    let tableSize = app.tables.elementBoundByIndex(0).frame.size
    let elementFrame = element.frame

    // get the frame of the cancel button, because it has a real origin point
    let CancelY = app.buttons["Cancel"].frame.origin.y

    // 8 is the standard apple margin between views
    let yCoordinate = CancelY - 8.0 - tableSize.height + elementFrame.midY

    // tap the button at its screen position since tapping a button in the extension picker directly is currently broken
    app.coordinateWithNormalizedOffset(CGVectorMake(elementFrame.midX / tableSize.width, yCoordinate / app.frame.size.height)).tap()
}

Примечание. Необходимо коснуться слоя запроса XCUIApplication. Нажатие на элемент по положению не работает.

person Chase Holland    schedule 12.04.2016

На данный момент Xcode 9.3 поддерживает это, но он не работает должным образом из-за раздражающей ошибки Xcode.

В тесте вы можете напечатать app.webViews.buttons.debugDescription или app.webViews.textFields.debugDescription, и он выведет правильную информацию, но после tap или typeText произойдет сбой.

Чтобы обойти это, вы можете проанализировать debugDescription, извлечь координаты и нажать по координате. Для текстового поля вы можете вставить текст через меню «Вставить».

private func coordinate(forWebViewElement element: XCUIElement) -> XCUICoordinate? {
    // parse description to find its frame
    let descr = element.firstMatch.debugDescription
    guard let rangeOpen = descr.range(of: "{{", options: [.backwards]),
        let rangeClose = descr.range(of: "}}", options: [.backwards]) else {
            return nil
    }

    let frameStr = String(descr[rangeOpen.lowerBound..<rangeClose.upperBound])
    let rect = CGRectFromString(frameStr)

    // get the center of rect
    let center = CGVector(dx: rect.midX, dy: rect.midY)
    let coordinate = XCUIApplication().coordinate(withNormalizedOffset: .zero).withOffset(center)
    return coordinate
}

func tap(onWebViewElement element: XCUIElement) {
    // xcode has bug, so we cannot directly access webViews XCUIElements
    // as workaround we can check debugDesciption, find frame and tap by coordinate
    let coord = coordinate(forWebViewElement: element)
    coord?.tap()
}

Статья об этом: https://medium.com/@pilot34/work-with-sfsafariviewcontroller-or-wkwebview-in-xcode-ui-tests-8b14fd281a1f

Полный код находится здесь: https://gist.github.com/pilot34/09d692f74d4052670f3bae77dd745889

person Gleb Tarasov    schedule 26.04.2018