Cómo tocar en un punto específico usando Xcode ITUests

Quiero utilizar las testings de interfaz de usuario Xcode con Fastline Snapshot para hacer capturas de pantalla de la aplicación Cordova. Básicamente, como toda mi aplicación es solo una vista web, todos los methods auxiliares de testing de UI xcode se vuelven irrelevantes, y solo quiero tocar puntos específicos, por ejemplo, tap(x: 10, y: 10) debería producir un toque en el punto {10px; 10px} {10px; 10px} .

Probablemente sea muy simple, pero no puedo entender cómo hacerlo.

Gracias.

Puede tocar un punto específico con la API XCUICoordinate . Desafortunadamente, no puedes decir "toque 10,10" haciendo reference a una coorderada de píxeles. Deberá crear la coorderada con un desplazamiento relativo a una vista real.

Podemos usar la vista web mencionada para interactuar con la coorderada relativa.

 let app = XCUIApplication() let webView = app.webViews.element let coordinate = webView.coordinateWithNormalizedOffset(CGVector(dx: 10, dy: 10)) coordinate.tap() 

Nota al margen, ¿pero has intentado interactuar con la vista web directamente? He tenido mucho éxito usando app.links["Link title"].tap() o app.staticTexts["A different link title"].tap() . Aquí hay una aplicación de demostración que junté demostrando interactuar con una vista web.


Actualización : como Michal W. señaló en los comentarios, ahora puede tocar una coorderada directamente , sin preocuparse por normalizar el desplazamiento.

 let normalized = webView.coordinateWithNormalizedOffset(CGVector(dx: 0, dy: 0)) let coordinate = normalized.coordinateWithOffset(CGVector(dx: 10, dy: 10)) coordinate.tap() 

Observe que paso 0,0 al vector normalizado y luego el punto real, 10,10, a la segunda llamada.

@joe Para ir un poco más lejos del enfoque de Joe Masilotti, puse el mío en una extension y di frases preposicionales a los parameters globales y locales.

  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() } 

Al dar al global un nombre identificable, puedo entender fácilmente la instancia, por ejemplo:

 tapCoordinate(at x: 100, and y: 200)