专栏文章 使用 Airtest 最常遇到的几个需求,都帮你们实现好了

fishfish-yu · 2020年05月26日 · 最后由 fishfish-yu 回复于 2020年06月01日 · 6433 次阅读

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

前言

本文目录:

  • 1.绝对坐标和相对坐标的切换
  • 2.局部截图
  • 3.局部找图
  • 4.指定截图保存的路径和名称
  • 5.删除指定截图和删除多余图片

1.绝对坐标和相对坐标的切换

用代码实现绝对坐标和相对坐标之间的切换,我们需要先获取当前设备的屏幕分辨率:

# 获取设备屏幕分辨率(竖屏)
height = G.DEVICE.display_info['height']
width = G.DEVICE.display_info['width']

# 已知绝对坐标[311,1065],转换成相对坐标
x1 = 311/width
y1 = 1065/height
poco.click([x1,y1])

# 已知相对坐标[0.3,0.55],转换成绝对坐标
x2 = 0.3*width
y2 = 0.55*height
touch([x2,y2])

# 如果是横屏设备的话,则分辨率如下
height = G.DEVICE.display_info['width']
width = G.DEVICE.display_info['height']

我们还可以用下述方式,判断当前屏幕为横屏还是竖屏,并获取当前屏幕的分辨率:

if G.DEVICE.display_info['orientation'] in [1,3]:
    height = G.DEVICE.display_info['width']
    width = G.DEVICE.display_info['height']
else:
    height = G.DEVICE.display_info['height']
    width = G.DEVICE.display_info['width']

小技巧

IDE 自带查看当前设备坐标的方法(仅适用于 Android、iOS 真机以及模拟器设备)

(查看绝对坐标)

(查看相对坐标)

2.局部截图

局部截图或者说按坐标截图是大家经常会问到的问题,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)

结果如图:

3.局部找图

局部找图的步骤:

  • 进行局部截图
  • 定义要查找的目标截图对象
  • 利用 match_in 方法,在局部截图中查找指定的截图对象
from airtest.core.api import *
from airtest.aircv import *
auto_setup(__file__)

screen = G.DEVICE.snapshot() 
# 局部截图
local_screen = aircv.crop_image(screen,(0,949,1067,1500))

# 将我们的目标截图设置为一个Template对象
tempalte = Template(r"png_code/设置.png")
# 在局部截图里面查找指定的图片对象
pos = tempalte.match_in(local_screen)

# 返回找到的图片对象的坐标(该坐标是相对于局部截图的坐标)
print(pos)

# 若要返回目标在整个屏幕中的坐标,则x,y都需要加上局部截图时设置的最小x、y
print(pos[0]+0,pos[1]+949)

上述代码中,我们用到了 Template 类和这个类里面的 match_in() 方法:

详情可以参考链接:https://airtest.readthedocs.io/zh_CN/latest/all_module/airtest.core.cv.html?highlight=TEMPLATE#airtest.core.cv.Template

小技巧

局部找图相比于全局找图,可以提高一定的查找效率。

4.指定截图保存的路径和名称

如果是对当前设备的屏幕进行截图,并将截图保存在自定义路径下,可以用下述方式实现:(假设保存在"D:/test/" 目录下,命名为 "首页.png"

screen = G.DEVICE.snapshot()  
pil_img = cv2_2_pil(screen)
pil_img.save("D:/test/首页.png", quality=99, optimize=True)

而对于 touchassert_existswait 之类的截图脚本,默认是保存在 .air 文件夹内,与 .py 文件在一起的:

如果需要修改此类截图脚本中截图文件的名称,我们可以双击对应截图打开 图片编辑器 ,然后将 filename 改成自定义的名字即可:

改完之后,.air 文件夹内就会出现你自定义名称的截图副本,原名字的截图文件可以清理掉:

特别注意:如果我们右键切换代码模式,再手动去修改代码中截图文件的名称,实际上并不会自动修改到 .air 文件夹下面对应截图文件的名称。
除非你再手动把 .air 文件夹对应截图的名字改了。所以我们非常不建议用这种方式来修改截图文件的名称。

5.删除指定截图和删除多余截图

Airtest 没有提供删除指定截图的 API,但是 python 提供了 remove() 方法,可以帮助我们删除指定路径的截图文件。

os.remove("unity_demo.png")

该方法必须传入的参数是要移除的文件路径。

另外需要注意的是,截图脚本对应的截图文件是不能够随意删除的,除非你不再需要用到某条截图脚本,那对应的截图文件才可以被删掉。

如果误删了截图脚本对应的截图文件,则执行脚本时会报 airtest.aircv.error.FileNotExistError: File not exist: 的错误:

小技巧

很多时候,我们在 IDE 的脚本编辑窗口中删除了一些截图脚本,但这些截图脚本的截图文件却依旧保存在 .air 的文件夹中,此时我们可以通过 IDE 自带的 删除多余图片 的功能,帮助我们快速删除这些多余的截图文件:

右键点击脚本名称,选择删除多余图片即可,成功删除后,IDE 窗口的右下角会提示:


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

关注下方公众号,可以查看更多往期教程,回复 “交流群” 可以加入我们的官方开发者交流群

共收到 2 条回复 时间 点赞

学习啦!!!🙉 🌈

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册