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.
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()
.
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)
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")
Tweaked:
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)
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)