python执行adb命令,python操作adb
#编码=utf8
Adb shell输入键盘命令如下:
输入文本信息:adb shell输入文本字符串
示例:输入文本hello
操作:ADB shell输入key event[-长按]键码或名称
示例:输入按键事件1或输入按键事件键码_菜单
点击:adb外壳输入点击x y
示例:输入抽头100 200
操作:adb外壳输入刷卡x1 y1 x2 y2
示例:输入滑动0 0 100 100
屏幕截图:adb shell screencap文件名
例如:ADB shell screen cap/SD card/screen . png
#用于获取设备的临时文件存储目录。
导入临时文件
#调用系统命令popen
导入操作系统
进口re
导入时间
将xml.etree.cElementTree作为ET导入
类DeviceDriver(对象):
通过元素定位,要求安卓4.0以上。
def __init__(self):
初始化,创建设备对象,获取当前PC下临时文件的路径;
调用re库创建一个带有数字的模式对象。
#获取存储当前设备临时文件的目录。
self . tempfile=tempfile . gettempdir()
#创建匹配数字的规则对象
self.pattern=re.compile(r\d )
尝试:
#创建设备连接的对象实例
self.devices=os.popen(adb等待设备)
例外情况除外:
打印“连接设备.”
最后:
self.devices.close()
#获取活动页面的用户界面信息文件
def __uidump(self):
获取设备当前活动页面的层次结构的UI信息,
UI信息通过uiautomator dump命令存储在uidump.xml文件中;
通过adb pull命令将uidump.xml文件下载到本地临时文件目录
尝试:
如果自己的设备:
#获取设备的当前活动页面的层次结构的UI信息,
#通过uiautomator dump命令将UI信息保存在uidump.xml文件中;
dumpui=OS . popen( ADB shell ui automator dump-compressed/data/local/tmp/ui dump . XML )
#通过adb pull命令将uidump.xml文件下载到本地临时文件目录。
pulldumpfile=OS . popen( ADB pull/data/local/tmp/ui dump . XML self . tempfile)
否则:
打印“检查设备是否已连接.”
例外情况除外:
print Get uidump.xml Fail .
最后:
#关闭连接
pulldumpfile.close()
dumpui.close()
#获取元素的位置信息
def __element(self,attrib,name):
属性,并返回单个坐标元组。
#调用函数将uidump.xml文件存储在本地临时目录中。
自我。__uidump()
尝试:
#将uidump.xml文件转换为元素树
tree=ET。element tree(file=self . tempfile \ \ ui dump . XML )
#使用iter方法深入遍历树中标记的节点。
#将节点元素存储在treeIter中
treeIter=tree.iter(tag=node )
#处理treeIter的所有元素。
对于treeIter中的elem:
#批判元素的属性
#如果属性值相同,请执行以下命令
if elem.attrib[attrib]==name:
#获取满足要求的元素的边界值
bounds=elem.attrib[bounds]
#获取页面元素是否可以点击。
clickable=elem . attrib[ clickable ]
#根据数字匹配规则将边界合并到列表中
coord=self . pattern . find all(bounds)
#获取元素的x坐标
#通过减去元素左右边界的X坐标来获得元素宽度。
#将左坐标值添加到元素宽度的一半
#获得精确的X值。
xpoint=(int(coord[2])-int(coord[0])/2.0 int(coord[0])
#获取元素的Y坐标
#通过减去元素上下边界的Y坐标得到元素高度。
#将上部坐标值加上元素高度的一半
#获得精确的Y值。
ypoint=(int(coord[3])-int(coord[1])/2.0 int(coord[1])
#返回元素的坐标
return (elem,Xpoint,Ypoint,clickable)
例外情况除外:
打印“获取元素错误的位置!”
#获取具有相同属性值的元素列表
def __elements(self,attrib,name):
属性,并返回坐标元组列表。
#用于放置元素坐标
elementList=[]
#调用函数将uidump.xml文件存储在本地临时目录中。
自我。__uidump()
尝试:
tree=ET。element tree(file=self . tempfile \ \ ui dump . XML )
treeIter=tree.iter(tag=node )
对于treeIter中的elem:
if elem.attrib[attrib]==name:
bounds=elem.attrib[bounds]
#获取页面元素是否可以点击属性
clickable=elem。attrib[可点击]
#通过数字匹配规则,把bouns合并成一个目录
坐标=自身。模式。查找所有(边界)
xpoint=(int(coord[2])-int(coord[0])/2.0 int(coord[0])
ypoint=(int(coord[3])-int(coord[1])/2.0 int(coord[1])
#把元素坐标以元组添加到元素位置列表
elementList.append((elem,Xpoint,Ypoint,clickable))
返回元素列表
例外情况除外:
打印获取元素位置列表错误!
def findElementByName(self,Name):
通过元素名称定位
用法:findElementByName(u 设置)
回归自我。_ _元素("文本",名称)
def findElementsByName(self,Name):
回归自我。_ _元素("文本",名称)
def findElementByClass(self,className):
通过元素类名定位
用法:findElementByClass( Android。小部件。文本视图’)
回归自我。_ _元素( class ,类名)
def findElementsByClass(self,className):
回归自我。_ _元素( class ,类名)
def findElementById(self,Id):
通过元素的资源标识定位
用法:findElementsById( com。安卓。座钟:id/imageview’)
回归自我。_ _元素("资源id”,Id)
def findElementsById(self,Id):
回归自我。_ _元素(资源id ,id)
#点击元素
def ClickElement(self,dx,dy):
尝试:
如果自己的设备:
tap=os.popen(adb shell输入点击字符串(dx) 字符串(dy))
否则:
打印你好没有连接设备.
例外情况除外:
及格
最后:
点击。关闭()
#滑动设备屏幕
def swipeScreen(自身、x1、y1、x2、y2):
尝试:
如果自己的设备:
#滑动设备
swipescreen=os.popen(adb shell输入刷卡str(x1) str(y1) str(x2) str(y2))
否则:
打印你好没有连接设备.
例外情况除外:
及格
最后:
swipescreen.close()
#换新屏幕
定义唤醒(自我):
尝试:
如果自己的设备:
#唤醒设备
唤醒设备=操作系统。popen(亚行外壳输入键码_菜单)
否则:
打印你好没有连接设备.
例外情况除外:
及格
最后:
wakeupDevice.close()
定义测试():
driver=DeviceDriver()
ele=driver.findElementByName(u 喜马拉雅FM’)
司机。单击元素(ele[1],ele[2])
driver.deviceScreencap()
时间。睡眠(1)
if __name__==__main__ :
测试()核心是通过adb shell uiautomator转储命令获取活动页面的用户界面信息,然后通过可扩展标记语言包,把文件转换成树!
通过结节节点中的属性获取元素元素坐标!
该脚本封装了
findElementByName,findElementsByName,findElementByClass,findElementsByClass,findElementById,findElementsById,ClickElement,swipeScreen,wakeUp等函数用来定位应用的元素位置!
通过(同AsianDevelopmentBank)亚洲开发银行外壳输入命令来操作元素的点击!
总结:
应用自动化测试中的用户界面测试是测试的难点与头痛的地方,因为通过测试脚本进行元素定位,不精确而且元素会经常变换,维护成本大!同时,appium环境部署相当复杂!该脚本能完成,元素定位于点击,屏幕滑动等功能!经过测试,操作响应比测试脚本快的多!
后期我会根据把该脚本与monkeyrunner单元测试机器人框架整合在一起!如果写的不到位的希望补充~~~~~~~~~
下面是初步结合如下:
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。