To jest moja sprawa:
let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.tap()
passwordSecureTextField.typeText("wrong_password") //here is an error
Niepowodzenie testowania interfejsu użytkownika - ani element, ani element podrzędny nie mają fokusu na klawiaturze. Element:
Co jest nie tak? Działa to normalnie textFields
, ale problem pojawia się tylko w przypadku secureTextFields
. Jakieś obejścia?
Odpowiedzi:
Ten problem sprawił mi wiele bólu, ale udało mi się znaleźć właściwe rozwiązanie. W symulatorze upewnij się, że opcja „Sprzęt -> Klawiatura -> Podłącz klawiaturę sprzętową” jest wyłączona.
źródło
Niedawno znaleźliśmy sposób, aby utrwalić rozwiązanie z zaakceptowanej odpowiedzi. Aby wyłączyć ustawienie symulatora: „Sprzęt -> Klawiatura -> Podłącz klawiaturę sprzętową” z linii poleceń należy wpisać:
Nie wpłynie to na uruchomiony symulator - musisz zrestartować symulator lub uruchomić nowy, aby to ustawienie odniosło skutek.
źródło
defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool true
, że to ta sama koncepcja.killall "Simulator"; defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0;
Napisałem małe rozszerzenie (Swift), które działa idealnie dla mnie. Oto kod:
Główną ideą jest ciągłe dotykanie elementu (pola tekstowego) przed wyświetleniem klawiatury.
źródło
Stanislav ma dobry pomysł.
W środowisku zespołowym potrzebujesz czegoś, co zadziała automatycznie. Tutaj, na moim blogu, znalazłem poprawkę .
Zasadniczo wystarczy wkleić:
źródło
Inną przyczyną tego błędu jest występowanie nadrzędnego widoku pola tekstowego, w którym próbujesz wprowadzić tekst, który jest ustawiony jako element ułatwień dostępu (
view.isAccessibilityElement = true
). W takim przypadku XCTest nie jest w stanie uzyskać uchwytu widoku podrzędnego, aby wprowadzić tekst i zwraca błąd.Nie chodzi o to, że żaden element nie ma fokusu (jak często można zobaczyć podniesioną klawiaturę i migający kursor w UITextField), po prostu żaden element, do którego może dotrzeć, nie ma fokusu. Natknąłem się na to, próbując wprowadzić tekst w UISearchBar. Sam pasek wyszukiwania nie jest polem tekstowym, podczas ustawiania go jako elementu dostępności, dostęp do bazowego UITextField został zablokowany. Aby rozwiązać ten problem,
searchBar.accessibilityIdentifier = "My Identifier"
ustawiono,UISearchBar
aleisAccessibilityElement
nie ustawionotrue
. Następnie przetestuj kod formularza:Pracuje
źródło
Zdarzyło mi się to wiele razy. Musisz wyłączyć sprzęt klawiatury i taki sam układ jak OSX w swoim symulatorze
Sprzęt / klawiatura (wyłącz wszystkie)
Po tym oprogramowanie klawiatury nie zostanie odrzucone, a testy będą mogły wpisywać tekst
źródło
Użyj trybu uśpienia między uruchomieniem aplikacji a wpisywaniem danych w polach tekstowych, takich jak to:
W moim przypadku za każdym razem otrzymywałem ten błąd i tylko to rozwiązanie pomogło mi.
źródło
To może pomóc: po prostu dodaję akcję „stuknij” przed błędem; to wszystko :)
źródło
źródło
Nagrywaj obudowę, jak chcesz, klawiatura lub bez podłączonej klawiatury. Ale przed rozpoczęciem testu wykonaj następujące czynności.
Ta następująca opcja (podłącz klawiaturę sprzętową) powinna być odznaczona podczas odtwarzania testu.
źródło
W moim przypadku to
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Disable nie działało dla mnie.Ale kiedy poszedłem za nim
1)
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Włączone i uruchom aplikację2)
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Wyłącz .U mnie to zadziałało
źródło
[Ponowne zamieszczenie komentarza Bartłomieja Semańczyka jako odpowiedzi, ponieważ rozwiązało to za mnie problem]
Musiałem zrobić Symulator> Resetuj zawartość i ustawienia na pasku menu symulatora, aby to zaczęło działać dla mnie.
źródło
Czasami pola tekstowe nie są implementowane jako pola tekstowe lub są opakowane w inny element interfejsu użytkownika i nie są łatwo dostępne. Oto obejście:
źródło
Twoja pierwsza linia to tylko definicja zapytania , co nie oznacza,
passwordSecureTextField
że faktycznie istniałaby.Twoja druga linia dynamicznie wykona zapytanie i spróbuje (ponownie) powiązać zapytanie z elementem UI. Powinieneś umieścić na nim punkt przerwania i sprawdzić, czy został znaleziony jeden i tylko jeden element. Lub po prostu użyj potwierdzenia:
W przeciwnym razie wygląda dobrze,
tap
powinno wymusić widoczność klawiatury, a następnietypeText
powinno działać. Dziennik błędów powinien zawierać więcej informacji.źródło
passwordSecureTextField
istnieje. Naprawiłem problem, ale wyczyściłem pamięć i przepisałem te linie ponownie. Dziwne, ale zadziałało.tap
dla mnie, zajęło trochę czasu, zanim to rozgryzłem. Dobra praktyka debugowania!Nie zawracaj sobie głowy, wykryto problem, ponieważ został zarejestrowany czas testowania, w którym aplikacja połączy klawiaturę sprzętową, podczas gdy automatyczny symulator czasu testowania wymaga tylko klawiatury programowej. więc jak rozwiązać ten problem. Po prostu użyj klawiatury programowej do czasu nagrywania. możesz zobaczyć magię.
źródło
Dla mnie problem był taki sam jak dla Teda. W rzeczywistości, jeśli pole hasła zostanie dotknięte po polu logowania, a sprzętowa baza danych jest włączona, klawiatura programowa zlikwiduje się po dotknięciu drugiego pola i nie jest to specyficzne dla testów interfejsu użytkownika.
Po pewnym czasie mieszania z AppleScript, oto co wymyśliłem (ulepszenia są mile widziane):
tell application "Simulator" activate tell application "System Events" try tell process "Simulator" tell menu bar 1 tell menu bar item "Hardware" tell menu "Hardware" tell menu item "Keyboard" tell menu "Keyboard" set menuItem to menu item "Connect Hardware Keyboard" tell menu item "Connect Hardware Keyboard" set checkboxStatus to value of attribute "AXMenuItemMarkChar" of menuItem if checkboxStatus is equal to "✓" then click end if end tell end tell end tell end tell end tell end tell end tell on error tell application "System Preferences" activate set securityPane to pane id "com.apple.preference.security" tell securityPane to reveal anchor "Privacy_Accessibility" display dialog "Xcode needs Universal access to disable hardware keyboard during tests(otherwise tests may fail because of focus issues)" end tell end try end tell end tell
Utwórz plik skryptu z powyższym kodem i dodaj go do niezbędnych celów (prawdopodobnie tylko dla testów interfejsu użytkownika, możesz chcieć dodać podobny skrypt do celów programistycznych, aby ponownie włączyć klawiaturę sprzętową podczas programowania). Należy dodać
Run Script
fazę w fazach kompilacji i używać jej w następujący sposób:osascript Path/To/Script/script_name.applescript
źródło
Napotkaliśmy ten sam błąd podczas ustawiania
accessibilityIdentifier
wartości dla widoku niestandardowego (UIStackView
podklasy) zawierającegoUIControl
podglądy. W takim przypadku XCTest nie był w stanie uzyskać fokusu klawiatury dla elementów potomnych.Nasze rozwiązanie polegało po prostu na usunięciu
accessibilityIdentifier
widoku nadrzędnego i ustawieniuaccessibilityIdentifier
podglądów podrzędnych za pośrednictwem dedykowanych właściwości.źródło
Inna odpowiedź, ale dla nas problem polegał na tym, że widok był zbyt zbliżony do innego widoku, który zawiera rozpoznawanie gestów. Okazało się, że potrzebujemy widoku oddalonego o co najmniej 20 pikseli (w naszym przypadku poniżej). Dosłownie 15 nie działało, a 20 lub więcej. Przyznaję, że to dziwne, ale mieliśmy kilka UITextViews, które działały, a niektóre, które nie działały, i wszystkie znajdowały się pod tym samym nadrzędnym i identycznym innym pozycjonowaniem (i oczywiście nazwami zmiennych). Klawiatura włączona, wyłączona czy cokolwiek innego nie robiło różnicy. Dostępność pokazała pola. Ponownie uruchomiliśmy nasze komputery. Zrobiliśmy czyste kompilacje. Kasy ze świeżych źródeł.
źródło
Rozwiązaniem tego problemu było dodanie 1 sekundy snu:
źródło
Natknąłem się na ten problem i udało mi się go naprawić w moim scenariuszu, biorąc rozwiązanie opublikowane przez @AlexDenisov i dodając je do moich działań wstępnych do uruchomienia i testu .
źródło
Nie ma potrzeby włączania / wyłączania klawiatury we / wy. Nie używaj .typeText dla secureTextField, po prostu użyj
Bonus: kliknięcie dźwięku klawiatury :)
źródło
Na koniec napisałem skrypt, który edytuje plik .plist symulatora i ustawia
ConnectHardwareKeyboard
właściwość na false dla wybranego symulatora. Słyszałeś to dobrze, zmienia właściwość specjalnie wybranego symulatora w słowniku „DevicePreferences” zamiast edytować właściwość globalną.Najpierw utwórz skrypt powłoki o nazwie disable-hardware-keyboard.sh z następującą zawartością. Możesz go umieścić w „YourProject / xyzUITests / Scripts /” .:
Teraz wykonaj następujące kroki, aby wywołać to z przekazaniem udid wybranego symulatora jako argumentu:
Skrypt w Test> Działania wstępne:
Czas to przetestować:
źródło
Miałem ten sam problem z Securetextfields. Opcja łączenia sprzętu w moim symulatorze była wyłączona, ale nadal występował problem. Wreszcie zadziałało to dla mnie (Swift 3):
źródło