¿Cómo enviar eventos clave a un emulador sin cabeza en una prueba de instrumentación?
Actualmente estamos trabajando en una suite de pruebas de instrumentación que se ejecuta en nuestro servidor de compilación, pero mientras las pruebas pasan en una máquina de dev usando un emulador normal de Android, las compilaciones fallan en el servidor de compilación ya que solo ejecutamos un emulador sin cabeza con el -no-window
bandera de la -no-window
.
El error se produce al intentar invocar el método InstrumentationTestCase.sendKeys()
para abrir mediante programación el menú de opciones. El error es:
- Prueba de unidad automatizada para Android / Ant
- ApplicationTestCase obsoleto en el nivel 24 de API
- Prueba onActivityResult ()
- ¿Cómo probar una ListActivity burlándose de su contentProvider y así aislar la prueba de la base de datos?
- ¿Cómo crear sombras personalizadas en robolectric 3.0?
Permiso denegado: inyección de evento clave de pid 646 uid 10026 a ventana Ventana {43d55100 paused = false} propiedad de uid 1000
A continuación, descubrimos que hay un permiso de INJECT_EVENTS
, pero establecerlo en el manifiesto no tuvo ningún efecto. De hecho en el registro vimos esta salida:
No concediendo permiso android.permission.INJECT_EVENTS al paquete com.qype.radar (protectionLevel = 2 flags = 0x6644)
¿Significa esto que este permiso es inútil?
También intentamos dejar que la aplicación de prueba de instrumentación y la aplicación bajo prueba compartan el mismo ID de usuario de Linux usando android:sharedUserId
y ejecutar en el mismo proceso ( android:process
– no estábamos seguros si eso ya era el caso), pero Todavía no hay suerte.
¿Significa esto que actualmente es imposible ejecutar instrumentaciones que contengan eventos clave en un emulador sin cabeza, o nos falta algo?
- ¿Cómo puedo ejecutar una sola prueba con gradle android
- Android en las pruebas de suscripción de aplicaciones
- Prueba de suscripción en Android: elemento no encontrado
- IsolatedContext vs AndroidTestCase.getContext ()
- ¿Cómo puedo obtener identificadores, nombres o rutas x para elementos ui utilizados en una aplicación para móviles (Android / iOS) para pruebas de automatización móvil?
- Java.lang.RuntimeException: ¡Stub! - ¿Cobertura de código de Android?
- Destruye y reinicia la actividad con la biblioteca de soporte de pruebas
- ¿Por qué no hay instrumentación de prueba para BroadcastReceiver?
Tuve un problema similar con mi prueba en el servidor Hudson. En mi caso el problema que resolví por sugerencia de Android SDK: http://developer.android.com/guide/topics/testing/testing_android.html#UITestTroubleshooting
Importante es que tuve que habilitar los permisos para la aplicación principal también.
Ejecuto el emulador sin -no-window
en máquinas sin cabeza ejecutando primero una instancia Xvnc (es decir, un servidor X falso) y luego iniciar el emulador en ese DISPLAY
.
Más exactamente, tengo el Xvnc y Android Emulator Jenkins plugins para hacer esto por mí.
Desafortunadamente, desbloquear la pantalla sigue siendo una preocupación antes de inyectar eventos de interfaz de usuario, pero esto se resuelve (automáticamente) ejecutando automáticamente un comando como este (similar a esta otra respuesta que has visto ):
echo "event send EV_KEY:KEY_MENU:1 EV_KEY:KEY_MENU:0" | nc -q1 localhost 5554
Editar:
Descubrí que este método es mucho más fiable:
adb shell input keyevent 82
Alguna información sobre el código 82.
- ViewPager en Android está tomando la pantalla completa?
- Abrir la aplicación para Android desde el calendario