2016-03-29 15 views
12

Ich möchte Xcode UI-Tests mit der Fastline Snapshot verwenden, um Screenshots der Cordova App zu machen. Da meine gesamte App nur eine Web-Ansicht ist, sind alle xcode UI-Test-Hilfsmethoden irrelevant, und ich möchte nur auf bestimmte Punkte tippen, z. tap(x: 10, y: 10) sollte einen Abgriff an der Stelle {10px; 10px} erzeugen.So tippen Sie auf einen bestimmten Punkt mit Xcode UITests

Das ist wahrscheinlich sehr einfach, aber ich kann nicht herausfinden, wie es geht.

Danke.

Antwort

18

Sie können einen bestimmten Punkt mit der XCUICoordinate API antippen. Leider können Sie nicht einfach "10,10 tippen" sagen, wenn Sie auf eine Pixelkoordinate verweisen. Sie müssen die Koordinate mit einem relativen Versatz zu einer tatsächlichen Ansicht erstellen.

Wir können die erwähnte Webansicht verwenden, um mit der relativen Koordinate zu interagieren.

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

Randnotiz, aber haben Sie mit der Web-Ansicht direkt versucht, die Interaktion? Ich hatte viel Erfolg mit app.links["Link title"].tap() oder app.staticTexts["A different link title"].tap(). Here's a demo app I put together demonstrating interacting with a web view.


aktualisieren: Wie Michal W. in den Kommentaren darauf hingewiesen, können Sie jetzt tippen ein direkt, koordinieren, ohne sich Gedanken über die Offset-Normalisierung.

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

Beachten Sie, dass ich 0,0 zum normalisierten Vektor und dann den tatsächlichen Punkt, 10,10, zum zweiten Anruf übergebe.

+1

ich bin sicher, das nicht korrekt ist, wie ich hinzufügen 'coordinateWithOffset' benötigt x/y Hahn auszuführen: lassen cooridnate = self.coordinateWithNormalizedOffset (CGVector (dx: 0 , dy: 0)) .koordinateWithOffset (CGVektor (dx: position.x, dy: position.y)) cooridnate.tap() https://forums.developer.apple.com/thread/13373 –

+0

Gute Idee! Danke @ MichałW. Ich habe den Kommentar in einem Update zur Antwort notiert, da dieser bereits akzeptiert wurde. –

8

@joe Um etwas weiter von Joe Masilottis Herangehensweise entfernt zu sein, habe ich meinen in eine 10 gesetzt und Präpositionalphrasen den globalen und lokalen Params gegeben.

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

Durch den globalen einen identifizierbaren Namen geben kann ich leicht die Instanz zum Beispiel verstehen:

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

Arbeitete für mich in Swift 3! – mmd1080

+0

Dies kompiliert nicht in Swift 3 –

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

Pass (0,0) auf den normalisierten Vektor und dann dem eigentlichen Punkt (10 , 10)