***如果您只想了解图片的相似性,请看第一步
***如果您想了解appium如何基于图片识别点击坐标,则需要查看第一步,第二步和第三步
背景|进行UI测试时,我发现appium无法识别iOS自定义UI控件. 因此,考虑通过识别图片来找到坐标,然后通过单击坐标来解决问题
取决于python包| opencv,numpy,aircv
import aircv as ac def matchImg(imgsrc,imgobj,confidencevalue=0.5):#imgsrc=原始图像,imgobj=待查找的图片 imsrc = ac.imread(imgsrc) imobj = ac.imread(imgobj) match_result = ac.find_template(imsrc,imobj,confidence) # {‘confidence‘: 0.5435812473297119, ‘rectangle‘: ((394, 384), (394, 416), (450, 384), (450, 416)), ‘result‘: (422.0, 400.0)} if match_result is not None: match_result[‘shape‘]=(imsrc.shape[1],imsrc.shape[0])#0为高,1为宽 return match_result
说明: 通过aircv的find_template()方法返回匹配图片的坐标结果
1. 条目:
find_template(原始图像imsrc,要找到的imobj,最小相似性置信度)
2. 返回结果:
{‘confidence‘: 0.5435812473297119, ‘rectangle‘: ((394, 384), (394, 416), (450, 384), (450, 416)), ‘result‘: (422.0, 400.0)
置信度: 匹配相似率
矩形: 匹配原始图像四边形的坐标
结果: 在原始图片上匹配图片的中心坐标点,这就是我们要寻找的点击点
注意: 如果结果匹配置信度小于输入参数传递的相似性置信度,则将不返回任何内容,也将不返回任何字典
参考文件:
由于屏幕截图后PC上的分辨率与手机上的分辨率不同,并且第一步获得的坐标是屏幕截图在PC上的坐标点,因此通常要大得多比手机要多,所以它需要转换坐标
photo_position=self.driver.get_screenshot_as_file(imgfile)#截屏手机 x = self.driver.get_window_size()[‘width‘] y = self.driver.get_window_size()[‘height‘] size_width,size_height = x,y #获得手机d的宽高尺寸 confidencevalue = 0.8 # 定义相似度 position = matchImg(imsrc,imobj,confidence)# 用第一步的方法,实际就是find_template()方法 if position != None: x, y = position[‘result‘] shape_x, shape_y = tuple(map(int,position[‘shape‘])) position_x,position_y=int(photo_position_x+(photo_width/shape_x*x)),int(photo_position_y+(photo_height/shape_y*y)) self.driver.tap([(position_x, position_y)])
想法描述:
1. 通过appium方法driver.get_screenshot_as_file(文件名)获取屏幕截图
2. 通过appium的get_window_size获取宽度和高度字典,然后获取宽度和高度
3. 将PC上的屏幕截图与获取的手机屏幕截图进行匹配,然后返回匹配结果的坐标和PC上原始图像的大小
4. 通过PC上的屏幕截图如何寻找图片坐标点,手机屏幕的纵横比以及PC上的实际坐标点,获取手机上的实际坐标点.
5. 最后,通过appium方法drive.tap([x,y])单击手机上的坐标
注意: 为了匹配结果的准确性,最好在PC上拍摄原始图像1: 1的屏幕截图,请勿放大,否则相似性会更差
由于某些图片太小,如果它们在大图片上匹配,则它们通常不匹配. 如果您知道图片的大概位置如何寻找图片坐标点,则可以截取该区域的屏幕截图,然后进行匹配
有两种方法可以截取区域:
1. 根据appium定位的元素截屏
driver.find_element(*element).screenshot(imgfile)
2. 根据屏幕快照矩形左上角的坐标(x,y百分比)和宽度(高度)来截屏
Image.open(imgfile).crop((pc_location_x,pc_location_y,pc_location_x+pc_width,pc_location_y+pc_height)).save(imgfile)
首先捕获整个手机屏幕,然后根据百分比以及PC上屏幕截图的宽度和高度进行计算. 通过PILcrop()方法获取屏幕截图,以获取屏幕截图上的坐标
然后根据PC和手机上图片的比例获得手机上的坐标
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-202598-1.html
基本是精英了