批量图像识别的快速遍历技巧

此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

一、前言

最近,不少同学在Q群中频繁提出疑问:在日常UI测试过程中,如何快速准确地识别页面上的多个元素,或在日常测试中,如何高效地遍历目标图片列表,以确认画面中是否包含特定元素?在官方交流Q群2群的lincoln同学给出了不错的方法思路,我们也获得了他的授权,现在我们一起来学习一下这个小技巧吧~

二、方法详解

lincoln同学提供了两个方法函数,其中一个是局部查找,一个是多重查找,我们就来看看他的一个函数逻辑是怎么样的吧。

代码逻辑的核心在于快速地识别目标图像。首先,将目标图像(最好是特征鲜明、尺寸小一些)列表输入Multiple_exists()函数。该函数通过循环执行截图操作,每0.2秒进行一次,以最小化循环识别时间。接着将设备屏幕截图和目标图像传递给match_in_predict_area()函数,进行裁剪和搜索。一旦找到匹配的图像,立即将坐标信息反馈给Multiple_exists()函数,并最终将图像编号和位置信息返回至主函数,供进一步使用。

可以看到当日常在跑游戏ui回归或APP回归的时候可以利用起来,当一个元素有多种ui表现形式或着需要判断多个元素的情况时,我们可以参考lincoln同学提供的方式,修改成自己想要的效果。

下面是lincoln同学的方法函数源码,大家可以参考一下:

def match_in_predict_area(template, screen=None, rect=None):  # 局部查找# logger = Gvar.loggerif screen is None:if G.DEVICE is None:raise Exception("G.DEVICE is none.")screen = G.DEVICE.snapshot()  # 截屏if screen is None:raise Exception("snapshot is none.")if rect is None:return template.match_in(screen)  # 如果没有指定区域,在整个屏幕中查找if not isinstance(rect, (list, tuple)):raise Exception("to crop a image, rect should be a list")else:# logger.debug("找到目标%s"%template.filename)predict_screen = aircv.crop_image(screen, rect)  # 图片裁切,根据指定区域裁剪屏幕focus_pos = template.match_in(predict_screen)  # 在裁剪后的图片中查找模板if not focus_pos:return False  # 如果没有找到匹配,返回Falseelse:return focus_pos[0]+rect[0], focus_pos[1]+rect[1]  # 返回匹配位置,加上裁剪区域的偏移# end if
# end defdef Multiple_exists(targets,area=None,threshold=0.80,rgb=False,inti=5):#多重查找# 根据设备方向确定宽度和高度if (G.DEVICE.display_info['orientation']%2):width = G.DEVICE.display_info['height']height = G.DEVICE.display_info['width']else:width = G.DEVICE.display_info['width']height = G.DEVICE.display_info['height']#end if# 尝试多次查找目标for i in range(inti):#Gvar.logger.debug('第%d次查找%s'%(i,targets))# 获取全屏截图fullScreen = G.DEVICE.snapshot()# 遍历每个目标for target in targets:#print("查找目标 %s"%target)if target :# 在预测区域内匹配目标,如果有元素固定出现的位置范围,可以传入,更进一步的减少识别时间focus_pos = match_in_predict_area(Template( '%d\%s.png'%(width, target),threshold=threshold, rgb=rgb),fullScreen, area)# 如果找到目标if focus_pos:#Gvar.logger.debug("找到目标 %s"%target)ref = targets.index(target)return ref,focus_pos#endif#end for# 每次查找间隔0.2秒sleep(0.2)
#end for# 如果所有尝试都失败,返回-1和(-1,-1)return -1,(-1,-1)
#end def Multiple_exists

三、实际使用案例

通过上述所讲的逻辑以及方式,我们这边给大家提供一个小小的使用案例,通过识别游戏画面内的三个元素是否都存在,从而去判断是否进入到我们需要的游戏画面。

参考代码如下:

