2013-02-28 2 views
1

У меня есть сценарий, сделанный с использованием monkeyrunner. Скрипт установит приложение, запустит некоторые ключи для эмулятора и затем удалит. В середине чего-то я получаю Shell Command Unresponsive Exception, и это разрушит мой скрипт.Shell Command Unresponsive Exception в эмуляторе Android?

Знаете ли вы, что я сделал неправильно, чтобы привести к этому исключению. вот сообщение об ошибке

130228 16: 44: 49,210: I [бассейн-1-токарно-1] [com.android.chimpchat.adb.AdbChimpDevice] команды запуска Ошибка: обезьяны --port 12345

130228 16: 44: 49,210: Я [бассейн-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: Я [бассейн-1-нить-1] [com.android.chimpchat.adb.AdbChimpDevice] на com.android .ddmlib.Device.executeShellCommand (Device.java:453)

130228 16: 44: 49,210: Я [бассейн-1-нить-1] [com.android.chimpchat.adb.AdbChimpDevice] на ком. android.chimpchat.adb.AdbChimpDevice $ 1.run (AdbChimpDevice.java:105)

130228 16: 44: 49,210: Я [бассейн-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: Я [бассейн-1-нить-1] [com.android.chimpchat .adb.AdbChimpDevice] на java.util.concurrent.FutureTask.run (FutureTask.java:166)

130228 16: 44: 49.210: Я [бассейн-1-нить-1] [com.android. chimpchat.adb.AdbChimpDevice] вjava.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1110)

130228 16: 44: 49,210: Я [бассейн-1-нить-1] [com.android.chimpchat.adb.AdbChimpDevice] на java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:603)

130228 16: 44: 49,210: Я [бассейн-1-нить-1] [com.android.chimpchat.adb .AdbChimpDevice] в java.lang.Thread.run (Thread.java:679) 130228 16: 46: 25.631: I [main] [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) 
+0

Код поможет. Не могли бы вы также добавить это? И укажите, на какой линии вы получаете исключение. –

+0

Это ошибка ChimpChat –

+0

@dtmilano, если это ошибка, что я могу сделать, чтобы этого избежать? какие команды мне не использовать, чтобы я не получил такую ​​же ошибку? благодаря! –

ответ

0

Вид поздно для ответа, но MonkeyRunner вероятно, работает поверх ddmlib Google. В ddmlib все команды оболочки, вызываемые на устройстве, имеют тайм-аут по умолчанию 5000 мс. Если процесс ничего не печатает для этих 5000 мс, процесс будет закрыт и будет выведено исключение ShellCommandUnresponsiveException. Если ваш процесс занимает более 5000 мс для запуска, вы можете оптимизировать свой код, чтобы избежать длительной обработки за время вызова команд оболочки. Кроме того, вы можете проверить API MonkeyRunner, чтобы узнать, есть ли способ продлить время ожидания. Или вы можете просто непрерывно выводить на оболочку, чтобы предотвратить истечение времени ожидания.