2015-10-01 8 views
6

Als Teil meiner UI-Tests erzeuge ich eine zufällige Zeichenfolge als Titel für meine Objekte. Das Problem besteht darin, dass iOS bei der Eingabe dieses Titels über eine Tastatur (unter Verwendung von XCUIElement.typeText()) manchmal einen automatisch vorgeschlagenen Wert annimmt.Wie kann die automatische Vervollständigung beim Ausführen von Xcode UI Tests deaktiviert werden?

Zum Beispiel möchte ich, dass es eine automatisch generierte Zeichenfolge von "Calg" eingibt, aber Auto Correct wählt stattdessen "Kalb". Wenn ich später mit einer Assertion nach diesem Wert suche, existiert er nicht und schlägt falsch fehl.

Gibt es eine Möglichkeit, den UI-Tests mitzuteilen, dass sie keine automatische Korrektur verwenden sollen, oder gibt es eine Problemumgehung, die ich verwenden kann?

Antwort

4

Sofern Sie keine automatischen Vorschläge für Testszenarien benötigen, haben Sie versucht, die Autokorrektur in den Geräte-/Simulatoreinstellungen zu deaktivieren.

Einstellungen-> Allgemein -> Tastatur -> Auto-Korrektur

+1

Das ist schön für lokalen Testlauf. Es funktioniert jedoch nicht für CI. –

+0

Ich habe gerade versucht, selbst einen Workaround zu finden, konnte aber keinen sauberen finden. Ich denke, die vernünftige Lösung ist, dass alle CI-Anbieter ihre Simulatoren so konfigurieren sollten, dass die Autokorrektur standardmäßig für kurze Zeit deaktiviert ist. Sie können sich also gerne an sie wenden, ich bin mir sicher, dass sie Ihnen helfen werden. Es ist jedoch auf Apple, eine Lösung (z. B. eine Option in Xcode innerhalb des Schemas) für diese lange Zeit bereitzustellen, so dass Sie möglicherweise eine Feature-Anfrage über den Bug-Reporter veröffentlichen möchten. Je mehr Menschen dies tun, desto wahrscheinlicher wird es umgesetzt. – Dschee

5

Ich glaube nicht, können Sie die automatische Korrektur durch den Code aus dem UI-Testing Ziel auszuschalten.

Sie können dies jedoch für die individuelle Textansicht aus Ihrem Produktionscode ausschalten. Um sicherzustellen, dass die Autokorrektur beim Ausführen und Versenden der App noch aktiv ist, wäre eine Lösung die Unterklasse UITextField und eine Umgebungsvariable zu aktivieren.

Richten Sie zunächst Ihren UI-Test ein, um die launchEnvironment-Eigenschaft auf XCUIApplication festzulegen.

class UITests: XCTestCase { 
    let app = XCUIApplication() 

    override func setUp() { 
     super.setUp() 
     continueAfterFailure = false 
     app.launchEnvironment = ["AutoCorrection": "Disabled"] 
     app.launch() 
    } 

    func testAutoCorrection() { 
     app.textFields.element.tap() 
     // type your text 
    } 
} 

Dann Unterklasse (und Verwendung) UITextField für diesen Wert suchen in der Umgebung Wörterbuch des Prozesses. Wenn es eingestellt ist, deaktivieren Sie die Autokorrektur. Wenn nicht, rufen Sie einfach zu Super.

class TestableTextField: UITextField { 
    override var autocorrectionType: UITextAutocorrectionType { 
     get { 
      if NSProcessInfo.processInfo().environment["AutoCorrection"] == "Disabled" { 
       return UITextAutocorrectionType.No 
      } else { 
       return super.autocorrectionType 
      } 
     } 
     set { 
      super.autocorrectionType = newValue 
     } 
    } 
} 
+0

Es ist eine interessante Idee. Der Nachteil besteht jedoch darin, dass Sie ALLE Textfelder der Unterklasse in der Anwendung haben. Es kann sinnvoll sein, die UITextField-Klassenmethoden zu swizzlen, um sie zu implementieren. –

+0

Hier sind einige Hinweise bezüglich swizzling: http://stackoverflow.com/questions/9670321/turn-off-autocorrect-globally-in-an-app –

+0

das ist die perfekte Antwort, denke ich. – noor

0

Hier ist, wie ich es in meinem UI-Test deaktiviert

app.textFields.element(boundBy: 0).tap() 

    let keyboards = app.keyboards.count 
    XCTAssert(keyboards > 0, "You need enable the keyboard in the simulator.") 

    app.buttons["Next keyboard"].press(forDuration: 2.1) 

    let predictiveOn = app.switches["Predictive"].value as! String == "1" 

    if predictiveOn { 
     app.switches["Predictive"].tap() 
    } else { 
     app.buttons["Next keyboard"].tap() 
    } 

    app.buttons["Next keyboard"].press(forDuration: 2.1) 

    let predictiveOff = app.switches["Predictive"].value as! String == "0" 
    XCTAssert(predictiveOff, "Predictive mode is not disabled") 

    app.buttons["Next keyboard"].tap()