Monkeyrunner在设备上并行执行

时间:2012-11-19 21:27:13

标签: android python multithreading monkeyrunner

我试图使用monkeyrunner来配置连接到同一台PC的多个平板电脑。该代码适用于1个平板电脑,但是当我尝试在多个平板电脑上运行它时,它们都会爆炸。

这是调用monkeyrunner python文件的代码。 mr1.py是我试图运行的monkeyrunner文件。

import sys

import util
import threading
import commands
class myThread (threading.Thread):
    def __init__(self, threadID, deviceId,env_path):
        self.threadID = threadID
        self.deviceId = deviceId
        self.path = env_path
        threading.Thread.__init__(self)
    def run(self):
        print "Starting " + self.deviceId
        ret = commands.getstatusoutput(self.path+"monkeyrunner mr1.py "+self.deviceId)
        print ret
        print "Exiting " + self.deviceId

def main():
    connected_devices = util.get_connected_devices()
    count = 0
    path = "/Users/ad/Desktop/android-sdk-macosx/tools/"
    for device in connected_devices:
        thread = myThread(count,device[0],path)
        thread.start()
        count = count + 1


if __name__ == "__main__":
    main()

我遇到了这篇博文,其中描述了monkeyrunner中的竞争状况。我不确定那是什么导致了这个问题。

http://distributedreasoner.blogspot.com/2011/06/android-monkeyrunner-and-google-adb.html

我也尝试过使用上面博文中提到的MAML库,但我仍然无法让monkeyrunner在多个设备上同时执行。这是实际的monkeyrunner代码。

import sys
import maml
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice



deviceId = sys.argv[1]

# Connects to the current device, returning a MonkeyDevice object
device = MonkeyRunner.waitForConnection(10.0,deviceId)

packagename = "com.android.settings"
classname =    "com.android.settings.DisplaySettings" #SecuritySettings" #".DisplaySettings" 
componentname = packagename + "/" + classname 
device.startActivity(component=componentname) 
maml.click(device,1088,300)
MonkeyRunner.sleep(0.4)
maml.click(device,864,361)
MonkeyRunner.sleep(0.4)
maml.click(device,612,621)
MonkeyRunner.sleep(0.5)
device.press ('KEYCODE_HOME', 'DOWN_AND_UP')

print "Exiting for device !" + deviceId

基于Commonsware的问题,我用以下顺序代码替换了线程代码,它似乎工作正常,但显然这不是最理想的情况。

for device in connected_devices:
        print device[0]
        ret = commands.getstatusoutput(path+"monkeyrunner mr1.py "+device[0])
        print ret

因为Android不允许您以编程方式修改位置/语言设置等,并且我需要配置许多平板电脑来更改设置,所以立即选择使用MonkeyRunner。有几点说明,我对除了monkeyrunner之外我可以使用的其他工具开放以解决这个问题。 任何有关这个问题的帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您想要更改哪些设置?语言可以在您的应用程序中完成,如果这是唯一的。

public void setLocale(Locale locale, Instrumentation inst){
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;
    inst.getTargetContext().getResources().updateConfiguration(config, inst.getTargetContext().getResources().getDisplayMetrics());
}

你的所有平板电脑api都是16级(真的是豆吗?),如果是这样你可能想看看http://developer.android.com/tools/testing/testing_ui.html

最后,如果您仍想使用Monkey runner,我建议您在一个线程中获取所有设备,然后将每个设备分别传递到每个线程。

Python不是我的专长,我没有你所使用的所有库的访问/知识(我可以在java中为你做这个吗?)但我觉得可能更好用的是:

class myThread (threading.Thread):
    def __init__(self, device):
        self.device = device
        threading.Thread.__init__(self)

    def run(self):
        packagename = "com.android.settings"
        classname = "com.android.settings.DisplaySettings"
        componentname = packagename + "/" + classname
        self.device.startActivity(component=componentname)
        maml.click(self.device, 1088, 300)
        MonkeyRunner.sleep(0.4)
        maml.click(self.device, 864, 361)
        MonkeyRunner.sleep(0.4)
        maml.click(self.device, 612, 621)
        MonkeyRunner.sleep(0.5)
        self.device.press('KEYCODE_HOME', 'DOWN_AND_UP')


def main():
    connected_devices = util.get_connected_devices()
    count = 0
    devices = []
    for deviceId in connected_devices:
        devices[count] = MonkeyRunner.waitForConnection(10.0, deviceId[0])
        count = count + 1
    for device in devices:
        thread = myThread(device)
        thread.start()


if __name__ == "__main__":
    main()

基本上差别就像我上面说的那样,你按顺序获得所有设备,然后用你顺序获得的设备调用每个线程。这有意义吗?