python自动化之图像像素点的小玩法

我们知道,在自动化测试中,特别是端侧功能测试中,经常要对页面的元素的状态进行判断,当然有的元素有很多信息,例如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
好了,不多说了,可以试试看下!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值