2015-12-03 18 views
13

Właśnie rozpoczął testowanie UI w Xcode 7 i uderzyć ten problem:Jak ukryć klawiaturę w trakcie testowania aplikacji Swift UI

muszę wprowadzać tekst do pola tekstowego, a następnie kliknij przycisk. Niestety ten przycisk jest ukryty za klawiaturą, która pojawiła się podczas wprowadzania tekstu do pola tekstowego. XCode próbuje przewinąć, aby był widoczny, ale mój widok nie jest przewijany, więc nie działa.

Moje obecne rozwiązanie jest takie:

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

mogę tego zrobić, ponieważ mój ViewController jest przechwytywanie akcenty:

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

nie jestem bardzo zadowolony z mojego rozwiązania, jest jakiś inny sposób, jak ukryć klawiaturę podczas testowania interfejsu użytkownika?

+0

Jeśli u mają problem z klawiatura przycisk ukrywa, u można po prostu wcisnąć cały widok z 'setContentOffset' do przycisku jest widoczny, nie ma znaczenia, czy widok jest przewijany czy nie – Tj3n

+2

1.Jeśli nie możesz uzyskać dostępu do przycisku, gdy klawiatura jest widoczna, czy nie jest to problem z UX? 2. To są tylko testy. Oczekuje się, że testy będą miały hakowaty kod, więc nie widzę tutaj twojego problemu. Po prostu zostaw to, jeśli działa. –

Odpowiedz

2

Odpowiedź na twoje pytanie nie leży w kodzie testowym, ale w kodzie aplikacji. Jeśli użytkownik nie może wprowadzić tekstu za pomocą klawiatury programowej na ekranie, a następnie dotknij przycisku, należy albo odrzucić test klawiatury (tak jak użytkownik musi, aby dotknąć przycisku), albo przewinąć widok .

+0

"spraw, aby test został odrzucony z klawiatury" - Czy masz jakieś sugestie, jak to osiągnąć? XCUIElement nie ma takiego pojęcia jak resignFirstResponder. – Rayfleck

+0

app.keyboards.buttons ["Ukryj klawiaturę"] stuknij() – Rayfleck

+0

Wierzę, że możesz stuknąć od klawiatury, aby ją ukryć. Coś takiego jak app.tap() lub app.swipeDown() powinno to zrobić. – caffeinum

1

Tylko upewnij się, że klawiatura jest wyłączona w symulatorze przed uruchomieniem testów.

Sprzęt-> Klawiatura-> Podłącz klawiaturę sprzętową.

Następnie należy wprowadzić tekst za pomocą płytę pasty

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

Dlaczego głosowanie w dół? – 365SplendidSuns

10

Jeśli skonfigurować pól tekstowych do dymisji FirstResponder (albo poprzez textField.resignFirstResponder() lub self.view.endEditing(true)) W sposobie textFieldShouldReturn() delegata, a następnie

textField.typeText("\n") 

zrobi to.

3

oparta na pytanie Joe's blog, mam problem, który po kilku seriach na symulatorze Klawiatury nie powiedzie się ukryć stosując ten kawałek kodu:

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

Tak, zmieniłem go na adres: (dzięki Joe)

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

Co staram się zrobić tutaj jest wykrycie czy fotosy klawiatury otwarte po dotknij przycisk hide, jeśli jest ona w górę, wpisuję „\ n”, która w moim przypadku zamyka klawiaturę też.

To również jest trudne, ponieważ czasami symulator stracił ostrość pisania na klawiaturze, co może sprawić, że test się nie powiedzie, ale z mojego doświadczenia wynika, że ​​wskaźnik niepowodzenia jest niższy niż w przypadku innych podejść, jakie podjąłem.

Mam nadzieję, że to może pomóc.

+0

Działa dobrze we wszystkich przypadkach –

2

Zawsze używam tego programowo ukryć klawiaturę w Swift UITesting:

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

Nie działa dla mnie na iPhone'a. Czy to może być tylko iPad? –

+0

Wartość typu "XCUIApplication" nie ma członka "klawiatura". @charlieSeligman Czy kod działa w urządzeniu lub kod działa tylko na symulatorze? –

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