webentwicklung-frage-antwort-db.com.de

Xcode UI Testing - Text mit der typeText () - Methode und Autokorrektur eingeben

Ich habe einen Test wie folgt: 

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

Das Problem ist, dass mein iPhone Simulator aufgrund der Systemeinstellungen standardmäßig eine polnische Tastatur besitzt und "Henrik" automatisch durch "Autokorrektur" in "ha" geändert wird. 

Eine einfache Lösung besteht darin, die polnische Tastatur aus dem iOS Settings zu entfernen. Diese Lösung löst das Problem jedoch nicht, da iPhone Simulator zurückgesetzt werden kann und der Test erneut fehlschlägt. 

Gibt es eine Möglichkeit, die Autokorrektur vor dem Testfall oder eine andere Möglichkeit zur Eingabe von Text in ein Textfeld vorzunehmen. 

15
Apan

Es gibt eine Problemumgehung, um UIPasteboard zur Eingabe von Eingabetext zu verwenden:

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)

Sie können link mit description als Workaround für die sichere Eingabe in GM überprüfen.

Bearbeiten

Zur besseren Lesbarkeit können Sie stattdessen app.menuItems.elementBoundByIndex(0).tap()app.menuItems["Paste"].tap() ausführen.

12
Apan

Hier ist eine kleine Erweiterung von XCUIElement, um dies zu erreichen

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

Es kann so verwendet werden

let app = XCUIApplication()
let enterNameTextField =  app.otherElements.textFields["Enter Name"]
enterNameTextField.tap()
enterNameTextField.setText("John Doe", app)
  • Für die Implementierung geht @Apan auf das Konto
20
mike

Momentan verwenden Sie Swift 4 für Xcode 10 Sie können jetzt typeText(String) wie folgt verwenden let app = XCUIApplication() let usernameTextField = app.textFields["Username"] usernameTextField.typeText("Caseyp")

0
Daniel Leonard

Tweaked:

  1. also ist die erweiterung auf anwendung, was für mich etwas sinnvoller ist
  2. die vorhandenen Feldinhalte werden geleert

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

Laufen mit:

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

Verwenden Sie für Swift v3 den neuen sintax (Antwort von @mike):

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

und benutze es:

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