2015-12-03 11 views
13

ich mit UI-Tests in XCode nur gestartet 7 und treffen dieses Problem:Wie Tastatur in Swift App während UI-Tests verstecken

ich Text in ein Textfeld eingeben muß und dann auf eine Schaltfläche klicken. Leider ist diese Schaltfläche hinter der Tastatur versteckt, die beim Eingeben von Text in das Textfeld erschien. XCode versucht zu scrollen, um es sichtbar zu machen, aber meine Ansicht ist nicht scrollbar, so dass es fehlschlägt.

Meine aktuelle Lösung ist dies:

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

ich das tun kann, weil mein Viewcontroller ist berührt abfangen:

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

Ich bin nicht wirklich glücklich über meine Lösung, gibt es eine andere Art und Weise, wie die Tastatur während des UI-Tests verstecken?

+0

Wenn u Problem haben mit Tastatur-Taste verbirgt, kann u nur die ganze Sicht Push-up mit 'setContentOffset' bis die Schaltfläche ist sichtbar, es spielt keine Rolle, ob Ihre Ansicht scrollbar ist oder nicht – Tj3n

+2

1.Wenn Sie nicht auf eine Schaltfläche zugreifen können, wenn die Tastatur sichtbar ist, ist das nicht ein UX-Problem? 2. Dies sind nur Tests. Tests werden voraussichtlich Hacky-Code haben, so dass ich nicht sehe, was ist dein Problem hier :) Lass es einfach, wenn es funktioniert. –

Antwort

2

Die Antwort auf Ihre Frage liegt nicht in Ihrem Testcode, sondern in Ihrem App-Code. Wenn ein Benutzer mit der Onscreen-Software-Tastatur keinen Text eingeben kann und dann auf die Schaltfläche klickt, sollten Sie entweder die Tastatur schließen (wie es ein Benutzer tun müsste, um auf die Schaltfläche zu tippen) oder die Ansicht scrollbar machen .

+0

"Machen Sie den Test die Tastatur zu schließen" - Haben Sie Vorschläge, wie dies zu erreichen? XCUIElement hat keine solche Idee wie resignFirstResponder. – Rayfleck

+0

app.keyboards.buttons ["Tastatur verbergen"]. Tap() – Rayfleck

+0

Ich glaube, Sie können weg von der Tastatur tippen, um es zu verbergen. Etwas wie app.tap() oder app.swipeDown() sollte es tun. – caffeinum

1

Stellen Sie sicher, dass die Tastatur im Simulator ausgeschaltet ist, bevor Sie die Tests ausführen.

Hardware-> Tastatur-> Hardware-Tastatur anschließen.

Dann geben Sie Ihren Text mit der Paste Bord

textField.tap() 
UIPasteboard.generalPasteboard().string = "Some text" 
textField.doubleTap() 
app.menuItems["paste"].tap() 
+0

Warum die down vote? – 365SplendidSuns

10

Wenn Sie Ihre Textfelder eingerichtet haben FirstResponder zum Rücktritt (entweder über textField.resignFirstResponder() oder self.view.endEditing(true)) in der textFieldShouldReturn() Delegatmethode, dann

textField.typeText("\n") 

wird es tun. nach ein paar Durchläufe auf Simulator

3

Basierend auf einer Frage Joe's blog, I, in denen ein Problem haben nicht die Tastaturen mit diesem Stück Code zu verbergen:

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

So habe ich es zu: (Danke Joe)

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

Was ich versuche, hier zu tun ist, erkennen, ob die Tastatur Stills zu öffnen, nachdem tippen auf die Schaltfläche ausblenden, wenn es liegt, ich habe ein „\ n“ geben, was in meinem Fall auch die Tastatur wird geschlossen.

Dies ist auch schwierig, weil manchmal der Simulator den Fokus der Tastatur tippen verloren und dies könnte den Test fehlschlagen, aber nach meiner Erfahrung ist die Fehlerrate niedriger als die anderen Ansätze, die ich genommen habe.

Ich hoffe, das kann helfen.

+0

Funktioniert in allen Fällen –

2

ich dies immer verwenden, um programm die Tastatur in Swift UITesting zu verstecken:

XCUIApplication().keyboards.buttons["Hide keyboard"].tap() 
+0

Funktioniert nicht für mich auf dem iPhone. Könnte das nur iPad sein? –

+0

Wert vom Typ 'XCUIApplication' hat kein Mitglied 'Tastatur'. @charlieSeligman Funktioniert der Code im Gerät oder Code funktioniert nur für Simulator? –

1
XCUIApplication().toolbars.buttons["Done"].tap()