1

monkeyrunner を使用して作成したスクリプトがあります。スクリプトはアプリをインストールし、エミュレーターにいくつかのキーを押してからアンインストールします。何かの途中でShell Command Unresponsive Exceptionが発生し、スクリプトが台無しになります。

この種の例外を引き起こすために私が何を間違ったのか知っていますか。ここにエラーメッセージがあります

130228 16:44:49.210:I [pool-1-thread-1] [com.android.chimpchat.adb.AdbChimpDevice] コマンドの開始エラー: サル --port 12345

130228 16:44:49.210:I [プール 1 スレッド 1] [com.android.chimpchat.adb.AdbChimpDevice]com.android.ddmlib.ShellCommandUnresponsiveException

130228 16:44:49.210:I [プール 1 スレッド 1] [com.android.chimpchat.adb.AdbChimpDevice] com.android.ddmlib.AdbHelper.executeRemoteCommand (AdbHelper.java:408) で

130228 16:44:49.210:I [プール 1 スレッド 1] [com.android.chimpchat.adb.AdbChimpDevice] com.android.ddmlib.Device.executeShellCommand (Device.java:453) で

130228 16:44:49.210:I [プール 1 スレッド 1] [com.android.chimpchat.adb.AdbChimpDevice] com.android.chimpchat.adb.AdbChimpDevice$1.run(AdbChimpDevice.java:105) で

130228 16:44:49.210:I [プール 1 スレッド 1] [com.android.chimpchat.adb.AdbChimpDevice] java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:471) で

130228 16:44:49.210:I [プール 1 スレッド 1] [com.android.chimpchat.adb.AdbChimpDevice] java.util.concurrent.FutureTask$Sync.innerRun (FutureTask.java:334) で

130228 16:44:49.210:I [プール 1 スレッド 1] [com.android.chimpchat.adb.AdbChimpDevice] java.util.concurrent.FutureTask.run (FutureTask.java:166) で

130228 16:44:49.210:I [プール 1 スレッド 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:私は [メイン] [com.android.chimpchat.ChimpManager] モンキー コマンド: 終了します。

これがコードです

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 では、デバイスで呼び出されるすべてのシェル コマンドのデフォルトのタイムアウトは 5000 ミリ秒です。プロセスがその 5000 ミリ秒の間に何も出力しない場合、プロセスはシャットダウンされ、ShellCommandUnresponsiveException がスローされます。プロセスの実行に 5000 ミリ秒以上かかる場合は、コードを最適化して、シェル コマンドが呼び出される時間内に処理が長くならないようにすることができます。または、MonkeyRunner API をチェックして、タイムアウトを延長する方法があるかどうかを確認することもできます。または、タイムアウトが期限切れになるのを防ぐために、何らかの方法でシェルに継続的に出力することもできます。

于 2016-05-27T08:53:23.403 に答える