我正在使用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):
...
答案 0 :(得分:0)
可以在Jython脚本中捕获特定于Java的异常:
from java.net import SocketException
...
try:
...
except(SocketException):
...
(取自OP对其问题的编辑)
答案 1 :(得分:0)
这对我有用: device.shell(' exit')#退出shell