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