2012-05-08 49 views
5

我正在运行一个使用Android模拟器来驱动应用程序的自动化测试,其中使用Python编写的猴子脚本。 脚本正在将文件复制到仿真器上,单击应用程序中的按钮并根据软件在其操作过程中触发的活动作出反应。该脚本应该运行几千次循环,因此我在循环中运行adb工具来复制文件,启动活动并通过调用设备上的getProperty方法来查看软件如何反应参数'am.current.comp.class'。 因此,这里是我的脚本的一个非常简化的版本:Android的MonkeyRunner偶尔会抛出异常

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是小班我已经写了一些包装实用功能使用亚行工具来复制和删除文件)。

偶尔脚本有一些例外的一个崩溃,例如(我离开了完整的堆栈跟踪)

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

[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 

我已阅读,有时套接字连接到设备变得不稳定,可能需要重新启动(adb start-server和adb kill-server有用)。

我遇到的问题是这些工具抛出Java异常(Monkey运行在Jython中),但我不知道如何从Python脚本中捕获这些异常。我希望能够确定脚本内部故障的确切原因并恢复情况,以便我可以继续进行迭代(例如重新建立连接?例如,可以重新初始化我的设备和另一个呼叫到MonkeyRunner.waitForConnection就够了?)。

任何想法?

非常感谢, 阿尔贝托

编辑。我想我会提到,我发现它可以捕获特定的Java的异常在Jython脚本,应该有人需要这样的:

from java.net import SocketException 

... 

try: 
    ... 

except(SocketException): 
    ... 
+0

不知道确切这是如何在Jython中表现出来的,但在Python中可能会覆盖sys.excepthook并获取有关未捕获异常的信息。让我知道这是否对您有帮助,我会将其作为答案发布。 http://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python/6234491#6234491 – Jacinda

+0

这听起来很有趣,虽然我几个月来一直没有在这方面的代码工作,所以我'已经忘记了这一切:-) –

+0

很酷。让我知道覆盖行为是否与CPython类似。 – Jacinda

回答

0

有可能捕获特定的Java的异常在Jython脚本:

from java.net import SocketException 

... 

try: 
    ... 

except(SocketException): 
    ... 

(从OP的编辑带到了他的问题)

0

这为我工作: device.shell( '退出')#退出外壳