一个截图引发的思考——实现APP区域截图及图片对比
创始人
2025-05-28 07:39:39

前言

许久没有更新博客,整理下学习与思考的笔记。
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的对象。

总结

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

相关内容

热门资讯

科技赋能|茶博士自主研发超临界... 12月18日,景东彝族自治县“两山”茶产业园在成立40周年之际迎来重要时刻——茶博士(云南)生物科技...
原创 精... 2026年马年将至,一马当先,马到成功,马上出发。 酒庄头条据李渡酒庄相关负责人透露,李渡酒庄将于2...
魔芋制品热门吃法:麻辣魔芋丝拌... 夏日的午后,或是忙碌过后,常常会觉得没什么胃口。不想动油烟,又需要一点能唤醒味觉的食物。这时,一碗麻...
名企游学第五期 | 走进来伊份... 当万亿规模的休闲零食赛道从增量步入存量深耕,同质化的货架与浮于表面的营销,已难以点燃消费者日益挑剔的...
珠海早茶天花板!人均 50 元... 🔥珠海早茶必打卡!十年老字号 “街坊蒸神”,凭实力霸占本地美食榜第一,本地人 N 刷不腻,游客慕名而...