zoukankan      html  css  js  c++  java
  • 增强型MonkeyRunner 脚本计划

    最近,做android项目测试,测试一个应用程序在多个设备中分辨率是否合适,麻烦得要命,不停的截图比较,前一段时间,研究了一下monkeyrunner ,决定通宵写一个实用性强的monkeyrunner来方便测试使用

    前一段时间写的monkeyrunner资料

    http://www.cnblogs.com/youxilua/archive/2011/11/12/2246576.html

    功能说明:

      1. 可以自动安装apk到android模拟器或者android实机
      2. 可以截取设定好activity运行在android模拟器或者android实机上的效果图
      3. 截图根据设备名和截取时间保存
      4. 能够自动设别所有运行中的android模拟器或者android实机
      5. 能够自动安装在特定文件夹下所有的apk文件到android模拟器或者实机

    功能实现:

    环境配置:

    • 设置好android /tootls 和 android /platform-tools 目录的到环境变量中,确保adb命令能够在cmd下正常运行

    脚本编写:

    该功能需要创建以下几个文件

    300x110_MarkMan

    componentName.txt

    使用约定

    每一行为需要运行的activity的完整名字

    例如:

    kg.tom/.HandlerThreadActivity
    kg.monkey/.MonkeyActivity

    takeSnap.bat
    @echo off
    rem 获取当前运行设备
    adb devices > devices.txt
    rem 获取APK文件
    dir apk /B > apk.txt
    rem 运行monkeyrunner 脚本
    monkeyrunner work.py

    xxxx

    核心运行脚本:

    #导入我们需要用到的包和类并且起别名
    #导入我们需要用到的包和类并且起别名
    import sys,time,datetime
    from com.android.monkeyrunner import MonkeyRunner as mr
    from com.android.monkeyrunner import MonkeyDevice as md
    from com.android.monkeyrunner import MonkeyImage as mi
    deviceslist = []
    devices = []
    snapshot = []
    templist = []
    f = open("devices.txt")
    while True:
    	line = f.readline()
    	if line:
    		templist.append(line.strip())
    	else:
    		break;
    f.close()
    templist.pop()
    for i in range(len(templist)):
    	deviceslist.append(templist[i].split('\t'))
    fc = open("componentName.txt")
    complist = []
    while True:
    	comp = fc.readline()
    	if comp:
    		complist.append(comp.strip())
    	else:
    		break;
    fc.close()
    fp = open("apk.txt")
    apklist = []
    while True:
    	apk = fp.readline()
    	if apk:
    		apklist.append(apk.strip())
    	else:
    		break;
    print 'apk list :'
    print apklist
    print 'start componentName list :'
    print complist
    print 'devices list:'
    print deviceslist
    for i in range(1,len(deviceslist)):
    	print 'current devices:'
    	print deviceslist[i]
    	devices.append(mr.waitForConnection(1.0,deviceslist[i][0]))
    	#安装apk文件
    	for j in range(len(apklist)):
    		devices[i-1].installPackage('apk/'+apklist[j])
    	#启动activity
    	for k in range(len(complist)):
    		print 'current start activity:'
    		print complist[k]
    		devices[i-1].startActivity(component=complist[k])
    		#设置延时秒数
    		mr.sleep(5.0)
    		#----------------
    		#这里可进行一定的UI操作
    		#----------------
    		#mr.sleep(3.0)
    		#进行截图
    		snapshot.append(devices[i-1].takeSnapshot())
    		print 'end snapshot'
    		#创建时间字符串
    		t = time.strftime("%Y-%m-%d-%X",time.localtime())
    		t = t.replace(":","-")
    		#保存截图
    		package = complist[k].replace('/.','.')
    		snapshot[0].writeToFile('takeSnapshot/'+deviceslist[i][0]+'-'+t+'-'+package+'.png','png');
    		snapshot.pop()
    由于之前毫无编写python的经验,只能写成这样了,欢迎高手补充!!!!!!

    使用:

        把tools文件夹里面的全部文件,同样放在android sdk tools 文件夹下即可,运行takeSnap.bat就可以获取到多个设备运行时的截图了,这个期间…你可以选择去泡一杯咖啡…耗时情况…看你要测试几个设备,还有如何测试了……

    效果图:

    三个虚拟机,在一台实机,测试两个apk在这些设备的运行境况

    image

    以下为全部截图文件:

    image

    以后可能会更新的部分和改善的地方

    1,支持从外部读取monkeyrunner 脚本进行多设备运行…其实..现在这个也可以…只是没写上

    2,同一样设备的截图放置在一样设备名的文件,(这个…其实补充起来也很快…不过,要做完善就要判断设备名与创建文件名是否合法等等,不过…我感觉,将所有截图放到一个文件夹下更方便用来比较,就没写了,有兴趣的自行补充…同时,也顺便贴到这里来吧…)

    3,由于,本人的脚步编写功底实在是烂,不知道如何在运行环境中设置环境变量,就不得已要在android sdk tools目录 下运行,如果,觉得这个脚步还可以,希望帮忙完善,能够达到在任意目录下…

    4,当设备是离线状态无法判断,不过,在以上的脚本中已经实现了获取设备的状态,只是,很少,碰到就懒得补充了….

    5,如果,出现无法连接设备…那么请再运行一遍…如果…还不行…就重启吧…这跟脚本没关系吧…貌似…就是有这种问题…

    6,最后,附上下载地址:

    http://www.kuaipan.cn/file/id_2622545685699681.html

  • 相关阅读:
    Git的简单使用
    git中查看全部分支的命令
    ModuleNotFoundError: No module named '__main__.base'; '__main__' is not a package(即 if __name__=='__main__'的深入理解)
    django中使用filter()(即对QuerySet操作)时踩的坑
    django模型中如何创建数据并保存到数据库
    django中使用mysql创建索引时报错MySQL does not support a database index on longtext columns
    python环境的编码
    synchronized关键字以及实例锁 类锁
    深拷贝与浅拷贝
    java String不可变对象,但StringBuffer是可变对象
  • 原文地址:https://www.cnblogs.com/youxilua/p/2262715.html
Copyright © 2011-2022 走看看