Android的MonkeyRunner偶尔会抛出异常

Alb*_*tto 5 python jython android-emulator monkeyrunner

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

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)
Run Code Online (Sandbox Code Playgroud)

(androidSDK是我编写的一个小类,包含一些实用程序函数,用于使用adb工具复制和删除文件).

有时,脚本会崩溃,例如(我正在遗漏完整的堆栈跟踪)

[com.android.chimpchat.adb.AdbChimpDevice]com.android.ddmlib.ShellCommandUnresponsiveException
Run Code Online (Sandbox Code Playgroud)

要么

[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
Run Code Online (Sandbox Code Playgroud)

我已经读过,有时设备的套接字连接变得不稳定,可能需要重启(adb start-server和adb kill-server非常有用).

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

有任何想法吗?

非常感谢,Alberto

编辑.我想我已经提到我发现有可能在Jython脚本中捕获特定于Java的异常,如果有人需要这个:

from java.net import SocketException

...

try:
    ...

except(SocketException):
    ...
Run Code Online (Sandbox Code Playgroud)

Mar*_*cin 0

可以在 Jython 脚本中捕获 Java 特定的异常:

from java.net import SocketException

...

try:
    ...

except(SocketException):
    ...
Run Code Online (Sandbox Code Playgroud)

(摘自OP对其问题的编辑)