# -*- encoding=utf8 -*-
__author__ = "Airtest"import os
from airtest.core.api import *
from airtest.aircv import *auto_setup(__file__)from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco(use_airtest_input=True, screenshot_each_action=False)def Multiple_exists(targets, area=None, threshold=0.80, rgb=False, inti=5):# 定义一个函数,用于检测多个目标是否存在# 参数说明:# targets: 目标列表# area: 搜索区域,默认为None(全屏)# threshold: 匹配阈值,默认为0.80# rgb: 是否使用RGB匹配,默认为False# inti: 尝试次数,默认为5次#新增找到的图片位置信息列表matches = []# 根据设备方向确定屏幕宽高if (G.DEVICE.display_info['orientation'] % 2):width = G.DEVICE.display_info['height']height = G.DEVICE.display_info['width']else:width = G.DEVICE.display_info['width']height = G.DEVICE.display_info['height']# 在指定的尝试次数内循环查找目标for i in range(inti):# 获取当前屏幕截图fullScreen = G.DEVICE.snapshot()# 遍历所有目标for target in targets:if target:# 构建目标图片的完整路径template_path = os.path.join(str(width), f"{target}.png")print(f"Trying to load template: {template_path}")# 在指定区域内查找目标focus_pos = match_in_predict_area(Template(template_path, threshold=threshold, rgb=rgb), fullScreen, area)#若找到图片则将当前图片出现的位置传入列表中if focus_pos:matches.append((targets.index(target), focus_pos))# 如果所有目标都找到,立即返回结果if len(matches) == len(targets):return matches# 如果未找到所有目标,等待0.2秒后继续下一次尝试sleep(0.2)# 返回找到的所有匹配结果return matches       def match_in_predict_area(template, screen=None, rect=None):  # 局部找图if screen is None:if G.DEVICE is None:raise Exception("G.DEVICE is none.")screen = G.DEVICE.snapshot()  # 获取设备屏幕截图if screen is None:raise Exception("snapshot is none.")if rect is None:return template.match_in(screen)  # 如果没有指定区域,在整个屏幕中查找if not isinstance(rect, (list, tuple)):raise Exception("to crop a image, rect should be a list")else:# logger.debug("找到目标%s"%template.filename)predict_screen = aircv.crop_image(screen, rect)  # 裁剪指定区域的图片focus_pos = template.match_in(predict_screen)  # 在裁剪后的图片中查找模板if not focus_pos:return False  # 如果没有找到匹配,返回Falseelse:return focus_pos[0]+rect[0], focus_pos[1]+rect[1]  # 返回匹配位置,加上裁剪区域的偏移if __name__ == "__main__":   #打开游戏,去确认是否游戏开始界面的元素已就位start_app("com.netease.dyll")sleep(1.0)poco(text="确定").click()touch([0.5,0.5])sleep(0.2)# 定义目标图片的路径列表targets = [r"D:/demo/pics.air/tpl1724135823600",r"D:/demo/pics.air/tpl1724135830426",r"D:/demo/pics.air/tpl1724135836266"]# 调用multiple_exists函数,查找游戏开始界面的图片识别情况result = Multiple_exists(targets)#     打印查找结果for i in range(len(result)):print("图片{}的位置是:{}".format(i+1,result[i]))# 判断是否已进入游戏开始界面if len(result) == len(targets) :print("确认已进入到游戏的开始界面")

四、总结

本周推文我们分享了来自官方交流Q群2群的lincoln同学的一个快速遍历找图的方法函数,这里再次感谢lincoln同学的分享,在函数内我们主要的一个减少识别时间的思路是通过截图当前设备画面,并进行裁切判断,从而避免整个设备屏幕范围内寻找元素。

如果大家有更多好用好玩的Airtest使用脚本,也欢迎大家给我们投稿,同时如果大家在使用Airtest过程中有一些其他新的使用方式或者遇到了问题,又或者有任何想要深入了解的知识点,欢迎在官方交流群(526033840)里告诉我们或者提交issue。


AirtestIDE下载:airtest.netease.com/
Airtest 教程官网:airtest.doc.io.netease.com/
搭建企业私有云服务:airlab.163.com/b2b

官方答疑 Q 群:526033840

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/785275.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统缓存可以删吗,删除系统缓存的方法有哪些

系统缓存是可以清理的,这些文件在长时间积累后可能会占用大量的磁盘空间,甚至影响电脑的性能。以下是一些清理C盘缓存的方法: 一、清理系统缓存 1.使用磁盘清理工具: 打开“此电脑”,右键点击C盘,选择“属性”。在“常规”选项卡中,点击“磁盘清理”。 系统将扫描C盘上的…

关于电脑晚上自动关机的问题,系统win11

