2016-03-29 7 views
12

Desidero utilizzare i test dell'interfaccia utente Xcode con lo Fastline Snapshot per creare schermate dell'applicazione Cordova. Fondamentalmente, dato che la mia intera app è solo una visualizzazione web, tutti i metodi di test del test dell'interfaccia utente xcode diventano irrilevanti e voglio solo toccare specifici punti, ad es. tap(x: 10, y: 10) dovrebbe produrre un tocco nel punto {10px; 10px}.Come toccare un punto specifico utilizzando Xcode UITests

Probabilmente è molto semplice, ma non riesco a capire come farlo.

Grazie.

risposta

18

È possibile toccare un punto specifico con XCUICoordinate API. Sfortunatamente non puoi dire semplicemente "tocca 10,10" facendo riferimento a una coordinata di pixel. Dovrai creare la coordinata con un offset relativo su una vista reale.

Possiamo utilizzare la vista Web indicata per interagire con la coordinata relativa.

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

Nota a margine, ma avete provato interagire con la vista web direttamente? Ho avuto molto successo usando app.links["Link title"].tap() o app.staticTexts["A different link title"].tap(). Here's a demo app I put together demonstrating interacting with a web view.


Aggiornamento: Come Michal W. sottolineato nei commenti, è ora possibile toccare una coordinata direttamente, senza preoccuparsi di normalizzare l'offset.

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

noti che passo 0,0 al vettore normalizzato e quindi il punto reale, 10,10, alla seconda chiamata.

+1

non sono sicuro che sia corretto, come ho bisogno di aggiungere 'coordinateWithOffset' per eseguire x/y del rubinetto: lasciare cooridnate = self.coordinateWithNormalizedOffset (CGVector (dx: 0 , dy: 0)). coordinateWithOffset (CGVector (dx: posizione.x, dy: posizione.y)) cooridnate.tap() https://forums.developer.apple.com/thread/13373 –

+0

Buona idea! Grazie @ MichałW. Ho notato il commento in un aggiornamento della risposta poiché era già stato accettato. –

8

@joe Per andare un po 'più lontano dall'approccio di Joe Masilotti, ho inserito il mio in un extension e ho fornito frasi preposizionali ai parametri globali e locali.

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

Dando il nome identificabile globale che può facilmente capire l'istanza per esempio:

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

Ha funzionato per me in Swift 3! – mmd1080

+0

Questo non viene compilato in Swift 3 –

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

Pass (0,0) al vettore normalizzato e poi il punto reale (10 , 10)