百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Airtest自动化测试——Airtest进阶和图像识别算法(上)

toyiye 2024-06-21 12:19 19 浏览 0 评论

1.Airtest进阶


1.1 提升脚本成功率


我们使用了图像识别的技术在当前游戏画面中查找对应的图片,然而图像识别并不能达到人眼识别的准确度,它只能尽可能地去寻找一个最符合预期的结果。这就经常导致了我们认为不存在的图片,它认为存在,或者我们认为在画面上一眼就能找到的内容,Airtest认为不存在 。


也就是说,图像识别不是万能的!!!它是有 成功率 的,假设一个脚本里有10张图片,每张图片的识别成功率都能达到95%之高,10张图片全部都正确识别的概率也不过60%而已。更何况,有许多图片因为种种原因,识别成功率远远低于95%这个值,要想脚本运行100%正确就更难了


改进点:


1. 截图时尽量 保证截取的图像辨识度高、独立清晰 ,例如截取一个按钮图像时,尽量不要带上太多的嘈杂

背景图案,避免在背景变化后难以成功识别的问题


2. 图像识别使用的算法 更适合用来识别按钮类(带边框)、图标类的图像 ,仅仅单独截取几个文字的识别成功率很低,请尽量调整图片截取内容来达到较好的识别效果,避免截取识别效果较差的内容


3. Airtest会尽可能地尝试适配 不同分辨率 的手机,但是在某些游戏上可能有自定义的分辨率适配规则,可以

根据自己游戏的分辨率适配情况来自定义,参考:

https://airtest.doc.io.netease.com/IDEdocs/airtest_framework/1_script_settings/


4. 若有大量重复的、非常相似的图标堆叠在一起时,有可能识别效果不佳,在我们眼中也许每一个图标上面的文字是不一样的,然而在Airtest的眼中它们实在是太相似了。我们可以尝试修改截图,借助一些其他的背景样式,修改成辨识度更高的图片


5. 尽管AirtestIDE提供了便捷的自动录制功能,能够直接将当前所有操作一步一步转换成代码,但是这种情况下自动截取的图片往往不太理想,需要手工再对截图进行调整


1.2 脚本相关设置


1.2.1 脚本代码修改属性


假如直接使用文本编辑器打开我们所编辑的Airtest脚本目录里的同名py文件,可以看到,每张图片都由类似这样的语句组成:

Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264))


直接在里面加入需要修改的值即可

Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264), threshold=0.6, target_pos=5, rgb=False)


图像识别阈值threshold(浮点类型):

threshold是用来判定一张图片识别是否成功的阈值,例如一张图片识别到的匹配度是0.65,

而我们设置的threshold为0.7的话,Airtest会认为匹配失败,从而进行下一次匹配。

通常来说,threshold设置得越高,图像识别的精度越高,但成功率也会有所降低,请根据自己的实际情况酌情设置。

取值范围为0~1之间,[0, 1],默认值是0.7。


图像点击位置target_pos(整型):

当识别出一张图像后,Airtest将会默认去点击图像的正中心位置,

有时我们希望它识别出图片后点击其他位置,可以通过修改target_pos属性来实现

在上图中,我们希望点击中间选项的“升级”按钮,不希望点到别的选项去,而只截出升级按钮不能满足我们的需求。

此时我们可以考虑将截图范围扩大到红色虚线框选的区域,截图后将这张方形图片视为一个九宫格,

方框上的每一个暗色红点都代表一个数字,将希望被点击的位置设置为target_pos的值即可。

在这个例子中,我们可以让截图区域的底部正好放在“升级”按钮上,然后设置target_pos=8即可正好点击到该按钮。

target_pos取值范围是1~9,[1, 9],且必须为整数,默认值是5(图像正中心)


切换彩色与灰度识别rgb(布尔值):

在识别图像时,Airtest会先将图像转为灰度图再进行识别。

因此假如有两个按钮,形状内容相同,只有颜色不同的情况下,Airtest将认为它们都是相同内容。

通过勾选rgb选项,或在代码中加入rgb=True,可以强制指定使用彩色图像进行识别


1.2.2 脚本全局设置


默认全局属性:

RESIZE_METHOD = staticmethod(cocos_min_strategy)

THRESHOLD = 0.7 # [0, 1]

THRESHOLD_STRICT = 0.7 # [0, 1]

OPDELAY = 0.1

FIND_TIMEOUT = 20

FIND_TIMEOUT_TMP = 3

PROJECT_ROOT = os.environ.get("PROJECT_ROOT", "") # for using other script


全局属性设置方法:

from airtest.core.api import *

# airtest.core.api中包含了一个名为ST的变量,即为全局设置

ST.THRESHOLD = 0.8


# 未指定图片threshold,默认使用ST.THRESHOLD中的0.8

touch(Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264)))


# 手工指定图片threshold,以图片设置的0.6为准

touch(Template(r"tpl1532588127987.png", record_pos=(0.779, 0.382), resolution=(407, 264), threshold=0.6))


属性值介绍:


1. RESIZE_METHOD

