web-dev-qa-db-fra.com

Comment masquer le clavier dans l'application Swift lors des tests d'interface utilisateur

Je viens de commencer avec les tests d'interface utilisateur dans XCode 7 et j'ai rencontré ce problème:

Je dois saisir du texte dans un champ de texte, puis cliquer sur un bouton. Malheureusement, ce bouton est caché derrière le clavier qui est apparu lors de la saisie de texte dans le champ de texte. XCode essaie de faire défiler l'écran pour le rendre visible, mais ma vue ne peut pas défiler, elle échoue.

Ma solution actuelle est la suivante:

let textField = app.textFields["placeholder"]
textField.tap()
textField.typeText("my text")
app.childrenMatchingType(.Window).elementBoundByIndex(0).tap() // hide keyboard
app.buttons["hidden button"].tap()

Je peux le faire parce que mon ViewController intercepte des touches:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    view.endEditing(false)
    super.touchesBegan(touches, withEvent: event)
}

Je ne suis pas vraiment satisfait de ma solution. Existe-t-il un autre moyen de masquer le clavier pendant les tests d'interface utilisateur?

16
leizeQ

Si vous avez configuré vos champs de texte pour qu'ils renoncent à FirstResponder (via textField.resignFirstResponder() ou self.view.endEditing(true)) dans la méthode de délégation textFieldShouldReturn()

textField.typeText("\n")

le fera.

17
bbjay

Basé sur une question à le blog de Joe , j'ai un problème dans lequel après quelques exécutions sur simulateur, les claviers ne se cachent pas en utilisant ce morceau de code:

XCUIApplication().keyboard.buttons["Hide keyboard"]

Donc, je l'ai changé pour: (merci Joe)

XCUIApplication().keyboard.buttons["Hide keyboard"]
let firstKey = XCUIApplication().keys.elementBoundByIndex(0)
if firstKey.exists {
   app.typeText("\n")
}

Ce que j’essaie de faire ici, c’est de détecter si le clavier reste ouvert après avoir appuyé sur le bouton de masquage. S'il est en haut, je tape un "\ n" qui, dans mon cas, ferme également le clavier.

Cela s'avère également délicat, car parfois le simulateur perd le focus sur la frappe au clavier, ce qui peut faire échouer le test, mais selon mon expérience, le taux d'échec est inférieur aux autres approches que j'ai adoptées.

J'espère que cela peut aider.

5
katu
XCUIApplication().toolbars.buttons["Done"].tap()
3
reutsey

J'utilise toujours cela pour masquer par programmation le clavier dans Swift UITesting:

XCUIApplication().keyboards.buttons["Hide keyboard"].tap()
3
Charlie Seligman

La réponse à votre question ne réside pas dans votre code de test, mais dans le code de votre application. Si un utilisateur ne peut pas saisir de texte à l'aide du clavier logiciel à l'écran, puis appuyez sur le bouton, vous devez faire en sorte que le test ferme le clavier (l'utilisateur doit le faire pour appuyer sur le bouton) ou bien faire défiler la vue. .

2
Aaron Sofaer

Avec Swift 4.2, vous pouvez le faire maintenant avec l'extrait suivant:

let app = XCUIApplication()
if app.keys.element(boundBy: 0).exists {
    app.typeText("\n")
}
1
CodeBender

Assurez-vous simplement que le clavier est désactivé dans le simulateur avant d'exécuter les tests.

Matériel-> Clavier-> Connecter le clavier matériel.

Puis entrez votre texte en utilisant le tableau de collage

textField.tap()
UIPasteboard.generalPasteboard().string = "Some text"
textField.doubleTap()
app.menuItems["paste"].tap()
1
365SplendidSuns