2012-11-06 2 views
1

Android 용 Robotium Framework 테스트 용도로 component_id 또는 index id를 직접 사용하거나 계층 뷰어에서 위젯의 일부를 수동으로 가져 와서 테스트 목적으로 런타임에 값을 입력합니다.현재 Android 창 화면의 모든 구성 요소 및 위젯 ID를 프로그래밍 방식으로 가져 오는 방법은 무엇입니까?

component_id 나 index id 또는 위젯의 일부를 프로그래밍 방식으로 사용할 수 있습니까? 지금까지 패키지 이름과 패키지 이름 아래 모든 활동 이름을 얻을 수있었습니다.

+0

정확히 무엇을 원하는지 잘 모르겠습니다. 명확히 해 주시겠습니까? –

+0

UI 테스트 용 Robotiumn에서는 버튼, 이미지 버튼 등과 같은 위젯에 대해 위젯 구성 요소 ID, 텍스트 또는 색인을 제공해야합니다. 현재이 작업을 수동으로 수행하여 계층 뷰어에서 모든 정보를 가져오고 있습니다. 시간이 많이 걸리는 것처럼 자동화하고 싶습니다. 나를 위해 수동으로 이것을 ..... ..... 그래서 모든 정보를 programatically 얻는 방법이있다 –

+0

이 질문은 약간 혼란 스럽다. 어쩌면 당신이 달성하기를 희망하는 구체적인 예를 제시 할 수 있습니까? 지금 사용하고있는 기술에 대한 코드를 게시 한 경우 특히 유용합니다. – MattDavis

답변

1
import time, subprocess, socket, re 

afttFile=open("ApplicationPackage.DOC", "r") 

fileName="" 
packageName="" 
activityName="" 
packageFile=None 

window_dump=None 
current_window=None 
windows=None 


#Function for executing adb shell command 
def adb(command, input=None): 
    if not isinstance(command,list): command=command.split() 
    return subprocess.Popen(command, stdout=subprocess.PIPE, 
         stderr=subprocess.STDOUT).communicate(input=input)[0] 


#Function for getting current window hash id 
def getWindowHash(): 
    command='adb shell ' 

    window_dump=subprocess.Popen(command+'dumpsys window windows', shell=False, stdout=subprocess.PIPE) 
    window_dump=window_dump.stdout.read() 

    regexp=re.compile(r'Window #\d+[:\s\r\n]+Window\{(?P<hash>[a-f\d]{8}) (?P<title>.*) paused=.*\}:?[\r\n]+(?P<attributes>(?: .*[\r\n]+)+)', re.MULTILINE) 

    windows=[ m.groupdict() for m in regexp.finditer(window_dump) ] 

    # fetch current window 
    m=re.search('mCurrentFocus=Window\{(?P<hash>\S+) (?P<title>\S*) \S+', window_dump) 
    if m: 
     current_window=m.groupdict() 
     #print self.current_window 
    else: 
     current_window=None 

    for window in windows: 
     if window['hash']==current_window['hash']: 
      return [window][0]['hash'] 


