【问题标题】:Android's MonkeyRunner occasionally throws exceptionsAndroid 的 MonkeyRunner 偶尔会抛出异常
【发布时间】:2012-05-17 04:27:36
【问题描述】:

我正在使用一个 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)

(androidSDK 是我写的一个小类,它封装了一些实用函数来使用 adb 工具复制和删除文件)。

有时脚本会因多种异常之一而崩溃,例如(我省略了完整的堆栈跟踪)

[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 就够了吗?)。

有什么想法吗?

非常感谢, 阿尔贝托

编辑。我想我会提到我发现可以在 Jython 脚本中捕获特定于 Java 的异常,如果有人需要的话:

from java.net import SocketException

...

try:
    ...

except(SocketException):
    ...

【问题讨论】:

  • 不确定它在 Jython 中的具体行为方式,但在 Python 中可以覆盖 sys.excepthook 并获取有关未捕获异常的信息。如果这对您的情况有帮助,请告诉我,我会将其作为答案发布。 stackoverflow.com/questions/6234405/…
  • 这听起来很有趣,虽然我已经好几个月没在代码的那个领域工作了,所以我都忘记了:-)
  • 酷。让我知道覆盖行为是否与 CPython 类似。

标签: python android-emulator jython monkeyrunner


【解决方案1】:

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

from java.net import SocketException

...

try:
    ...

except(SocketException):
    ...

(取自 OP 对他的问题的编辑)

【讨论】:

    【解决方案2】:

    这对我有用: device.shell('exit')# 退出shell

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-22
      • 2012-01-21
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      相关资源
      最近更新 更多