2012-11-19 3 views
0

monkeyrunner를 사용하여 동일한 pc에 연결된 여러 태블릿을 구성하려고합니다. 코드는 1 타블렛에서 작동하지만 여러 타블렛에서 실행하려고 할 때마다 불어납니다.장치에서 Monkeyrunner 병렬 실행

다음은 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 라이브러리를 사용하여 시도,하지만, 난 여전히 여러 장치에 simulatenously을 실행 monkeyrunner을 얻을 수 있었다 havent 한. 다음은 실제 원숭이 러너 코드입니다. Commonsware의 질문을 바탕으로
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 

, 나는 다음과 같은 순차적 인 코드 스레딩 코드를 교체하고 괜찮아요 작동하는 것 같다,하지만 분명히이 가장 이상적인 상황이 아니다. 안드로이드 사용자가 프로그래밍 방식으로 위치/언어 설정 등을 수정할 수 나던, 내가 설정을 변경할 수 많은 태블릿을 구성해야하기 때문에

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

는 즉시 옵션은 MonkeyRunner을 사용하는 것이 었습니다. 몇 가지 메모, 나는이 문제를 해결하기 위해 monkeyrunner 이외의 다른 도구를 사용할 수 있습니다. 이 문제에 대한 도움을 주시면 감사하겠습니다.

+0

순식간에 또는 동시에 여러 태블릿에서 실행하려고합니까? "모두 불어서"정확히 무엇을 의미합니까? – CommonsWare

+0

동시에. "모든 폭파로"나는 아무 일도 일어나지 않는다는 것을 의미합니다. 예를 들어, monkeyrunner 코드에서 붙여 넣기가 처음 설정을 열고 을 누른 다음 화면 자동 회전을 클릭 한 다음 항상 켜기로 변경합니다. 내 PC에 연결된 2 개의 장치에서 실행했을 때 디스플레이 설정 만 열렸습니다. 다른 클릭은 발생하지 않았습니다. 다시 말하지만 스크립트를 실행할 때마다 똑같은 동작이 아닙니다. 때로는 일부 클릭이 1 개의 기기에서 작동하지만 다른 기기에서는 작동하지 않는 경우도 있습니다. – smk

+0

태블릿이 가로 방향으로 있다고 가정합니다. – smk

답변

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 이상 (jely 콩?) 당신은 아직도 내가 잡고 점점 추천 할 것입니다 원숭이 러너을 함께하고 싶어 그래서 당신이 마지막으로 http://developer.android.com/tools/testing/testing_ui.html

보고 할 수 있습니다 경우 모든 장치를 하나의 스레드에 저장 한 다음 각 장치에 각 스레드에 개별적으로 전달합니다.

파이썬은 내 전문 아니고 난 당신이 (내가 어쩌면 당신을 위해 자바에서 할 수 있을까?)를 사용하는 모든 라이브러리 fo를 액세스/지식을 가지고 있지만, 내가 수도가 잘 작동 생각하는 것은 같은 것입니다하지 않습니다

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() 

기본적으로 차이점은 위에서 말했듯이 모든 장치를 순서대로 가져온 다음 순차적으로 가져온 장치로 각 스레드를 호출하는 것입니다. 말이 돼?

+0

네, 일부 설정은 프로그래밍 방식으로 수행 할 수 있지만 1) 위치 서비스 2) 언어 및 입력 및 보안을 변경해야한다는 것을 알고 있습니다. 이것은 프로그램으로 할 수 없습니다 - 정확합니까? – smk

+0

"여전히 원숭이 주자와 함께하고 싶다면 모든 장치를 하나의 스레드에 보관 한 다음 각 장치에 각 스레드를 개별적으로 전달하는 것이 좋습니다. - 나는 파이썬에 대한 새로운 것이지만, 내가하는 일을 isnt 해? connected_devices 루프에있는 장치에서? – smk

+1

태블릿마다 다른 UI가 있기를 기대하기 때문에이 문제를 극복하더라도 MonkeyRunner를 사용하여 그러한 일을하기가 어렵다는 것을 알게 될 것입니다. 그들은 다른 사람들에 의해 만들어집니다. 이것은 그들이 모든 것에 대해 서로 다른 좌표를 갖고 있음을 의미합니다. 이 테스트를 에뮬레이터로 제한하면 원하는 작업을 쉽게 수행 할 수 있고 타블렛을 사용하여 다른 것들을 테스트 할 수 있습니다. –