说明:
monkeyrunner适合做设备控制、基本功能测试、回归测试、可扩展的自动化、截屏对比等,但它并不能做比较复杂的功能测试,本例中是结合python、adb、PIL开发的测试代码,实现简单的子页面的截图对比,使用终端设备安卓版本,适合做页面排版(格局)统一的自动化点击操作,不能进行动作的逻辑判断,存在一定的局限性。
开发自动化场景:
针对酷影模式,自动化访问一级页面、二级页面、三级页面并各级页面截屏后对比图像相似度判断每级页面是否符合酷影模式。
开发环境准备条件:
1)windows环境
2)下载安卓SDK包:从安卓官方下载sdk(winows):http://developer.android.com/sdk/index.html,无须安装,monkeyrunner默认存放在sdk\tools下.
3)已安装python开发环境
4)已安装java环境
5)下载python版本对应的PIL(python图像库):http://www.lfd.uci.edu/~gohlke/pythonlibs/
6)指定每级页面参照物并放在指定的目录,如:本例中的d:\level1.png
指定手机截屏裁剪后用于图像对比,如本例中的D:\Program Files\adt-bundle-windows-x86_64-20131030\sdk\tools\TEMP\TEMP_TEST.png
指定手机截屏前复制到本地目录的路径,如本例中的D:\\Program Files\\adt-bundle-windows-x86_64-20131030\\sdk\\tools\\screenshoot\\
7)准备url.txt文件,url按行存放,URL前必须加http://头,如http://www.d9vod.com
代码开发:
1.monkeyrunner通过手机屏幕坐标各级页面点击,创建py文件:如monkeyrunner_test.py
# -*- coding: utf-8 -*-
import os
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
device = MonkeyRunner.waitForConnection()
my_file = open('url.txt')
my_init = 0
for line in my_file:
#启动UC浏览器并发送http请求
test_str = 'am start -a android.intent.action.VIEW -n com.UCMobile/com.UCMobile.main.UCMobile -d ' + line
device.shell(test_str)
print '>>>>>>>> start UCmobile'
#输出请求URL对应的行号及URL地址
my_init = my_init + 1
print my_init, line
MonkeyRunner.sleep(4)
device.shell('screencap /storage/sdcard0/data/photo/'+str(my_init)+'_01.png')
MonkeyRunner.sleep(3)
#点击第一个栏目
device.touch(65,272,'DOWN')
MonkeyRunner.sleep(4)
device.shell('screencap /storage/sdcard0/data/photo/'+str(my_init)+'_02.png')
MonkeyRunner.sleep(3)
device.touch(82,746,'DOWN')
MonkeyRunner.sleep(7)
device.shell('screencap /storage/sdcard0/data/photo/'+str(my_init)+'_03.png')
my_file.close()
print ">>>>>>>> finish"
2.创建图像裁剪或图像相似度对比py文件,如image_Test.py:
# -*- coding: utf-8 -*-
import os
import sys
import Image
import stat
import math
import operator
import linecache
sys.path.append("C:\\Python27\\Lib\\site-packages\\PIL")
sys.path.append("C:\\Python27\\Lib\\site-packages")
sys.path.append("D:\\Program Files\\adt-bundle-windows-x86_64-20131030\\sdk\\tools")
#手机图片传输到本地
os.system('adb pull /storage/sdcard0/data/photo/ ./screenshoot/')
os.system('adb shell rm -r /storage/sdcard0/data/photo/*.png')
#参照物
Reference_level1_page = r'd:\level1.png'
Reference_level2_page = r'd:\level2.png'
Reference_level3_page = r'd:\level3.png'
#裁剪后
crop_target_path = r'D:\Program Files\adt-bundle-windows-x86_64-20131030\sdk\tools\TEMP\TEMP_TEST.png'
#定义全局数组用于临时存放页面级的文件名
Arrary_Success = []
Arrary_Fail = []
#定义图像裁剪函数
def image_crop(source_image_path):
im = Image.open(source_image_path)
#定义裁剪图像区域:坐标,X,Y轴
#box = (left, top, left+width, top+height)
box = (0,110 , 537, 176)
region = im.crop(box)
region.save(crop_target_path)
#定义提示信息的编码格式为UTF-8
def encodeChinese(msg):
type=sys.getfilesystemencoding()
return msg.decode('UTF-8').encode(type)
#定义图像对比相似度的对比算法
def pil_image_similarity(filepath1, filepath2):
image1 = Image.open(filepath1)
image2 = Image.open(filepath2)
h1 = image1.histogram()
h2 = image2.histogram()
rms = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2, h1, h2)))/len(h1) )
return rms
def image_similarity(source,target):
zhen = pil_image_similarity(source,target)
print zhen
return zhen
###根据文件名处理
d = r"D:\\Program Files\\adt-bundle-windows-x86_64-20131030\\sdk\\tools\\screenshoot\\"
I=os.listdir(d)
for i in I:
print i
#裁剪前
Source_level_page = 'D:\\Program Files\\adt-bundle-windows-x86_64-20131030\\sdk\\tools\\screenshoot\\' + i
image_crop(Source_level_page)
my_i = i[-6:-4]
my_name = int(i[:-7])
print my_i
if my_i == '01':
A = image_similarity(Reference_level1_page,crop_target_path)
if A<1000:
print 'page1 is ok'
Arrary_Success.append(my_name)
else:
print 'page1 is not ok'
Arrary_Fail.append(my_name)
elif my_i == '02':
B = image_similarity(Reference_level2_page,crop_target_path)
if B<1000:
print 'page2 is ok'
Arrary_Success.append(my_name)
else:
print 'page2 is not ok'
Arrary_Fail.append(my_name)
elif my_i == '03':
C = image_similarity(Reference_level3_page,crop_target_path)
if C<1000:
print 'page3 is ok'
Arrary_Success.append(my_name)
else:
print 'page3 is not ok'
Arrary_Fail.append(my_name)
else:
print 'something is wrong!'
for ok in set(Arrary_Success):
Stringname1 = linecache.getline('url.txt',ok)
if ok not in set(Arrary_Fail):
f=open('ok.txt','a')
f.write(Stringname1)
f.close()
for notok in set(Arrary_Fail):
Stringname2 = linecache.getline('url.txt',notok)
f=open('notok.txt','a')
f.write(Stringname2)
f.close()
--------------------------------------------------
注:以上文件创建后可直接放在sdk\tools目录下
---------------------------------------------------
执行monkeyrunner自动化:
cmd窗口指向SDK的tools目录,执行monkeyrunner.bat monkeyrunner_test.py
monkeyrunner.bat就行自动化执行python文件,这里比较遗憾的是monkeyrunner在调用PIL的image模块是不成功的,会报image模块找不到,网上找不到解决的方案,目前是不支持,所以我只能将图像处理拆分开,通过单独一个python文件里执行,通过bat调用python编译器来自动化调用,
将monkeyrunner.bat的内容最后一行追加:start python image_Test.py,执行完monkeyrunner的坐标点击及截图后,再自动化处理图像识别并根据识别度获取是否符合酷影的URL。