前提:由于工作需要,有时需电脑在晚上仍能保持运行,但目前突然出现电脑晚上自动关机的情况,故需寻找解决方法。 解决方案:原文地址 方法:本次主要采取原文中所提及的方法二。 step1:搜索设备管理器step2:找到系统设备step3:在系统设备中找到Intel(R) Management Engine…

Vue 之混入(mixin)详细介绍

混入(mixin)提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项(如data、methods、mounted、filters等等)。 一、注册使用 1、在main.js中全局配置import mixin from ./mixinsVue.mixin(mixin)2、组件中配置 在日常的开发中,我…

Goby 漏洞发布|泛微 e-cology v10 appThirdLogin 权限绕过漏洞【漏洞复现】

漏洞名称:泛微 e-cology v10 appThirdLogin 权限绕过漏洞 English Name:Weaver e-cology v10 appThirdLogin Permission Bypass Vulnerability CVSS core: 7.5 漏洞描述: 泛微新一代数字化运营构建平台E10,是基于原eteams平台之上全新研发,同时融合了原E9产品的所有功能,…

[VS Code扩展]写一个代码片段管理插件(二):功能实现

@目录创建和插入代码片段代码片段列表代码片段预览代码片段编辑自定义映射默认映射自动完成项目地址 创建和插入代码片段 VS Code扩展提供了数据存储,其中globalState是使用全局存储的Key-Value方式来保存用户状态,支持在不同计算机上保留某些用户状态,详情请参考官方文档 若…

DLAFormer:微软提出多任务统一的端到端文本分析Transformer模型 | ICDAR 2024

论文提出新颖的基于Transformer的端到端方法DLAFormer,在统一的模型中集成多个文档布局分析任务,包括图形页面对象检测、文本区域检测、逻辑角色分类和阅读顺序预测。为了实现这一目标,将各种DLA子任务视为关系预测问题并提出了统一标签空间方法,使得统一关系预测模块能够有…

MySql Excel 数据导入

mysql工具:Navicat Premium 15 导入文件:file_Excel.xlsx 1.选择要导入到的表,右键选择导入向导,先择excel, 2.选择导入的数据文件,勾选excel的表名 3.设置字段选项,通配符 4.选择目标表,也可以自动新建表 5.字段对应关系展示,不匹配的会跳过 6.导入模式,追加或覆盖,…

Debian12+openresty1.25.3.2 部署 markdown在线编辑器 Editor.md

openresty的下载安装步骤参考: http://openresty.org/cn/linux-packages.html#debian 安装完成后:conf目录: /etc/openresty -> /usr/local/openresty/nginx/conf/html目录: /usr/local/openresty/nginx/htmlEditor.md 部署: cd /usr/local/openresty/nginx/htmlgit cl…

SLAB:华为开源,通过线性注意力和PRepBN提升Transformer效率 | ICML 2024

论文提出了包括渐进重参数化批归一化和简化线性注意力在内的新策略,以获取高效的Transformer架构。在训练过程中逐步将LayerNorm替换为重参数化批归一化,以实现无损准确率,同时在推理阶段利用BatchNorm的高效优势。此外,论文设计了一种简化的线性注意力机制,其在计算成本较…

神了!两个开源的高仿外卖项目!

大家好,我是 Java陈序员。 今天,给大家推荐两个高仿的外卖项目!关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。高仿饿了么 项目简介 vue2-elm —— 一个基于 Vue2 + Vuex 构建具有 45 个页面的高仿饿了么项目,涉及注册、登…

C++ wsl2 ubuntu 环境配置

目前学习C++,配合Ubuntu进行开发, IDE 使用Clion,这里记录一下环境准备 WSL2 C++一般是用在linux下,这里就用Ubuntu进行开发,考虑到window系统,这里准备用wsl2. 虚拟化 wsl2 要系统支持虚拟化,一般在bios中进行处理,成功之后,任务管理器 --> 性能适用于Linux的Wind…

监狱单位如何选择适合的FTP传输替代方案?

监狱单位是我国司法体系中的重要组成部分,监狱对于维持社会稳定也有重要作用。监狱的正常运作中,少不了文件的传输。由于监狱的封闭性和特殊性,所有传输到监狱的文件都需要经过严格的审核和登记手续,以确保文件的安全性和合法性。同时,监狱也会根据实际需要和规定对文件进…