1

我有一个使用monkeyrunner 制作的脚本。该脚本将安装一个应用程序,对模拟器进行一些按键操作,然后卸载。在某些事情的中间,我得到了Shell 命令无响应异常,这将破坏我的脚本。

你知道我做错了什么导致这种异常。这是错误消息

130228 16:44:49.210:I [pool-1-thread-1] [com.android.chimpchat.adb.AdbChimpDevice] 错误启动命令:monkey --port 12345

130228 16:44:49.210:I [pool-1-thread-1] [com.android.chimpchat.adb.AdbChimpDevice]com.android.ddmlib.ShellCommandUnresponsiveException

130228 16:44:49.210:I [pool-1-thread-1] [com.android.chimpchat.adb.AdbChimpDevice] 在 com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:408)

130228 16:44:49.210:I [pool-1-thread-1] [com.android.chimpchat.adb.AdbChimpDevice] 在 com.android.ddmlib.Device.executeShellCommand(Device.java:453)

130228 16:44:49.210:I [pool-1-thread-1] [com.android.chimpchat.adb.AdbChimpDevice] 在 com.android.chimpchat.adb.AdbChimpDevice$1.run(AdbChimpDevice.java:105)

130228 16:44:49.210:I [pool-1-thread-1] [com.android.chimpchat.adb.AdbChimpDevice] 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)

130228 16:44:49.210:I [pool-1-thread-1] [com.android.chimpchat.adb.AdbChimpDevice] 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)

130228 16:44:49.210:I [pool-1-thread-1] [com.android.chimpchat.adb.AdbChimpDevice] 在 java.util.concurrent.FutureTask.run(FutureTask.java:166)

130228 16:44:49.210:I [pool-1-thread-1] [com.android.chimpchat.adb.AdbChimpDevice] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)

130228 16:44:49.210:I [pool-1-thread-1] [com.android.chimpchat.adb.AdbChimpDevice] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)

130228 16:44:49.210:I [pool-1-thread-1] [com.android.chimpchat.adb.AdbChimpDevice] 在 java.lang.Thread.run(Thread.java:679) 130228 16:46:25.631:我 [main] [com.android.chimpchat.ChimpManager] Monkey 命令:退出。

这是代码

def getTimeNow():
    timeStamp = ""
    timeStamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    return timeStamp

def saveScreenshot(screenshot, apkID, Code, path):
    fName = "".join([path, '/', Code, apkID, '.png'])
    screenshot.writeToFile(fName,'png')

def found(screenshot, ScreenshotRef, apkPack):
    Result = "N"
    acceptance = 0.9
    imageCap = ScreenshotRef + 'sshot'

    imageRef = MonkeyRunner.loadImageFromFile(imageCap)

    imageTuple = 78, 447, 547, 64
    #imageTuple = 16, 177, 64, 60
    ref = imageRef.getSubImage(imageTuple)
    y=0

    while y < 1280 - 64:
            imageTuple2 = 78, int(y), 547, 64

            if screenshot.getSubImage(imageTuple2).sameAs(ref, acceptance):
                    detResult = "B"
            uninAppMk(apkPack)
            MonkeyRunner.sleep(15)
            device.press("KEYCODE_ESCAPE", MonkeyDevice.DOWN_AND_UP)
            MonkeyRunner.sleep(15)
            device.press("KEYCODE_HOME", MonkeyDevice.DOWN_AND_UP)
            MonkeyRunner.sleep(15)
            print "Found at points 78," + str(y)
                    break
            y=y+1   
        return Result


def uninAppMk(apkPack):
    device.removePackage(apkPack)
    print "Package Uninstalled."


def writeToLogFile(logFile, Code, apkID, apkName, status, timeStamp):
    logText = "\t".join([Code, apkID, apkName, status, timeStamp, '\n'])

    db = zxJDBC.connect("jdbc:mysql://" + server + ":" + str(portnum) + "/" + schema, username , password, "com.mysql.jdbc.Driver")

    c = db.cursor() 
    mysql_output = c.execute("INSERT INTO table VALUES(?, ?, ?, ?, ?)",(Code, status, timeStamp, apkID , "0"))
    db.commit()
    print "mysql error output => " + str(mysql_output)

    f = open(logFile, "a")
    f.write(logText)
    f.close()


#+++++ ######## START HERE ######## ++++++#
#+++++ Connect to emulator ++++++#
timeout = 120

device = MonkeyRunner.waitForConnection()
MonkeyRunner.sleep(10)

#+++++ Getting CMD parameters ++++++#
apkID = sys.argv[1]
apkName = sys.argv[2]
apkPack = sys.argv[3]

#+++++ Read config file ++++++#
ConfigFileName = os.path.dirname(os.path.realpath(__file__)) + '/config.ini'
cp = ConfigParser.ConfigParser()
cp.read(ConfigFileName)
adbLoc = cp.get('tools','adb')
Code = cp.get('product','prodcode')
outputFolder = cp.get('output','App')
apkPath = cp.get('source','App')
ScreenshotRef = cp.get('source','ScreenshotRef')
logFile = outputFolder + 'logs.txt'

#----------read database section----------#
server = cp.get('database','server')
portnum = int(cp.get('database','port'))
username = cp.get('database','username')
password = cp.get('database','password')
schema= cp.get('database','schema')

#+++++ Check if output folder exist ++++++#
print "All screenshots will be found here " + outputFolder
if not os.path.exists(outputFolder):
    os.makedirs(outputFolder)

#++++++ Test Starts ++++++#

print "APK ID: " + apkID
print "APK Name: " + apkName
print "APK Package Name: " + apkPack
print "APK Path: " + apkPath

apkIns = apkPath  + apkName
print "APK:: " + apkIns 
try:
    device.installPackage(apkIns)
except(SocketException):
    print "~~~~Error installing"
MonkeyRunner.sleep(95)

#++++++ Take screenshot ++++++#
screenshot = device.takeSnapshot()
MonkeyRunner.sleep(10)
timeStamp = getTimeNow()
saveScreenshot(screenshot, apkID, Code, outputFolder)
MonkeyRunner.sleep(3)


#++++++ Check detection ++++++#
status = found(screenshot, ScreenshotRef, apkPack)
if status == 'N':
    uninAppMk(apkPack)

#++++++ Write to log file ++++++#

writeToLogFile(logFile, Code, apkID, apkName, status, timeStamp)
4

1 回答 1

2

答案有点晚了,但 MonkeyRunner 可能运行在 Google 的 ddmlib 之上。在 ddmlib 中,在设备上调用的所有 shell 命令的默认超时时间为 5000 毫秒。如果该进程在那 5000 毫秒内没有打印任何内容,则该进程将被关闭并抛出一个 ShellCommandUnresponsiveException。如果您的进程运行时间超过 5000 毫秒,您可能需要优化代码以避免在调用 shell 命令的时间内进行长时间的处理。或者,您可以检查 MonkeyRunner API 以查看是否有任何延长超时的方法。或者您可以简单地以某种方式连续输出到 shell 以防止超时到期。

于 2016-05-27T08:53:23.403 回答