1.背景
编写观看视频相关case时,需要校验已观看的资源是否显示在“最近观看”列表,且资源封面显示的正确;
此时就要校验资源在视频列表的封面、与在“最近列表”的封面是否相同;
就是比较两个小图片是否相同。
2.解决思路
先截取到指定位置的封面图片,然后获取图片哈希值,比较两图片对应的哈希值来判断图片的相似性。
3.解决方法
3.1 截取指定位置图片
- uiautomator2+python
uiautomator2工具地址:https://github.com/openatx/uiautomator2
uiautomator2工具有已封装好的方法,可以直接对指定元素截图
import uiautomator2 as u2
d = u2.connect('xxx') # 设备serial
im = d(resourceId='').screenshot() # 对指定属性的元素截图
im.save('test.png') # 保存图片即可
- appium+python
appium中没有可以直接截取元素的方法,可以借助python中Image库截取图片;
流程大概是:先截取当前页面、然后通过元素坐标(bounds值)剪裁到相关元素截图、保存截图
from PIL import Image
self.driver.save_screenshot('test.png') # 截取当前页面,创建appium driver对象的方法就不细写了
img = Image.open('test.png')
im = img.crop((858,265,1506,610)) # 传入要截取元素的坐标,可以通过get_attribute('bounds')方式获得,也不细写了
im.save('test_ele.png') # 保存即可
3.2比较两图片哈希值
利用上面任意方法分别截取到对应位置的封面截图,接下来就可以对两图片进行比较了;
import imagehash
# 分别计算两图片hash值
hash1 = imagehash.average_hash(Image.open('/home/xxx/test.png'))
hash2 = imagehash.average_hash(Image.open('/home/xxx/test2.png'))
# 比较哈希值
dif = hash1 - hash2
# 设定最大不同值(我这里是肉眼看两封面确实相同时,然后跑了几次case,发现10以内基本确保图片是一定一致的
# 可以拿真实的case跑几次试一下,然后确定一个最大不同值
max_dif = 10
if dif < 0:
dif = -dif
# dif与最大值比较一下就可以了,返回结果可以随意设定
if dif <= max_dif:
return True
else:
return False