默认的分辨率适配规则(使用的是Cocos引擎的默认缩放规则)

from airtest.core.api import *

def custom_resize_method(w, h, sch_resolution, src_resolution):

return int(w), int(h)

# 替换默认的RESIZE_METHOD

ST.RESIZE_METHOD = custom_resize_method

上面的代码指定了一个自定义的缩放规则:直接return原来的值,不管屏幕分辨率,

所有UI都不进行缩放(有的游戏就是这种策略)。


2. THRESHOLD

THRESHOLD在上文中已经提到过,是图像识别的阈值,

除了能够设置单张图片的识别THRESHOLD值以外,还可以设置全局的THRESHOLD,让每一张图片都默认生效。

而设置中还有一个THRESHOLD_STRICT,这是一个更加严格的阈值设定,只用于assert_exists(图片)接口


3. OPDELAY

在我们的脚本中,每一个步骤的操作之间都会有一小段时间间隔,默认用OPDELAY进行设定。

OPDELAY默认值为0.1,即每一步操作后等待0.1秒,将它适当设置得大一些,可以在每次操作后停顿一小段时间,避免过快进行下一个操作导致不能成功的问题,但最好使用wait或者sleep在操作前增加等待



4. FIND_TIMEOUT

在每次进行图像查找时,如果一次查找不成功,将会再次进行截图-查找的循环,

直到超时才会停下来,超时时长为FIND_TIMEOUT,默认20秒。

还提供了一个FIND_TIMEOUT_TMP,默认只有3秒。在不同的截图接口中分别使用了这2个值:

使用了FIND_TIMEOUT作为图片查找超时时长的接口为:

touch

double_click

swipe(swipe支持从第一张图片滑动到第二张图片,此处只有第一张图片使用了FIND_TIMEOU)

wait(wait支持直接传入一个timeout参数,若没有指定timeout,默认使用FIND_TIMEOUT作为超时时长)

assert_exists

在另外一些对查找图片的要求较低的接口中,使用了时长较短的FIND_TIMEOUT_TMP:

swipe(如果第二个参数传入了图片,那么它将使用较短的查找时间)

exists

assert_not_exists


5. PROJECT_ROOT

可以通过设定一个默认项目根目录PROJECT_ROOT,让使用using接口时能够在当前根目录下寻找别的子脚本,无需填写完整路径,让脚本之间相互调用使用更加方便


6. 图像识别算法选择CVSTRATEGY

在Airtest中,提供了多种不同的图像识别算法,方法名列表有:

["tpl", "kaze", "brisk", "akaze", "orb", "sift", "surf", "brief"]。


具体每个算法的识别效果、内存占用等评估数据,可以参考Airtest/benchmark文档,在实际使用中,由于使用场景、图片分辨率大小以及手机类型的多寡不同,每个算法具体的表现优劣情况也有所不同,因此大家可以用自己的使用案例来进行算法的测试,选择更合适的算法。


在Airtest脚本中,使用以下代码来设定脚本中的图像匹配算法


1.3 模拟特殊按键


在脚本中,有时需要输入一些指定的按键,例如点一下HOME键、BACK键等,如果设备是Android设备,可以参考谷歌的 Android按键码 (国内用户如果打不开此链接,可直接以关键词:Android keyevent 搜索)。


示例:keyevent("KEYCODE_DEL") 或者直接输入按键码,注意参数为字符串:keyevent("67")


在Windows系统中,请参考 pywinauto 这个库提供的 Windows按键码


示例:keyevent("{BACKSPACE}")


iOS设备现在暂时 只支持 HOME 按键的keyevent。


android的按键参考:

https://developer.android.com/reference/android/view/KeyEvent


1.4 输入文字


在脚本中,如果想要实现文字输入,一般需要这样的流程:


1. 点一下你需要输入的位置,激活输入光标

2. 调用airtest的 text() 接口来输入内容

如图,在这个脚本里 先点击了需要输入的位置 ,然后调用了text接口进行输入,在运行时手机将会自动被安装一个名为 yosemite.apk 的应用,然后启用 yosemite输入法来进行输入。


而且需要注意的是,在使用过text接口后,手机输入法会被切换为yosemite输入法,因此看不到正常键盘了(无需惊慌)。如果需要手工输入,可以在系统的输入法设置中,把输入法切换回系统输入法即可恢复。同时我们也提供了 安卓手机助手功能 ,在手机助手中可以简单地点击鼠标来切换输入法。


1.5 局部截图/区域截图


局部截图或者说按坐标截图是大家经常会问到的问题,Airtest提供了 crop_image(img, rect) 方法可以帮助我们实现局部截图



# -*- encoding=utf8 -*-

__author__ = "AirtestProject"


from airtest.core.api import *

# crop_image()方法在airtest.aircv中,需要引入

from airtest.aircv import *


auto_setup(__file__)

screen = G.DEVICE.snapshot()


# 局部截图

screen = aircv.crop_image(screen,(0,160,1067,551))

# 保存局部截图到log文件夹中

try_log_screen(screen)


【未完待续】

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码