ios swift uitextview xcode-ui-testing

ios - La prueba de interfaz de usuario falla cuando escribe texto en una vista de texto cuando se ejecuta mediante un bot de Xcode



swift uitextview (6)

Tengo la siguiente prueba de XCTest UI que escribe texto en una vista de texto.

let textView = app.textViews.elementBoundByIndex(0) textView.tap() textView.typeText("Hello world")

Cuando se ejecuta como un bot de Xcode, muestra el siguiente error para la llamada typeText .

Afirmación: Fallo en la prueba de la interfaz de usuario - falló: se agotó el tiempo de espera para que se completara el evento clave

Curiosamente, cuando lo ejecuto manualmente desde Xcode en la misma computadora, la prueba pasa. Esta prueba también se aprobó en Xcode bot antes de actualizar a Xcode 7.1 / iOS 9.1. ¿Cuál puede ser la fuente del problema?

Aquí hay una demostración aislada con la prueba de la interfaz de usuario: https://github.com/exchangegroup/UITestTextViewDemo

Simulador de iOS 9.1, OS X 10.11.1 (15B42), Xcode 7.1 (7B91b), OS X Server 5.0.15 (15S4033)

Reportado a Apple.


Aparte de conectar el teclado de hardware, ninguna de estas cosas realmente funcionó para mí. Lo que funcionó fue apagar el protector de pantalla de la Mac y mostrar el modo de suspensión en la configuración del sistema. Mi sospecha es que el simulador funciona de manera extraña cuando la Mac está bloqueada o no tiene un monitor para dibujar.

Con esas dos configuraciones desactivadas, todavía tengo algunas fallas de prueba de IU aleatorias. Sin embargo, conectar monitores de hardware o compartir la pantalla para que el simulador se dibuje en la pantalla en algún lugar parece resolverlos.


Creo que el problema subyacente es que "Conectar teclado de hardware" está activado de forma predeterminada. Incluso si lo desactivas para el usuario principal, el usuario _xcsbuildd sigue utilizando el valor predeterminado. Pude resolver el problema agregando una acción de prueba previa al esquema con el siguiente script:

if [ `defaults read com.apple.iphonesimulator ConnectHardwareKeyboard` -eq 1 ] then defaults write com.apple.iphonesimulator ConnectHardwareKeyboard -bool false killall "Simulator" fi


Descubrí otra solución, ya que la propuesta por Konnor no me funcionaba: estaba teniendo muchos problemas al utilizar UITest en Xcode Bot, y el síntoma común era que las pruebas en el simulador llevaban mucho más tiempo que en el local. máquina, así que pensé que el usuario _xcsbuildd usado para ejecutar las pruebas de alguna manera se ralentizó.

Mi solución es simple: simplemente promocione al usuario _xcsbuildd para que sea un usuario "normal". Esto tiene otra ventaja: si lo desea, puede iniciar sesión con ese usuario y ver las pruebas que se ejecutan en el simulador durante la integración, ¡por lo que es más fácil de depurar!

Así es como lo hice:

sudo dscl . -create /Users/_xcsbuildd UserShell /bin/bash sudo dscl . -create /Users/_xcsbuildd FirstName Xcode sudo dscl . -create /Users/_xcsbuildd LastName Server sudo dscl . -create /Users/_xcsbuildd FullName "Xcode Server" sudo dscl . -create /Users/_xcsbuildd PrimaryGroupID 20

Luego cambia la contraseña con:

sudo dscl . -passwd /Users/_xcsbuildd

No pude hacer que el usuario apareciera en la ventana de inicio de sesión rápido, de todos modos debería ver un "otro usuario" donde puede insertar el nombre de usuario "_xcsbuildd" y la contraseña que eligió


Encontré una solución para mi caso y espero que también te sirva de ayuda.

En mi setUp() y tearDown() (parece redundante, lo sé) puse XCUIApplication().terminate() . Esto garantiza que la aplicación finalice antes de ejecutar la siguiente prueba y parece que está haciendo el trabajo.

override func setUp() { XCUIApplication().terminate() super.setUp() continueAfterFailure = false XCUIApplication().launch() } override func tearDown() { super.tearDown() XCUIApplication().terminate() }

Presenté un error con Apple, pero por el momento esto me está evitando el error que estaba viendo. ¡Espero que ayude!


Estoy usando xcode 8.2.1 y ejecutando pruebas en las versiones de ios 9.3. Un truco simple es agregar un descanso durante 2-5 segundos después de tocar el cuadro de texto y antes de escribirlo. Sin embargo, esto no es una solución permanente.

Otra solucion confiable

Anule la selección de todas las preferencias de teclado en la configuración antes de ejecutar las pruebas.

"KeyboardAllowPaddle": false, "KeyboardAssistant": false, "KeyboardAutocapitalization": false, "KeyboardAutocorrection": false, "KeyboardCapsLock": false, "KeyboardCheckSpelling": false, "KeyboardPeriodShortcut": false, "KeyboardPrediction": false, "KeyboardShowPredictionBar": false


Me encontré con este problema también. He escrito una prueba de interfaz de usuario para capturar capturas de pantalla con Snapshot (fastlane) y funciona bien en un simulador de iPad Air y Pro. Sin embargo, en un iPad Retina o simulador de iPad 2 recibo este mensaje de error, ya sea que se ejecuta desde la línea de comandos o directamente desde Xcode.

Una solución en mi caso fue agregar algunas funciones sleep () entre las declaraciones typeText () y el error desapareció.

Edición : esto solo corrige la ejecución manual desde Xcode, a través de la línea de comandos, todavía causa un error de prueba. También noté que funciona en todos los simuladores para dispositivos de 64 bits, pero no en dispositivos anteriores.

Edición 2 : encontré una forma de solucionar este problema utilizando el simulador de iOS 9.0 en lugar de iOS 9.3, como se menciona en esta respuesta: https://.com/a/36334816/5334132 . Esto parece una buena solución hasta que se soluciona en una nueva versión de Xcode.