Как использовать конкретную точку с помощью 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)