web-dev-qa-db-fra.com

Xcode UI Testing - saisie de texte avec la méthode typeText () et la correction automatique

J'ai un test comme ci-dessous: 

let navnTextField = app.textFields["First Name"]
let name = "Henrik"
navnTextField.tap()
navnTextField.typeText("Henrik")
XCTAssertEqual(navnTextField.value as? String, name)

Le problème est que, par défaut, mon iPhone Simulator possède un clavier polonais en raison des paramètres système et que "Henrik" est automatiquement remplacé par "ha" par correction automatique. 

La solution simple consiste à supprimer le clavier polonais du iOS Settings. Cette solution ne résout toutefois pas le problème car iPhone Simulator peut être réinitialisé et le test échouera à nouveau. 

Existe-t-il un moyen de configurer la correction automatique avant le scénario de test ou un autre moyen de saisir du texte dans un champ de texte. 

15
Apan

Une solution de contournement consiste à utiliser UIPasteboard pour fournir du texte d'entrée:

let navnTextField = app.textFields["First name"]
navnTextField.tap()
UIPasteboard.generalPasteboard().string = "Henrik"
navnTextField.doubleTap()
app.menuItems.elementBoundByIndex(0).tap()
XCTAssertEqual(navnTextField.value as? String, name)

Vous pouvez vérifier le lien avec la description comme solution de contournement pour une saisie sécurisée dans GM

Modifier

Pour une meilleure lisibilité, utilisez plutôt app.menuItems.elementBoundByIndex(0).tap()app.menuItems["Paste"].tap().

12
Apan

Voici une petite extension sur XCUIElement pour accomplir cela

extension XCUIElement {
    // The following is a workaround for inputting text in the 
    //simulator when the keyboard is hidden
    func setText(text: String, application: XCUIApplication) {
        UIPasteboard.generalPasteboard().string = text
        doubleTap()
        application.menuItems["Paste"].tap()
    }
}

Il peut être utilisé comme ça

let app = XCUIApplication()
let enterNameTextField =  app.otherElements.textFields["Enter Name"]
enterNameTextField.tap()
enterNameTextField.setText("John Doe", app)
  • Le mérite revient à @Apan pour la mise en œuvre
20
mike

Vous utilisez actuellement Swift 4 sur Xcode 10 Vous pouvez maintenant utiliser typeText(String) comme ceci let app = XCUIApplication() let usernameTextField = app.textFields["Username"] usernameTextField.typeText("Caseyp")

0
Daniel Leonard

Tweaked:

  1. donc l'extension est sur demande qui me semble un peu plus logique
  2. le contenu du champ existant est vidé

code:

extension XCUIApplication {
      // The following is a workaround for inputting text in the
      //simulator when the keyboard is hidden
      func setText(_ text: String, on element: XCUIElement?) {
        if let element = element {
        UIPasteboard.general.string = text
        element.doubleTap()
        self.menuItems["Select All"].tap()
        self.menuItems["Paste"].tap()
        }
      }
    }

Courir avec:

self.app?.setText("Lo", on: self.app?.textFields.firstMatch)
0
user363349

Pour Swift v3, utilisez le nouveau code sintax (réponse de @mike):

extension XCUIElement {
    func setText(text: String?, application: XCUIApplication) {
        tap()
        UIPasteboard.general.string = text
        doubleTap()
        application.menuItems.element(boundBy: 0).tap()
    }
}

et l'utiliser:

let app = XCUIApplication()
let enterNameTextField =  app.otherElements.textFields["Enter Name"]
enterNameTextField.tap()
enterNameTextField.setText(text: "John Doe", application: app)
0
nDiviD