python +opencv 根据图片定位进行UI自动化
前言:
做过移动端ui自动化的小伙伴,就会发现很多控件的元素是一样的或者是找不到的,为了解决这个痛点,于是通过图片灰度处理返回坐标x,y找到控件的位置。再结合pytest+接口+UI断言整体项目思路。
1.接下来我们主要说一下基于opencv图片识别寻找控件坐标,pytest和接口不会的同学请看我的接口和pytest文章
2. 我们使用两个图,一个是移动端截图,一个是控件的图,如下:
- 接下来我们直接上代码
import cv2
import os
import time
#获取移动端图片
def screencap():
cmd = "adb root"
cmd1 = "adb shell /system/bin/screencap -p /sdcard/da.png"
cmd2 = "adb pull /sdcard/da.png "
os.system(cmd)
time.sleep(1)
os.system(cmd1)
time.sleep(2)
os.system(cmd2)
def _tran_canny(image):
"""消除噪声"""
image = cv2.GaussianBlur(image, (3, 3), 0)
return cv2.Canny(image, 50, 150)
def detect_displacement(img_slider_path, image_background_path):
"""detect displacement"""
# # 参数0是灰度模式
image = cv2.imread(img_slider_path, 0)
template = cv2.imread(image_background_path, 0)
# 寻找最佳匹配
res = cv2.matchTemplate(_tran_canny(image), _tran_canny(template), cv2.TM_CCOEFF_NORMED)
"""image:待搜索图像
template:模板图像
res:匹配结果
method:计算匹配程度的方法。
1、CV_TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
2、CV_TM_CCORR 相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
3、CV_TM_CCOEFF 相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
4、CV_TM_SQDIFF_NORMED 归一化平方差匹配法
5、CV_TM_CCORR_NORMED 归一化相关匹配法
6、CV_TM_CCOEFF_NORMED 归一化相关系数匹配法
# 最小值,最大值,并得到最小值, 最大值的索引
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# min_val, max_val, min_loc, max_loc 分别表示最小值,最大值,以及最小值和最大 值对应的图像中的位置,即是这个矩阵的最小值,最大值,并得到最大值,最小值的索引
# ret:cv2.matchTemplate()函数返回的矩阵
top_left = max_loc[0] # 横坐标
# 展示圈出来的区域
x, y = max_loc # 获取x,y位置坐标、
print(max_loc)
return max_loc
# w, h = image.shape[::-1] # 宽高
# cv2.rectangle(template, (x, y), (x + w, y + h), (7, 249, 151), 2)
# return top_left
if __name__ == '__main__':
screencap()
image_location = detect_displacement('xiao.png', 'da.png')
# 获取点击位置
cmd = "adb shell input tap {x} {y}".format(x=image_location[0], y=image_location[1])
# 模拟用户点击
os.system(cmd)
4.本文使用的是ADB,也可结合uiautomator2,https://blog.csdn.net/huage926/article/details/118752071?spm=1001.2014.3001.5501。