Das ist mein Fall:
let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.tap()
passwordSecureTextField.typeText("wrong_password") //here is an error
Fehler beim Testen der Benutzeroberfläche - Weder ein Element noch ein Nachkomme hat einen Tastaturfokus. Element:
Was ist falsch? Dies funktioniert gut für normal textFields
, aber Probleme treten nur bei secureTextFields
. Problemumgehungen?
Antworten:
Dieses Problem verursachte mir eine Welt voller Schmerzen, aber ich habe es geschafft, eine richtige Lösung zu finden. Stellen Sie im Simulator sicher, dass "Hardware -> Tastatur -> Hardware-Tastatur verbinden" deaktiviert ist.
quelle
Kürzlich haben wir einen Hack gefunden, um die Lösung aus akzeptierten Antworten dauerhaft zu machen. Um die Simulatoreinstellung zu deaktivieren: 'Hardware -> Tastatur -> Hardware-Tastatur verbinden' über die Befehlszeile sollte Folgendes geschrieben werden:
Ein laufender Simulator ist davon nicht betroffen. Sie müssen den Simulator neu starten oder einen neuen starten, damit sich diese Einstellung auswirkt.
quelle
defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool true
, aber es ist das gleiche Konzept.killall "Simulator"; defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0;
Ich habe eine kleine Erweiterung (Swift) geschrieben, die perfekt für mich funktioniert. Hier ist der Code:
Die Hauptidee besteht darin, weiterhin auf ein Element (Textfeld) zu tippen, bevor die Tastatur angezeigt wird.
quelle
Stanislav hat die richtige Idee.
In einer Teamumgebung benötigen Sie etwas, das automatisch funktioniert. Ich habe hier in meinem Blog eine Lösung gefunden .
Grundsätzlich fügen Sie einfach ein:
quelle
Eine weitere Ursache für diesen Fehler ist eine übergeordnete Ansicht des Textfelds, in das Sie versuchen, Text einzugeben, der als Eingabehilfenelement festgelegt ist (
view.isAccessibilityElement = true
). In diesem Fall kann XCTest die Unteransicht nicht handhaben, um den Text einzugeben, und gibt den Fehler zurück.Es ist nicht so, dass kein Element den Fokus hat (wie Sie oft sehen können, wie die Tastatur im UITextField nach oben zeigt und der Cursor blinkt), sondern nur, dass kein Element, das es erreichen kann, den Fokus hat. Ich bin darauf gestoßen, als ich versucht habe, Text in eine UISearchBar einzugeben. Die Suchleiste selbst ist nicht das Textfeld. Wenn Sie sie als Eingabehilfenelement festlegen, wurde der Zugriff auf das zugrunde liegende UITextField blockiert. Um dies zu beheben,
searchBar.accessibilityIdentifier = "My Identifier"
wurde auf gesetzt,UISearchBar
jedochisAccessibilityElement
wurde das nicht auf gesetzttrue
. Danach Testcode des Formulars:Funktioniert
quelle
Es kam mir viele Male vor. Sie müssen die Tastaturhardware und das gleiche Layout wie OSX in Ihrem Simulator deaktivieren
Hardware / Tastatur (alle deaktivieren)
Danach wird die Tastatursoftware nicht mehr geschlossen und Ihre Tests können Text eingeben
quelle
Verwenden Sie einen Ruhezustand zwischen dem Starten der App und dem Eingeben von Daten in Textfelder wie folgt:
In meinem Fall bekam ich jedes Mal diesen Fehler und nur diese Lösung half mir.
quelle
Dies kann vielleicht helfen: Ich füge vor dem Fehler einfach eine "Tap" -Aktion hinzu. das ist alles :)
quelle
quelle
Nehmen Sie den Fall auf, wie Sie möchten, Tastatur oder ohne Tastatur. Führen Sie jedoch die folgenden Schritte aus, bevor Sie den Test spielen.
Diese folgende Option (Hardware-Tastatur anschließen) sollte während des Testspiels deaktiviert sein.
quelle
In meinem Fall hat diese
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Deaktivierung bei mir nicht funktioniert.Aber als ich folgte
1)
Hardware -> Keyboard -> Connect Hardware Keyboard
-> App aktivieren und ausführen2)
Hardware -> Keyboard -> Connect Hardware Keyboard
-> Deaktivieren .Es hat bei mir funktioniert
quelle
[Reposting Bartłomiej Semańczyks Kommentar als Antwort, weil er das Problem für mich gelöst hat]
Ich musste Simulator> Inhalt und Einstellungen zurücksetzen in der Simulator-Menüleiste ausführen, damit dies für mich funktioniert.
quelle
Manchmal werden Textfelder nicht als Textfelder implementiert oder in ein anderes UI-Element eingeschlossen und sind nicht leicht zugänglich. Hier ist eine Lösung:
quelle
Ihre erste Zeile ist nur eine Abfragedefinition , was nicht bedeutet, dass
passwordSecureTextField
diese tatsächlich existieren würde.Ihre zweite Zeile führt die Abfrage dynamisch aus und versucht, die Abfrage (erneut) an das UI-Element zu binden. Sie sollten einen Haltepunkt darauf setzen und sicherstellen, dass nur ein Element gefunden wird. Oder verwenden Sie einfach eine Behauptung:
Ansonsten sieht es ok aus,
tap
sollte die Tastatur sichtbar machen und danntypeText
einfach funktionieren. Das Fehlerprotokoll sollte Ihnen weitere Informationen geben.quelle
passwordSecureTextField
existiert. Ich habe das Problem behoben, aber den Speicher bereinigt und diese Zeilen erneut geschrieben. Seltsam, aber es hat funktioniert.tap
für mich aufgenommen, es hat einige Zeit gedauert, es herauszufinden. Gute Debug-Praxis!Nicht durcheinander bringen. Das Problem ist darauf zurückzuführen, dass Sie Ihre Testzeit aufgezeichnet haben. Ihre App verbindet die Hardwaretastatur, während Ihr automatischer Testzeitsimulator nur die Softwaretastatur verwendet. Also, wie man diese Probleme behebt. Verwenden Sie einfach die Software-Tastatur für Ihre Aufnahmezeit. Sie können die Magie sehen.
quelle
Das Problem war für mich das gleiche wie für Ted. Wenn das Kennwortfeld nach dem Anmeldefeld getippt wird und die Hardware-KB aktiviert ist, wird sich die Softwaretastatur beim zweiten Tippen auf das Feld selbst schließen und ist nicht spezifisch für UI-Tests.
Nach einiger Zeit mit AppleScript habe ich mir Folgendes ausgedacht (Verbesserungen sind willkommen):
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
Erstellen Sie eine Skriptdatei mit dem obigen Code und fügen Sie sie den erforderlichen Zielen hinzu (wahrscheinlich nur UI-Testziele. Möglicherweise möchten Sie Ihren Entwicklungszielen ein ähnliches Skript hinzufügen, um die HW-Tastatur während der Entwicklung wieder zu aktivieren). Sie sollten
Run Script
Phase in Build-Phasen hinzufügen und wie folgt verwenden:osascript Path/To/Script/script_name.applescript
quelle
Beim Festlegen des
accessibilityIdentifier
Werts für eine benutzerdefinierte Ansicht (UIStackView
Unterklasse) mitUIControl
Unteransichten ist der gleiche Fehler aufgetreten. In diesem Fall konnte XCTest den Tastaturfokus für die untergeordneten Elemente nicht ermitteln.Unsere Lösung bestand einfach darin, das
accessibilityIdentifier
aus unserer übergeordneten Ansicht zu entfernen und dasaccessibilityIdentifier
für die Unteransichten über dedizierte Eigenschaften festzulegen.quelle
Eine andere Antwort, aber für uns war das Problem, dass die Ansicht einer anderen Ansicht zu nahe kam, als dass ein Gestenerkenner darauf. Wir haben festgestellt, dass die Ansicht mindestens 20 Pixel entfernt sein muss (in unserem Fall unten). Im wahrsten Sinne des Wortes haben 15 nicht funktioniert und 20 oder mehr. Ich gebe zu, dass dies seltsam ist, aber wir hatten einige UITextViews, die funktionierten, und einige, die nicht funktionierten und alle unter derselben übergeordneten und identischen anderen Positionierung waren (und natürlich Variablennamen). Das Ein- und Ausschalten der Tastatur oder was auch immer machte keinen Unterschied. Zugänglichkeit zeigte die Felder. Wir haben unsere Computer neu gestartet. Wir haben sauber gebaut. Frische Quellenkassen.
quelle
Was dieses Problem für mich behoben hat, war das Hinzufügen eines Schlafes von 1 Sekunde:
quelle
Ich bin auf dieses Problem gestoßen und konnte es in meinem Szenario beheben, indem ich die von @AlexDenisov veröffentlichte Lösung nahm und sie zu meinen Voraktionen für run & test hinzufügte .
quelle
Keine Notwendigkeit, die Tastatur in der E / A ein- oder auszuschalten. Verwenden Sie .typeText nicht für SecureTextField, sondern nur
Bonus: Sie erhalten einen Klick auf die Tastatur :)
quelle
Schließlich habe ich ein Skript geschrieben, das die .plist-Datei des Simulators bearbeitet und die
ConnectHardwareKeyboard
Eigenschaft für den ausgewählten Simulator auf false setzt . Sie haben es richtig gehört, es ändert die Eigenschaft für den speziell ausgewählten Simulator im Wörterbuch "DevicePreferences", anstatt die globale Eigenschaft zu bearbeiten.Erstellen Sie zunächst ein Shell-Skript mit dem Namen disable-hardware-keyboard.sh mit den folgenden Inhalten. Sie können es in "YourProject / xyzUITests / Scripts /" platzieren:
Führen Sie nun die folgenden Schritte aus, um das udid des ausgewählten Simulators als Argument zu übergeben:
Skript in Test> Voraktionen:
Zeit, es zu testen:
quelle
Hatte das gleiche Problem mit Securetextfields. Die Verbindungshardwareoption in meinem Simulator war von, stieß aber immer noch auf das Problem. Schließlich funktionierte dies für mich (Swift 3):
quelle