#Read Packag Name & Corresponding Activity Name from Provided file 
for line in afttFile: 
    #print line 
    if len(line.split("."))==3: 
     if packageFile!=None: 
      packageFile.flush() 
      packageFile.close() 
      #print "File with name: "+fileName+" closed" 

     packageName=line.strip("\n") 
     print "Package Name: "+packageName 
     fileName=line.split(".")[2].strip("\n")+".txt" 
     #print fileName 
     #Create file with corresponding package name 
     packageFile=open(fileName, "a") 

     #packageFile.flush() 
     #packageFile.close() 
    else: 
     activityName=line.strip("\n") 
     print "Activity Name: "+activityName 
     ## if packageName=="com.android.browser": 
      ## #print packageName 
      ## ommand="adb -s emulator-5554 shell am start -a android.intent.MAIN -n "+packageName+"/"+activityName 
      ## print command 
      ## ## result=subprocess.Popen(command, shell=False, stdout=subprocess.PIPE) 
      ## ## result=result.stdout.read() 

     #print packageName 
     if packageName=="com.android.mms": 
      command="adb shell am start -n "+packageName+"/"+activityName 
      print command 
      result=subprocess.Popen(command, shell=False, stdout=subprocess.PIPE) 
      result=result.stdout.read() 
      time.sleep(10) 

      print "Parsing has been started" 
      f=open("AFTT.txt", "w") 

      command='adb shell '  
      comm='adb ' 

      for port in range(5939,5979,2): 
       try:    
        s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        subprocess.Popen(command+'service call window 2', shell=False, stdout=subprocess.PIPE) 
        time.sleep(.5) 
        subprocess.Popen(command+'service call window 1 i32 4939', shell=False, stdout=subprocess.PIPE) 
        time.sleep(.5) 

        adb(comm+' forward tcp:%d tcp:4939' % port) 
        print "forwarding done" 

        s.connect(('127.0.0.1', port)) 
        #print "Connection Made" 
        print "Port Used for Communication: %s" %port 
        hashId=getWindowHash() 
        print "Window Hash_Id: %s" %hashId 

        s.sendall('DUMP %s\n'%hashId) 
        print "Command sent" 
        s.settimeout(360) 
        data='' 
        i=0 
        t0 = time.time()    
        print "Starting loop" 
        while True: 
         datum=s.recv(32*1024) 
         #print datum 
         #print 'Received %d bytes' % len(datum)   
         #print "\n" 
         print "Packet: "+datum 
         f.write(datum) 

         if (datum.endswith('\nDONE.\n') or datum.endswith('DONE.\n') or datum.endswith('\nDONE.\nDONE\n') or datum.endswith('DONE.\nDONE\n')): 
          #print "End of Packet ransfer" 
          break 

         if datum == '': 
          #print "Socket closed" 
          raise socket.error('Socket closed') 

         data+=datum 

         if time.time() - t0 > 360: 
          #print "Timeout" 
          raise socket.error('Timeout')     
         i=i+1 
        break 

       except socket.error: 
        #print "Checking for another port" 
        subprocess.Popen(command+'service call window 2', shell=False, stdout=subprocess.PIPE) 
        time.sleep(.5) 
        subprocess.Popen(command+'service call window 1 i32 4939', shell=False, stdout=subprocess.PIPE) 
        time.sleep(.5) 
        #f.close() 
        s.close() 
        #print "Server restarted" 

      #Open File for Parsing UI Elements 
      f=open("AFTT.txt", "r") 
      #package=open("Package.txt", "w") 
      for line in f: 
       widg_id=re.compile(r'mID=\S*', re.MULTILINE).findall(line) 
       widg_text=re.compile(r'mText=\d*,[a-zA-Z\W\d]*', re.MULTILINE).findall(line) 

       if len(widg_id)!=0 or len(widg_text)!=0: 
        ################################################################## 
        #Parse Widget Id 
        if len(widg_id)!=0: 
         widg_id=widg_id[0]   
         widg_id=str(widg_id) 
         widg_id=widg_id.strip("[]'") 
         if 'id' in widg_id: 
          widg_id=widg_id.split(",")[1].split("/")[1] 
         else: 
          widg_id=widg_id.split(",")[1] 
         packageFile.write(widg_id+"->") 
        else: 
         packageFile.write("None->") 

        ##################################################################  
        #Parse Widget Text 
        if len(widg_text)!=0: 
         widg_text=str(widg_text) 
         #Remove unncessary characters from String 
         widg_text=widg_text.strip("[]'") 

         #Get the second element that is excluding 'mText' 
         widg_text=widg_text.split(",")[1] 

         #SPlit text on basis of space 
         widg_text_ls=widg_text.split(" ") 

         widg_text="" 
         #Remove one element from last 
         widg_text_ls.pop()   
         #Create new STring by joining list 
         widg_text=" ".join(widg_text_ls)  

         if len(widg_text)==0: 
          packageFile.write("None->") 
         else: 
          packageFile.write(widg_text+"->") 
        else: 
         packageFile.write("None->") 

        ##################################################################  
        #Parse Widget Type 
        widg_type=str(line.split("@")[0]) 
        widg_type=widg_type.strip(" ") 
        packageFile.write(widg_type) 
        packageFile.write("\n") 
      f.close()  
afttFile.close()  
관련 문제