python执行adb命令,python操作adb

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: