【appium疑难问题】使用appium图像定位时,会出现定位的图像不准确问题

前言

我们前面讲了一篇关于使用appium图像识别的文章,需要的朋友可以去查看. appium图像定位
我在使用的过程中发现返回的图像定位到的内容不是我想要的位置,最后尝试了很多次,总算是成功了,并且找到了问题原因.下面我们来仔细说一说.

1.关于英寸,像素, 分辨率

  • 英寸(inch): 英寸指的是屏幕对角的长度,例如iPhone 6Plus屏幕是5.5英寸。1英寸(inch) = 2.54厘米(cm)
  • 像素(Pixel):像素(Pixel)的全称为图像元素,缩写为px,是用来计算数码影像的一种单位,如同摄影的相片一样.数码影像也具有连续性的浓淡阶调,若把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,这些小方点就是构成影像的最小单位,即像素。
  • 分辨率:分辨率是相对于像素而言的,指的是屏幕显示的像素数量。般用屏宽像素数乘以屏高像素数来表示。例如,iPhone 7的屏幕分辨率为750x 1334像素,就是说iPhone 7的屏幕是由750列和1334行的像素点排列组成的。所以我们在计算分辨的时候,我们要知道它的宽度排列了多少像素点,它的高度排列了多少像素点.

2.图像识别返回不准确的问题

图像识别必须是基于同分辨率的,模版图像和参考图像如果分辨率不同,那么会导致图像定位得到的位置是错误的,或者定位不准确.
例如: 模版图像分辨率 750 x 1334,参考图像分辨率 375 x 667,那么图像识别到的位置就不会很准确.

3.可能出现问题的地方

  • appium的fixImageTemplateScale没有设置为true,如果没有设置的话,appium不会自动帮助你缩放参考图像.
  • 您的参考图像本身的分辨率就偏差很大,上面举例子说的两种分辨率是等比的,但是我们在电脑和手机之间获取的参考图像,它的分辨率其实不是等比的,这种情况下,不论你是用height还是width,它都无法准确的在模版图像中定位到你的参考图像.

4.解决的办法

  • 第一个问题,我们只需要给appium设置fixImageTemplateScale: true就好了.
    Ruby代码如下:
require 'appium_lib'

@caps = {...} # 填写自己的设备信息
@browser = Appium::Driver.new(@caps, false)
@driver = @browser.start_driver
# 设置fixImageTemplateScale就可以了
@driver.update_settings({ 
  getMatchedImageResult: true, 
  fixImageTemplateScale: true
})
  • 第二个问题,我们在获取参考图像的时候,尽量是用原设备截屏,就是说我们如果在mac电脑上面去截图模拟器的参考图像,那么你能观察到它的图像分辨率和我们在模拟器上直接截屏得到的参考图像分辨率完全不同的.并且电脑分辨率和模拟器分辨率它们不是等比关闭,就算你设置了defaultImageTemplateScale的缩放比例,它仍然无法完成准确找到参考图像所在位置.所以要解决这个问题,你就需要在模拟器上或者真机上面截屏,然后在通过图像软件截图我们想要的参考图像

5.优化

大家可以看到上面我们将问题解决了,但是又会出现一个新的问题,就是我们只能兼容一台设备的分辨率,如果换一台模拟器或者真机,我们的图像识别仍然会定位不准确.所以为此我们需要做一些兼容,让它尽可能的定位准确一些,至少能定位到我们的元素.
思路: 首先我们需要分析我们的应用,是height影响大还是width影响大,如果那个影响大就以那个为准,获取对应的比例值,因为我们的设备分辨率不一定都是等比例的,所以我们取影响最大的,这样我们去定位的时候能尽最大可能保证获取的图像位置能够点击到.

实现代码(Ruby):

require 'appium_lib'
require 'mini_magick'

@caps = {...} # 填写自己的设备信息
@browser = Appium::Driver.new(@caps, false)
@driver = @browser.start_driver

# 获取到当前设备的分辨率,然后基于我们截图的参考图像的height像素来算出我们的比例值
img_height = MiniMagick::Image.read(Base64.decode64(@driver.screenshot_as(:base64)))[:height].to_f
screen_factor = sprintf("%.2f",img_height / 1668).to_f 
# 设置fixImageTemplateScale就可以了
@driver.update_settings({ 
  getMatchedImageResult: true, 
  fixImageTemplateScale: true,
  defaultImageTemplateScale: "#{screen_factor}"
})

小结:
要实现一个参考图像在多台设备上都能运行,需要一下步骤:
1.先选取参考图像的像素,如我上面选择的height像素是1668作为基础像素
2.在每次打开设备后,获取到当前设备的分辨率
3.算取它的比例值,然后将参数设置到appium中, 参数{defaultImageTemplateScale: “#{screen_factor}”}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值