Uiautomator一直想找時間去學習,可是不得空。node
來了一個十一假,單身狗沒有約會,只能默默在家待着了,在android的sdk目錄下的tools目錄中有這麼一個特別好用的工具,這個事它的主界面:python
而後咱們能夠經過adb指令去獲取到這個界面的xml佈局文件:android
對應XML文件中的信息,咱們就能夠根據控件節點的屬性找到文件的範圍,根據控件的範圍能夠計算出中心座標點。shell
最後一條adb指令就能夠點擊這個控件了:windows
adb shell input tap x y瀏覽器
簡單介紹以後的實力示例:app
# coding=utf-8 import os import re import time import subprocess import xml.etree.cElementTree as ET PATH = lambda p: os.path.abspath( os.path.join(os.path.dirname(__file__), p) ) def Script(Script): return os.popen(Script).read() def GetActivitXml(FileName): adbscript='adb devices -l' Script('adb shell uiautomator dump /data/local/tmp/'+FileName+'.xml') Script('adb pull /data/local/tmp/'+FileName+'.xml ./') Script('adb shell rm -r /data/local/tmp/'+FileName+'.xml')å def Tapxy(x,y): Script('adb shell input tap '+str(x)+' '+str(y)) def putNodeType(Element): # print Element.attrib['index'] # print Element.attrib['text'] print Element.attrib['resource-id'] # print Element.attrib['class'] # print Element.attrib['package'] # print Element.attrib['content-desc'] # print Element.attrib['checkable'] # print Element.attrib['checked'] # print Element.attrib['clickable'] # print Element.attrib['enabled'] # print Element.attrib['focusable'] # print Element.attrib['focused'] # print Element.attrib['scrollable'] # print Element.attrib['long-clickable'] # print Element.attrib['password'] # print Element.attrib['selected'] # print Element.attrib['bounds'] def GetElementXY(FileName,TypeName,TypeValue): print u"當前界面尋找【"+TypeName+u"】爲【"+TypeValue+u"】的元素" GetActivitXml(FileName) tree = ET.ElementTree(file=PATH(FileName+".xml")) #加載XML文件 ElementList = tree.iter(tag="node") #獲取全部node節點 Xpoint=0; Ypoint=0; for Element in ElementList:#節點遍歷 if Element.attrib[TypeName] == TypeValue : bounds = Element.attrib["bounds"] # 經過正則獲取座標列表 pattern = re.compile(r"\d+") bound = pattern.findall(bounds) # print bound Xpoint=(int(bound[0])+int(bound[2]))/2 Ypoint=(int(bound[1])+int(bound[1]))/2 return (Xpoint, Ypoint) def TestCase(): ADElement=GetElementXY("TestTemp","text",u"瀏覽器") Tapxy(ADElement[0],ADElement[1]) time.sleep(0.5) ADElement=GetElementXY("TestTemp","resource-id","com.android.browser:id/windows") Tapxy(ADElement[0],ADElement[1]) time.sleep(0.5) ADElement=GetElementXY("TestTemp","resource-id",u"com.android.browser:id/multi_window_add") Tapxy(ADElement[0],ADElement[1]) time.sleep(0.5) ADElement=GetElementXY("TestTemp","resource-id","com.android.browser:id/windows") Tapxy(ADElement[0],ADElement[1]) time.sleep(0.5) ADElement=GetElementXY("TestTemp","text",u"關閉所有") Tapxy(ADElement[0],ADElement[1]) time.sleep(0.5) ADElement=GetElementXY("TestTemp","text",u"取消") Tapxy(ADElement[0],ADElement[1]) time.sleep(0.5) ADElement=GetElementXY("TestTemp","text",u"關閉所有") Tapxy(ADElement[0],ADElement[1]) time.sleep(0.5) ADElement=GetElementXY("TestTemp","text",u"關閉") Tapxy(ADElement[0],ADElement[1]) time.sleep(0.5) ADElement=GetElementXY("TestTemp","resource-id",u"com.android.browser:id/menu_wrapper") Tapxy(ADElement[0],ADElement[1]) time.sleep(0.5) ADElement=GetElementXY("TestTemp","resource-id",u"com.android.browser:id/quit") Tapxy(ADElement[0],ADElement[1]) time.sleep(0.5) if __name__ == '__main__': for x in xrange(1,100): print "===============第"+str(x)+"遍測試=============" TestCase()
歡迎溝通學習。。。~~~工具