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()
欢迎沟通学习。。。~~~工具