it-swarm.com.de

UI-Testfehler - Weder das Element noch ein Nachkomme hat den Tastaturfokus auf secureTextField

Das ist mein Fall:

let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.tap()
passwordSecureTextField.typeText("wrong_password") //here is an error

UI-Testfehler - Weder das Element noch ein Nachkomme hat den Tastaturfokus. Element:

Was ist falsch? Dies funktioniert Nizza für normale textFields, aber Probleme treten nur bei secureTextFields auf. Irgendwelche Problemumgehungen?

Dieses Problem bereitete mir eine Welt voller Schmerzen, aber ich habe eine richtige Lösung gefunden. Stellen Sie im Simulator sicher, dass "Hardware -> Tastatur -> Hardwaretastatur anschließen" deaktiviert ist.

163
Ted Kaminski

Vor kurzem haben wir einen Hack gefunden, um die Lösung aus der akzeptierten Antwort beständig zu machen. Um die Simulator-Einstellung zu deaktivieren: 'Hardware -> Tastatur -> Hardware-Tastatur anschließen' von der Befehlszeile aus sollte man schreiben:

defaults write com.Apple.iphonesimulator ConnectHardwareKeyboard 0

Dies wirkt sich nicht auf einen laufenden Simulator aus. Sie müssen den Simulator neu starten oder einen neuen starten, damit die Einstellung wirksam wird.

14
AlexDenisov

Ich habe eine kleine Erweiterung (Swift) geschrieben, die perfekt für mich funktioniert ..__ Hier ist der Code:

extension XCTestCase {

    func tapElementAndWaitForKeyboardToAppear(element: XCUIElement) {
        let keyboard = XCUIApplication().keyboards.element
        while (true) {
            element.tap()
            if keyboard.exists {
                break;
            }
            NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow: 0.5))
        }
    }
}

Die Hauptidee besteht darin, vor dem Anzeigen der Tastatur ein Element (Textfeld) zu berühren.

13

Stanislav hat die richtige Idee. 

In einer Teamumgebung benötigen Sie etwas, das automatisch funktioniert. Ich habe ein Update hier auf meinem Blog gemacht.

Im Grunde fügen Sie einfach ein:

UIPasteboard.generalPasteboard().string = "Their password"
let passwordSecureTextField = app.secureTextFields["password"]
passwordSecureTextField.pressForDuration(1.1)
app.menuItems["Paste"].tap()
11
RyanPliske
func pasteTextFieldText(app:XCUIApplication, element:XCUIElement, value:String, clearText:Bool) {
    // Get the password into the pasteboard buffer
    UIPasteboard.generalPasteboard().string = value

    // Bring up the popup menu on the password field
    element.tap()

    if clearText {
        element.buttons["Clear text"].tap()
    }

    element.doubleTap()

    // Tap the Paste button to input the password
    app.menuItems["Paste"].tap()
}
4
Anthony

Eine weitere Ursache für diesen Fehler liegt vor, wenn das Textfeld, in dem Sie versuchen, Text einzugeben, der als Eingabehilfenelement (view.isAccessibilityElement = true) festgelegt ist, eine übergeordnete Ansicht enthält. In diesem Fall kann XCTest keinen Zugriff auf die Unteransicht erhalten, um den Text einzugeben, und der Fehler wird zurückgegeben.

UI-Testfehler - Weder das Element noch ein Nachkomme hat die Tastatur Fokus.

Es ist nicht so, dass kein Element den Fokus hat (da Sie oft die Tastatur nach oben und den blinkenden Cursor im UITextField sehen können), es ist nur so, dass kein Element kann es erreichen den Fokus hat. Beim Versuch, Text in eine UISearchBar einzugeben, bin ich darauf gestoßen. Die Suchleiste selbst ist nicht das Textfeld, wenn der Zugriff auf das zugrunde liegende UITextField als barrierefreies Element festgelegt wurde. Um dies zu beheben, wurde searchBar.accessibilityIdentifier = "My Identifier" für UISearchBar festgelegt, jedoch wurde isAccessibilityElement nicht auf true gesetzt. Testen Sie danach den Code des Formulars:

app.otherElements["My Identifier"].tap()
app.otherElements["My Identifier"].typeText("sample text")

Arbeitet

4
user3847320

Bei mir ist es oft vorgekommen. Sie müssen die Tastaturhardware und das gleiche Layout wie OSX in Ihrem Simulator deaktivieren

Hardware/Tastatur (alle deaktivieren)

Danach wird die Tastatursoftware nicht gelöscht und Ihre Tests können Text eingeben

 Disable Hardware

4

Verwenden Sie einen Ruhezustand zwischen dem Starten der App und dem Eingeben von Daten in Textfeldern wie folgt:

sleep(2)

In meinem Fall bekam ich diesen Fehler immer wieder und nur diese Lösung half mir.

4
Kingalione

Dies hilft möglicherweise: Ich füge vor dem Fehler nur eine "Tippen" -Aktion hinzu; das ist alles :)

[app.textFields[@"theTitle"] tap];
[app.textFields[@"theTitle"] typeText:@"kk"];
3
Carlos Peralta

