Как нажать на определенную точку с помощью Xcode UITests

Я хочу использовать тесты Xcode UI с Fastline Снимок чтобы сделать скриншоты приложения Cordova. В принципе, поскольку все мое приложение-это просто веб-представление, все вспомогательные методы Xcode UI test становятся неактуальными, и я просто хочу нажать на определенные точки, например tap(x: 10, y: 10) должен произвести кран в точке {10px; 10px}.

это, вероятно, очень просто, но я не могу понять, как это сделать.

спасибо.

3 ответов


вы можете нажать определенную точку с помощью 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.coordinateWithNormalizedOffset(CGVector(dx: 0, dy: 0))
let coordinate = normalized.coordinateWithOffset(CGVector(dx: 10, dy: 10))
coordinate.tap()

обратите внимание, что я передаю 0,0 нормализованному вектору, а затем фактическую точку, 10,10, второму вызову.


@joe чтобы пойти немного дальше от подхода Джо Масилотти, я положил свой в extensionи дал предложных фраз глобальные и локальные параметры.

    func tapCoordinate(at x xCoordinate: Double, and y 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)

<something>.coordinate(withNormalizedOffset: CGVector.zero).withOffset(CGVector(dx:10,dy:60)).tap()

перейти (0,0) К нормализованному вектору, а затем к фактической точке (10,10)