2015-12-03 24 views
13

Ho appena iniziato con i test interfaccia utente in XCode 7 e ha colpito questo problema:Come nascondere la tastiera in App Swift durante i test UI

devo inserire testo in un campo di testo e quindi fare clic su un pulsante. Sfortunatamente questo pulsante è nascosto dietro la tastiera che appare durante l'immissione del testo nel campo di testo. XCode sta cercando di scorrere per renderlo visibile ma la mia vista non è scorrevole, quindi fallisce.

mia soluzione attuale è questa:

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

posso fare questo perché il mio ViewController sta intercettando tocchi:

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

io non sono davvero contento della mia soluzione, c'è qualche altro modo in cui nascondere la tastiera durante i test dell'interfaccia utente?

+0

Se la u ha problema con il tasto della tastiera nasconde, u può solo spingere tutta la visione con 'setContentOffset' fino al tasto è visibile, non importa se la tua vista è scorrevole o no – Tj3n

+2

1.Se non riesci ad accedere a un pulsante quando la tastiera è visibile, non è un problema di UX? 2. Questi sono solo test. I test dovrebbero avere il codice hacky quindi non vedo qual è il tuo problema qui :) Lascia perdere, se funziona. –

risposta

2

La risposta alla tua domanda non si trova nel codice di prova ma nel codice dell'app. Se un utente non può immettere il testo utilizzando la tastiera del software sullo schermo e quindi tocca il pulsante, è necessario eseguire il test ignorare la tastiera (come un utente dovrebbe, per toccare il pulsante) o rendere scorrevole la visualizzazione .

+0

"fai terminare il test con la tastiera" - Hai qualche suggerimento su come farlo? XCUIElement non ha tale nozione come resignFirstResponder. – Rayfleck

+0

app.keyboards.buttons ["Nascondi tastiera"]. Tap() – Rayfleck

+0

Credo che sia possibile toccare la tastiera per nasconderlo. Qualcosa come app.tap() o app.swipeDown() dovrebbe farlo. – caffeinum

1

Accertarsi che la tastiera sia spenta nel simulatore prima di eseguire i test.

Hardware-> Tastiera-> Connetti tastiera hardware.

quindi immettere il testo utilizzando la scheda di pasta

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

Perché il voto negativo? – 365SplendidSuns

10

Se avete impostato i vostri campi di testo a dimettersi firstResponder (sia via textField.resignFirstResponder() o self.view.endEditing(true)) nel metodo textFieldShouldReturn() delegato, quindi

textField.typeText("\n") 

lo farà.

3

Sulla base di una domanda per Joe's blog, ho un problema in cui, dopo un paio di basi sul simulatore le tastiere non riesce a nascondere con questo pezzo di codice:

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

Così, ho cambiato in: (grazie Joe)

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

Quello che cerco di fare qui rileva se gli alambicchi di tastiera aperti dopo toccare il pulsante nascondere, se è su, si digita una "\ n", che nel mio caso si chiude la tastiera troppo.

Anche questo è complicato, perché a volte il simulatore ha perso il focus della digitazione della tastiera e questo potrebbe far fallire il test, ma nella mia esperienza il tasso di errore è inferiore agli altri approcci che ho preso.

Spero che questo possa essere d'aiuto.

+0

Funzionante in tutti i casi –

2

Ho sempre usare questo per nascondere la tastiera di programmazione a Swift UITesting:

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

Non funziona per me su iPhone. Questo potrebbe essere solo l'iPad? –

+0

Il valore del tipo 'XCUIApplication' non ha un 'tastiera' membro. @charlieSeligman Il codice funziona nel dispositivo o il codice funziona solo per il simulatore? –

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