Nimm den Fall auf, wie du willst, Tastatur oder ohne angeschlossene Tastatur.

Diese folgende Option (Hardware-Tastatur anschließen) sollte während des Tests deaktiviert sein.

 enter image description here

3
umairhhhs

[Reposting Kommentar von Bartłomiej Semańczyk 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.

2
rogueleaderr

Eine andere Antwort, aber für uns war das Problem, dass die Ansicht zu nahe an einer anderen Ansicht war, die ein Gestenerkenner darauf zeigt. Die Ansicht sollte mindestens 20 Pixel entfernt sein (in unserem Fall unten). Wörtlich arbeiteten 15 nicht und 20 oder mehr. Das ist seltsam, ich gebe zu, aber wir hatten einige UITextViews, die funktionierten und einige, die nicht waren und alle unter demselben Elternteil und identischen anderen Positionierungen (und natürlich Variablennamen) waren. Die Tastatur ein oder aus oder was auch immer machte keinen Unterschied. Zugänglichkeit zeigte die Felder. Wir haben unsere Computer neu gestartet. Wir haben saubere Builds gemacht. Frische Quellkassen. 

0
David J

Das Problem war für mich dasselbe wie für Ted. Wenn das Kennwortfeld nach dem Anmeldefeld und der aktivierten Hardware-KB abgetastet wird, wird die Softwaretastatur beim zweiten Feld abgetastet und ist nicht spezifisch für UI-Tests.

Nachdem ich einige Zeit mit AppleScript herumgespielt hatte, habe ich Folgendes herausgefunden (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 zu den erforderlichen Zielen hinzu (wahrscheinlich nur UI-Tests, nur Ziel, Sie möchten möglicherweise ein ähnliches Skript zu Ihren Entwicklungszielen hinzufügen, um die HW-Tastatur während der Entwicklung wieder zu aktivieren.) . Sie sollten Run Script Phase in Build-Phasen und verwenden Sie es wie folgt: osascript Path/To/Script/script_name.applescript

0
Timur Kuchkarov

Manchmal werden Textfelder nicht als Textfelder implementiert oder sie sind in ein anderes Oberflächenelement eingebettet und nicht leicht zugänglich. Hier ist eine Arbeit um:

//XCUIApplication().scrollViews.otherElements.staticTexts["Email"] the locator for the element
RegistrationScreenStep1of2.emailTextField.tap()
let keys = app.keys
 keys["p"].tap() //type the keys that you need
 
 //If you stored your data somewhere and need to access that string //you can cats your string to an array and then pass the index //number to key[]
 
 let newUserEmail = Array(newPatient.email())
 let password = Array(newPatient.password)
 
 //When you cast your string to an array the elements of the array //are Character so you would need to cast them into string otherwise //Xcode will compain. 
 
 let keys = app.keys
     keys[String(newUserEmail[0])].tap()
     keys[String(newUserEmail[1])].tap()
     keys[String(newUserEmail[2])].tap()
     keys[String(newUserEmail[3])].tap()
     keys[String(newUserEmail[4])].tap()
     keys[String(newUserEmail[5])].tap()       

0
Eugene Berezin

Ihre erste Zeile ist nur eine Abfragedefinition , was nicht bedeutet, dass passwordSecureTextField tatsächlich existieren würde.

Ihre zweite Zeile führt dynamisch die Abfrage aus und versucht, die Abfrage an das Oberflächenelement (erneut) zu binden. Sie sollten einen Haltepunkt darauf setzen und sicherstellen, dass nur ein Element gefunden wird. Oder verwenden Sie einfach eine Zusicherung:

XCTAssertFalse(passwordSecureTextField.exists);

Ansonsten sieht es ok aus, tap sollte die Tastatur sichtbar machen und typeText sollte funktionieren. Das Fehlerprotokoll sollte mehr Informationen enthalten.

0
JOM

Der gleiche Fehler ist beim Festlegen des accessibilityIdentifier-Werts für eine benutzerdefinierte Ansicht (UIStackView-Unterklasse) mit UIControl-Unteransichten aufgetreten. In diesem Fall konnte XCTest den Tastaturfokus für die untergeordneten Elemente nicht ermitteln.

Unsere Lösung bestand einfach darin, die accessibilityIdentifier aus unserer übergeordneten Ansicht zu entfernen und die accessibilityIdentifier für die Unteransichten durch dedizierte Eigenschaften festzulegen. 

0
shadowhorst

Was dieses Problem für mich behoben hat, war das Hinzufügen eines 1-Sekunden-Schlafes:

let textField = app.textFields["identifier"]
textField.tap()
sleep(1)
textField.typeText(text)

Nicht vermasselt, Es ist ein Problem aufgetreten, der Grund ist, dass Sie Ihre Testzeit aufgezeichnet haben, während Ihre App die Hardwaretastatur anschließt, während der Simulator für die automatische Testzeit nur die Softwaretastatur benötigt. So wie Sie diese Probleme beheben können. Verwenden Sie einfach die Software-Tastatur für Ihre Aufnahmezeit. Sie können die Magie sehen.

0
codercat