Monkeyrunner投掷socketexception断管触摸

时间:2014-05-01 21:09:51

标签: monkeyrunner

我在运行monkeyrunner脚本时有时会看到以下错误。 140501 17:01:58.950:S [MainThread] [com.android.chimpchat.adb.AdbChimpDevice]发送触摸事件时出错:500 515 DOWN_AND_UP 140501 17:01:58.950:S [MainThread] [com.android.chimpchat.adb.AdbChimpDevice] java.net.SocketException:断管 140501 17:01:58.950:java.net.SocketOutputStream.socketWrite0的S [MainThread] [com.android.chimpchat.adb.AdbChimpDevice](本机方法) 140501 17:01:58.950:java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)中的[MainThread] [com.android.chimpchat.adb.AdbChimpDevice]

我如何抓住这些?有帖子建议使用SocketException 来自java.net import SocketException

然而,这似乎不起作用

3 个答案:

答案 0 :(得分:2)

这可能不是最优雅的解决方案,但这就是我想出来的。

因为问题是当你杀死一个猴子脚本时,android设备上的进程没有正确清理,所以当你再次尝试连接时,你会遇到管道问题。你可以在设备上杀死-9猴子进程,你不会再遇到它。

我有两个脚本可以解决这个问题。 这是python:

 3 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
  4 from time import sleep
  5 import sys
  6 import signal
  7 import subprocess
  8
  9 device = None
 10
 11 def execute():
 12     device = MonkeyRunner.waitForConnection()
 13     #my code here
 17
 18 def exitGracefully(signum, frame):
 19     print "Exiting Gracefully..."
 20     subprocess.call(['./killmonkey.sh'])
 21     sys.exit(1)
 22
 23 if __name__ == '__main__':
 24     signal.signal(signal.SIGINT, exitGracefully)
 25     execute()

杀猴猴脚本:

#!/bin/bash

var=$(adb shell ps | grep monkey | awk '{print $2}')
echo $var
adb shell kill -9 $var

当我按ctrl + c python monkey脚本时,它调用killmonkey,它会杀死附加的android设备上的进程

这仅在仅连接了一个设备时才有效,因为它没有指定设备ID。不是很优雅,但我觉得它很有效。

答案 1 :(得分:0)

不可能把它作为例外。您甚至无法使用stderr

如果您真的想尝试以不正确的方式捕捉它,您需要进入Java的记录器:

from java.util.Logging import Level, Logger, StreamHandler, SimpleFormatter
from java.io import ByteArrayOutputStream

device = # your code to get the device object
errors = ByteArrayOutputStream(100)
logger = Logger.getLogger('com.android.chimpchat.adb.AdbChimpDevice')
logger.addHandler(StreamHandler(errors, SimpleFormatter()))

device.touch(120, 120, 'DOWN_AND_UP')

if errors.size() > 0:
    # any code you want
    raise YourException

要捕获MonkeyRunner中的任何其他Java错误,您必须将Logger.getLogger(TAG)中的TAG更改为打印日志的类。

要真正解决此问题,您可能还想尝试:How do I catch SocketExceptions in MonkeyRunner?

答案 2 :(得分:0)

我真的很喜欢Brian的回答,但是不想为此维护另一个文件,所以我直接运行命令。似乎到目前为止工作。

from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
import sys
import signal
import subprocess

device = None

def execute():
    device = MonkeyRunner.waitForConnection()
    #my code here

def exitGracefully(signum, frame):
    """
    Kill monkey on the device or future connections will fail
    """
    print "Exiting Gracefully..."
    try:
        subprocess.call("adb shell kill -9 $(adb shell ps | grep monkey | awk '{print $2}')", shell=True)
    except Exception, e:
        print(e)
    sys.exit(1)

if __name__ == '__main__':
    signal.signal(signal.SIGINT, exitGracefully)
    execute()