我们知道,在自动化测试中,特别是端侧功能测试中,经常要对页面的元素的状态进行判断,当然有的元素有很多信息,例如id,text,desc,可以直接通过uiautomater接口从页面中直接获取控件的状态,但是有些动态的或者非标准android开发的应用页面往往没有可利用的控件信息,对于这样的情况就需要采取其他的思路达到检测状态值的变化了。
下面,我写几个关于图像像素点判断,辅助检测控件状态变化的小方法。上代码:
from PIL import Image,ImageChops
import aircv as ac
import numpy as np
path=路径
sn_ph=手机的sn值
#截取手机当前页面保存到指定目录中
def saveScreenShot(path="",expect=True):
file_name=str(time.strftime('%Y%m%d%H%M%S',time.localtime()))+".png"
path=path+file_name
#通过adb命令截图
os.system('adb -s %s shell /system/bin/screencap -p/sdcard/%s'%(sn_ph,file_name))
#把截图导出至PC端指定目录
os.system('adb -s %s pull /sdcard/%s %s'%(sn_ph,file_name,path))
time.sleep(0.2)
#删除手机里截图的图片
os.system('adb -s %s shell rm /sdcard/%s'%(sn_ph,file_name))
print("截图保存路径:%s"%path)
return path
#通过RGB值判断像素点的状态
def getPixelPicture(list_pixel,list_location,file_name)
#list_pixel:rgb值的列表
#list_locaiton:屏幕桌面坐标点的list集合
if isinstance(list_pixel,list) and isinstance(list_location,list):
result=Screen().findPicRgb(file_name,list_location[0],list_location[1],list_pixel[0],list_pixel[1],list_pixel[2])
if result is True:
print('当前元素的像素点匹配正确!')
return True
return False
#上面这俩个方法,可以用于音乐APP播放按钮状态的变化,我们知道,播放按钮在播放状态和暂停状态时候,俩个图标是不一样的,咱们就可以利用这一点的不同作为判断播放按钮的状态,rgb的获取方式,文末我再讲
#获取图片的大小,返回二元组
def get_size(file):
#file:图片的路径
#获取图片对象
im1=Image.open(file)
#通过图片对象的size属性可以得到图片的尺寸
#结果是一个二元组,包含水平和垂直方向上的像素数
retrun (im1.size[0],im1.size[1])
#通过对比俩张图片的每个像素点判断图片相似度
def image_diff(im1,im2,same=0.9):
#im:代表图片路径
#same:代表相似度占比
t1=time.time()
x,y=get_size(im1)
w,e=get_size(im2)
if x>3000 and y>2000:
x=y=1500
iml1=Image.open(im1)
iml2=Image.open(im2)
pixl1=iml1.load()
pixl2=iml2.load()
count=x*y
simliarnum=0
for i in range(1,x):
for j in range(1,y):
count1=pixl1[i,j][0]+pixl1[i,j][1]+pixl1[i,j][2]
count2=pixl2[i,j][0]+pixl2[i,j][1]+pixl2[i,j][2]
if -10<(count1-count2)<10:
simliarnum+=1
result=simliarnum/count
print("相似度:%s"%str(result))
t2=time.time()
print("花费时间:"+str(t2-t1))
if result>same:
print("相似度高于0.9")
retrun True
else:
print("相似度低于0.9")
retrun False
#裁剪图片,切割的图片还是按原路径保存,覆盖之前的图片
def cut_image(image_path,x1,y1,x2,y2):
img=cv2.imread(image_path)
cropped=img[y1:y2,x1:x2]
cv2.imwrite(image_path,cropped)
#这几个方法可以用于,对与动态按钮变化的判断,比如判断QQ音乐的播放按钮的进度条变化,就可以先截一个图保存为1,把播放按钮裁剪出来,过一段时间,再截一个图保存为2,同样把播放按钮裁剪出来,然后比较这俩个图片的相似度,理论上要小于0.97的。
下面,我说一下怎么读取图片中的rgb值:
用你电脑自带的画图工具,打开图片
如图,点击那个小吸管,就可以提取某个点的颜色,然后编辑颜色,就可以知道RGU值了,图示为208,130,170
好了,不多说了,可以试试看下!