2012-05-08 9 views
5

Sono in esecuzione un test automatico utilizzando un emulatore di Android alla guida di un'app con uno script scimmia scritto in Python. Lo script sta copiando i file sul emulatore, clic pulsanti in app e reagisce a seconda delle attività che il software innesca durante il suo funzionamento. Lo script si suppone essere in esecuzione del ciclo di qualche migliaio di volte in modo ho questo in un ciclo per eseguire lo strumento adb per copiare i file, avviare le attività e vedere come il software sta reagendo chiamando il metodo getProperty sul dispositivo con il parametro 'am.current.comp.class'. Così qui è una versione molto semplificata del mio script:di Android lancia di tanto in tanto eccezioni

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 è una piccola classe che ho scritto che avvolge alcune funzioni di utilità per copiare e cancellare i file usando lo strumento adb).

In occasioni lo script si blocca con uno di una serie di eccezioni, per esempio (sto lasciando la traccia completa dello stack)

[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 

Ho letto che a volte il la connessione socket al dispositivo diventa instabile e potrebbe essere necessario un riavvio (adb start-server e adb kill-server sono utili).

Il problema che sto avendo è che gli strumenti lanciano eccezioni Java (Monkey viene eseguito in Jython), ma non sono sicuro di come possano essere intrappolati all'interno del mio script Python. Mi piacerebbe essere in grado di determinare la causa esatta dell'errore all'interno dello script e recuperare la situazione in modo da poter continuare con le mie iterazioni (ristabilire la connessione, ad esempio? Vorrei ad esempio reinizializzare il mio dispositivo con un'altra chiamata a MonkeyRunner.waitForConnection essere abbastanza?).

Qualche idea?

Molte grazie, Alberto

EDIT. Ho pensato di ricordare che ho scoperto che è possibile intercettare le eccezioni Java-specifici in uno script Jython, qualcuno dovrebbe bisogno di questo:

from java.net import SocketException 

... 

try: 
    ... 

except(SocketException): 
    ... 
+0

Non sono sicuro esatto come questo si comporta in Jython, ma in Python è possibile sovrascrivere sys.excepthook e ottenere informazioni sulle eccezioni non rilevate. Fammi sapere se questo è utile nel tuo caso e lo posterò come risposta. http://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python/6234491#6234491 – Jacinda

+0

Sembra molto interessante, anche se non ho lavorato su quell'area del codice per mesi ora, quindi Ho dimenticato tutto :-) –

+0

Cool. Fammi sapere se il comportamento di override funziona in modo simile a CPython o meno. – Jacinda

risposta

0

E 'possibile intercettare le eccezioni Java-specifici in uno script Jython :

from java.net import SocketException 

... 

try: 
    ... 

except(SocketException): 
    ... 

(Tratto da modifica del PO alla sua domanda)

0

Questo ha funzionato per me: device.shell ('uscita') # uscire dalla shell

Problemi correlati