web-dev-qa-db-fra.com

Comment taper sur un point spécifique en utilisant Xcode UITests

Je veux utiliser des tests d'interface utilisateur Xcode avec Fastlane Snapshot pour faire des captures d'écran de l'application Cordova. Fondamentalement, comme toute mon application n'est qu'une vue Web, toutes les méthodes d'aide au test de Xcode UI deviennent inutiles, et je veux simplement appuyer sur des points spécifiques, par exemple tap(x: 10, y: 10) devrait produire un tap au point {10px; 10px}.

C'est probablement très simple, mais je ne sais pas comment le faire.

Merci.

21
Dmitry Sokurenko

Vous pouvez toucher un point spécifique avec XCUICoordinate API . Malheureusement, vous ne pouvez pas simplement dire "appuyez sur 10,10" en faisant référence à une coordonnée de pixels. Vous devrez créer les coordonnées avec un décalage relatif par rapport à une vue réelle.

Nous pouvons utiliser la vue Web mentionnée pour interagir avec les coordonnées relatives.

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

Remarque, mais avez-vous essayé d'interagir directement avec la vue Web? J'ai eu beaucoup de succès en utilisant app.links["Link title"].tap() ou app.staticTexts["A different link title"].tap(). Voici une application de démonstration que j'ai créée pour démontrer l'interaction avec une vue Web.


Mise à jour : Comme l'a souligné Michal W. dans les commentaires, vous pouvez maintenant taper une coordonnée directement, sans vous soucier de normaliser le décalage.

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

Notez que je passe 0,0 au vecteur normalisé, puis le point réel, 10,10, au deuxième appel.

32
Joe Masilotti

@joe Pour aller un peu plus loin dans l'approche de Joe Masilotti, j'ai mis le mien dans un extension et j'ai donné des phrases prépositionnelles aux paramètres globaux et locaux.

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

En donnant au global un nom identifiable, je peux facilement comprendre l'instance, par exemple:

tapCoordinate(at x: 100, and y: 200)
15
Laser Hawk
<something>.coordinate(withNormalizedOffset: CGVector.zero).withOffset(CGVector(dx:10,dy:60)).tap()

Passez .zero au vecteur normalisé puis au point réel (10,60)

2
StackUnderflow