一个截图引发的思考——实现APP区域截图及图片对比

前言

许久没有更新博客,整理下学习与思考的笔记。
Uiaotomator2有两种截图方法,一种是整个截图,一种是元素截图,但是没有坐标截图,本篇文章将带领探索如何实现坐标截图。

初始代码

以下探索都建立在这代码基础上

import uiautomator2 as u2
d = u2.connect_usb()

一、基本截图方法

首先我们需要了解Uiautomator2的截图方法,从中探索是否有可利用的方法。
1、整个截图:d.screenshot()
效果如下:
在这里插入图片描述
2、text定位截图:d(text=目标文本).screenshot()
示例代码:d(text=’淘宝’).screenshot()
效果如下:
在这里插入图片描述
3、Xpath截图:d.xpath(目标元素的xpath).screenshot()
示例代码:d.xpath(‘//*[@text="淘宝"]’).screenshot()
效果同text定位
4、uiautomator2不仅支持xpath跟text以及全局截图,还支持通过claassName与resourceId进行定位截图

二、查看全局截图的源码及分析

全局截图代码
1.分析代码逻辑
①使用uiautomator2内部的http去请求获取屏幕的内容,获取到了之后进行图片的返回。
在调用screenshot()不传入参数的时候,默认参数是format=’pillow’,返回个Image.image的对象,需要使用save()方法进行保存。
②传入参数filename=’需要保存的名称’,则默认使用pillow的格式进行保存。保存到的文件名为传入的filename,对比①的方法省略了save的步骤。
③传入参数format=’opencv’,返回的则是numpy.ndarray的数据类型
④传入参数format=’raw’,返回的则是byte的数据类型
综上,在全屏截图中没有发现到对坐标截图有帮助的信息,需要继续查看元素坐标来发现线索。

三、元素截图源码查看及分析

在这里插入图片描述
从screentshot()点击进去,调用的是UiObject的类,查看初始化方法,需要传session,selector。
通过session来与手机进行关联,并通过selsector进行元素的选择。
在这里插入图片描述
元素截图建立在全屏截图的基础上,不难发现,元素截图的原理是全屏截图之后使用crop的方法进行裁剪,裁剪的范围由bounds()方法来获取。
在这里插入图片描述
查看bounds(),看到这里就清晰了,bounds()负责返回info中获取到的上下左右的坐标,与需求类似。
需求到此就解决了,只需要重写一下方法,直接传递坐标范围进行裁剪即可。

四、代码实现

在这里插入图片描述
参考元素截图的方法,初始化方法传入session参数,即与手机建立的连接,初始代码中的d,由于不需要通过元素来获取坐标了,所以不需要传入selector了。bounds()方法直接传入坐标,不从info中获取坐标位置。

五、坐标获取

在这里插入图片描述
position中显示的位置为左侧绿框中的点的位置,默认为屏幕的百分比的位置,点击position旁边的百分比号可以切换成坐标号,我们需要传入的参数是坐标,所以需要点击百分比号来进行切换。
在这里插入图片描述
如图,点击百分比号切换成百分比号,切换成的坐标就记录做lx与ly。
在这里插入图片描述
记录右侧低点的坐标为rx,ry。
坐标传入代码进行截图即可,实现效果如下:
在这里插入图片描述

六、图片一致性比对

使用场景:在图片没有淡出淡入的时候,进行比对图片是否完全一致时可用
使用到的python库:PIL
安装方法:pip install pillow
图片对比使用到了PIL中的Image与ImageChops模块
在这里插入图片描述
Image.open打开目标的图片文件,使用ImageChops.difference()来进行对比。
ImageChops.difference()在两张图片完全一致的时候返回None,在存在差异时返回差异点的坐标。

七、图片相似度对比

使用场景:存在toast时进行对比或者仅对比相似度时可用
使用到的库:opencv,skimage,numpy
opencv与numpy下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib
由于opencv与numpy使用pip时会出现安装不上以及无法下载的异常情况,故在如上网站搜索opencv与numpy的wheel包,找到对应的python版本后进行安装即可。
注意:numpy下载vanilla的版本

skimage安装方式:pip install scikit-image

在这里插入图片描述
代码实现如上。使用了skimage库中的structural_similarity()方法来进行相似度的比较,结果会返回相似度的比例。structural_similarity()需要传入的对象是numpy.ndarray类型的对象,cv2图片转灰度后,返回的对象为numpy.ndarray的对象。

总结

当想要在原因基础上实现新的功能时,可以先看看源码,可能会有一些意外的收获。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值