Как использовать конкретную точку с помощью Xcode UITests
Я хочу использовать тесты Xcode UI с Fastlane Snapshot, чтобы делать скриншоты приложения Cordova. По сути, поскольку все мое приложение представляет собой просто веб-представление, все вспомогательные методы тестирования пользовательского интерфейса Xcode становятся неактуальными, и я просто хочу коснуться определенных точек, например, tap(x: 10, y: 10)
должен произвести постукивание в точке {10px; 10px}
.
Это, вероятно, очень просто, но я не могу понять, как это сделать.
Благодарю.
Ответы
Ответ 1
Вы можете нажать на конкретную точку с помощью XCUICoordinate
API. К сожалению, вы не можете просто сказать "нажмите 10,10", ссылаясь на координаты пикселя. Вам нужно будет создать координату с относительным смещением к фактическому виду.
Мы можем использовать упомянутое веб-представление для взаимодействия с относительной координатой.
let app = XCUIApplication()
let webView = app.webViews.element
let coordinate = webView.coordinateWithNormalizedOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()
Примечание, но вы пытались напрямую взаимодействовать с веб-представлением? Я имел большой успех, используя app.links["Link title"].tap()
или app.staticTexts["A different link title"].tap()
. Здесь я собрал демонстрационное приложение, демонстрирующее взаимодействие с веб-представлением.
Обновление: как указал Михал У. в комментариях, теперь вы можете напрямую коснуться координаты, не беспокоясь о нормализации смещения.
let normalized = webView.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0))
let coordinate = normalized.withOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()
Обратите внимание, что я передаю 0,0 нормализованному вектору, а затем фактическую точку 10,10 - второму вызову.
Ответ 2
@joe Чтобы продвинуться немного дальше от подхода Джо Масилотти, я поместил свой в extension
и дал предлогные фразы для глобальных и локальных параметров.
func tapCoordinate(at xCoordinate: Double, and yCoordinate: Double) {
let normalized = app.coordinate(withNormalizedOffset: CGVector(dx: 0, dy: 0))
let coordinate = normalized.withOffset(CGVector(dx: xCoordinate, dy: yCoordinate))
coordinate.tap()
}
Дав глобальному идентифицируемому имени, я легко могу понять пример, например:
tapCoordinate(at x: 100, and y: 200)
Ответ 3
<something>.coordinate(withNormalizedOffset: CGVector.zero).withOffset(CGVector(dx:10,dy:60)).tap()
Передайте .zero нормализованному вектору, а затем фактическую точку (10,60)