zoukankan      html  css  js  c++  java
  • 使用Airtest最常遇到的几个需求,都帮你们实现好了

    前言

    本文目录:

    • 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)

    而对于 touch 、assert_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官网:http://airtest.netease.com/
    Airtest教程官网:https://airtest.doc.io.netease.com/
    搭建企业私有云服务:https://airlab.163.com/b2b

  • 相关阅读:
    山东第一届省赛1001 Phone Number(字典树)
    HD2222 Keywords Search(AC自动机入门题)
    POJ 1947Rebuilding Roads(树形DP + 01背包)
    zoj 3946 Highway Project(最短路 + 优先队列)
    HDU5672String(尺标法)
    HDU5671Matrix(矩阵行列交换)
    HDU5670Machine(抽象进制)
    用户体验评价
    团队冲刺第二阶段-6
    第十四周学习进度
  • 原文地址:https://www.cnblogs.com/AirtestProject/p/12966883.html
Copyright © 2011-2022 走看看