2012-05-08 17 views
5

Estoy ejecutando una prueba automatizada usando un emulador de Android que maneja una aplicación con un script Monkey escrito en Python. La secuencia de comandos copia los archivos en el emulador, hace clic en los botones de la aplicación y reacciona en función de las actividades que desencadena el software durante su funcionamiento. Se supone que el script está ejecutando el ciclo unas mil veces, así que tengo esto en un bucle para ejecutar la herramienta adb para copiar los archivos, iniciar las actividades y ver cómo reacciona el software llamando al método getProperty en el dispositivo con el parámetro 'am.current.comp.class'. Así que aquí es una versión muy simplificada de mi guión:MonkeyRunner de Android ocasionalmente arroja excepciones

for target in targets: 
    androidSDK.copyFile(emulatorName, target, '/mnt/sdcard') 

    # Runs the component 
    device.startActivity(component='com.myPackage/com.myPackage.myactivity') 

    while 1: 
     if device.getProperty('am.current.comp.class') == 'com.myPackage.anotheractivity': 
      time.sleep(1) # to allow the scree to display the new activity before I click on it 
      device.touch(100, 100, 'DOWN_AND_UP') 
      # Log the result of the operation somewhere 
      break 

     time.sleep(0.1) 

(androidSDK es una pequeña clase que he escrito que envuelve algunas funciones de utilidad para copiar y borrar archivos usando la herramienta ADB).

En ocasiones el guión se estrella con uno de una serie de excepciones, por ejemplo (me voy a cabo el seguimiento de la pila completa)

[com.android.chimpchat.adb.AdbChimpDevice]com.android.ddmlib.ShellCommandUnresponsiveException 

o

[com.android.chimpchat.adb.AdbChimpDevice] Unable to get variable: am.current.comp.class 
[com.android.chimpchat.adb.AdbChimpDevice]java.net.SocketException: Software caused connectionabort: socket write error 

He leído que a veces la la conexión de socket al dispositivo se vuelve inestable y puede necesitar un reinicio (adb start-server y adb kill-server son útiles).

El problema que tengo es que las herramientas arrojan excepciones de Java (Monkey se ejecuta en Jython), pero no estoy seguro de cómo pueden quedar atrapadas dentro de mi script de Python. Me gustaría poder determinar la causa exacta de la falla dentro del script y recuperar la situación para poder continuar con mis iteraciones (restablecer la conexión, por ejemplo). Por ejemplo, reiniciar mi dispositivo con otra llamada. MonkeyRunner.waitForConnection es suficiente?).

¿Alguna idea?

Muchas gracias, Alberto

EDITAR. Pensé que me gustaría mencionar que he descubierto que es posible capturar las excepciones de Java-específicas en un script Jython, si alguien necesita esto:

from java.net import SocketException 

... 

try: 
    ... 

except(SocketException): 
    ... 
+0

No estoy seguro exactamente cómo se comporta esto en Jython, pero es posible en Python anular sys.excepthook y obtener información sobre excepciones no detectadas. Avíseme si esto es útil en su caso y lo publicaré como respuesta. http://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python/6234491#6234491 – Jacinda

+0

Eso suena muy interesante, aunque no he estado trabajando en esa área del código durante meses, así que ' lo he olvidado todo :-) –

+0

Cool. Avíseme si el comportamiento de anulación funciona de manera similar a CPython o no. – Jacinda

Respuesta

0

Es posible capturar las excepciones de Java-específicas en un script Jython :

from java.net import SocketException 

... 

try: 
    ... 

except(SocketException): 
    ... 

(Tomado de edición de OP a su pregunta)

0

Esto funcionó para mí: device.shell ('salida') # Salir del shell de

Cuestiones relacionadas