Error de testing de interfaz de usuario: ninguno de los elementos ni ningún descendiente tiene foco de keyboard en secureTextField

Este es mi caso:

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

Error de testing de interfaz de usuario: ninguno de los elementos ni ningún descendiente tiene foco de keyboard. Elemento:

¿Qué está mal? Esto funciona bien para textFields normales, pero el problema surge solo con secureTextFields . ¿Alguna solución?

Este problema me causó un mundo de dolor, pero he logrado encontrar una solución adecuada. En el Simulador, asegúrese de que 'Hardware -> Teclado -> Conectar el keyboard de hardware' esté desactivado.

Recientemente encontramos un truco para hacer que la solución de la respuesta aceptada persistente. Para deshabilitar la configuration del Simulador: 'Hardware -> Teclado -> Conectar el keyboard de hardware' desde la línea de command, uno debe escribir:

 defaults write com.apple.iphonesimulator ConnectHardwareKeyboard 0 

No afectará a un simulador que se esté ejecutando; debe reiniciar el simulador o iniciar uno nuevo para que esa configuration tenga su efecto.

He escrito una pequeña extensión (Swift) que funciona perfecto para mí. Aquí está el código:

 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)) } } } 

La idea principal es seguir tocando un elemento (campo de text) antes de que se presente el keyboard.

Stanislav tiene la idea correcta.

En un entorno de equipo, necesita algo que funcione automáticamente. He encontrado una solución aquí en mi blog.

Básicamente solo pega:

 UIPasteboard.generalPasteboard().string = "Their password" let passwordSecureTextField = app.secureTextFields["password"] passwordSecureTextField.pressForDuration(1.1) app.menuItems["Paste"].tap() 

Ocurrió conmigo muchas veces. Tienes que deshabilitar el hardware del keyboard y el mismo layout que OSX en tu simulador

Hardware / Teclado (deshabilitar todo)

Después de que el software de keyboard no descarte y sus testings pueden escribir text

Deshabilitar hardware

 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() } 

Grabe la caja como quiera, quiero decir con el keyboard o sin el keyboard conectado. Pero haga lo siguiente cuando juegue la testing.

introduzca la descripción de la imagen aquí

Esta opción (conectar el keyboard de hardware) debe desmarcarse mientras se reproduce la testing.

Use una suspensión entre iniciar la aplicación y escribir datos en campos de text como este:

 sleep(2) 

En mi caso, seguía recibiendo este error cada vez y solo esta solución me ayudó.

Esto puede ayudar: Acabo de agregar una acción de "toque" antes del error; eso es todo 🙂

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

[ Repostando el comentario de Bartłomiej Semańczyk como una respuesta porque resolvió el problema por mí]

Necesitaba hacer Simulator> Restablecer contenido y configuration en la barra de menu del simulador para que esto comience a funcionar para mí.

Su primera línea es solo una definición de consulta , lo que no significa que existiera realmente passwordSecureTextField .

Su segunda línea ejecutará dinámicamente la consulta e intentará (re) enlazar la consulta al elemento UI. Debe colocar un punto de interrupción en él y verificar que se encuentre un solo elemento. O solo usa una afirmación:

 XCTAssertFalse(passwordSecureTextField.exists); 

De lo contrario, se ve bien, tap debería forzar el keyboard visible y luego typeText debería funcionar. El logging de errores debería decirle más información.

No se desorderó, Hubo un problema que llamó la atención porque está registrado su time de testing, su aplicación conectará el keyboard de hardware mientras que su simulador de time de testing automático solo toma el keyboard del software. así que para saber cómo solucionar estos problemas. Simplemente use el keyboard del software en su time de grabación. Puedes ver la magia.

El problema para mí fue el mismo que para Ted. En realidad, si el campo de contraseña se toca después del campo de inicio de session y el hardware KB está activado, el keyboard del software se descartará en el segundo toque de campo y no es específico de las testings de interfaz de usuario.

Después de un time jugando con AppleScript, he aquí lo que se me ocurrió (las mejoras son bienvenidas):

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

Cree un file de script con el código anterior y agréguelo a los objectives necesarios (probablemente el objective de las testings de interfaz de usuario solo sea posible, puede agregar un script similar a sus objectives de desarrollo para volver a habilitar el keyboard de HW durante el desarrollo). Debe agregar la fase Run Script en las fases de compilation y usarla de la siguiente manera: osascript Path/To/Script/script_name.applescript

Encontramos el mismo error al establecer el valor accessibilityIdentifier para una vista personalizada (subclass UIStackView ) que contiene UIControl UIControl. En ese caso XCTest no pudo get el foco del keyboard para los elementos descendientes.

Nuestra solución fue simplemente eliminar el accessibilityIdentifier de nuestra vista primaria y establecer el accessibilityIdentifier para las subvenciones mediante properties dedicadas.

Tuvo el mismo problema con Securetextfields. La opción de connection de hardware en mi simulador fue de, pero aún se topó con el problema. Finalmente, esto funcionó para mí (Swift 3):

  let enterPasswordSecureTextField = app.secureTextFields["Enter Password"] enterPasswordSecureTextField.tap() enterPasswordSecureTextField.typeText("12345678")