uiautomator的簡單應用

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

歡迎溝通學習。。。~~~工具

相關文章
相關標籤/搜索