• Airtest API精讲之swipe()


    上期回顾:Airtest API精讲之touch()


    以下基于
    python3.8;airtestIDE1.2.11;airtest1.2.2;pocoui1.0.83

    首先明确一点,我们今天要讲的是Airtest框架的touch(),不是Poco框架的,一般我们说Airtest,其实应该指的是Airtest Project,具体这些概念的关系是什么,可以看之前文章:Airtest Project——UI自动化利器介绍

    swipe()的文档之前在Airtest核心API汇总已经写过,这里再复制一遍

    swipe(v1, v2=None, vector=None, **kwargs)
    在当前设备画面上进行一次滑动操作。
    有两种传入参数的方式

    1swipe(v1, v2=Template(...)) # 从 v1 滑动到 v2
    2swipe(v1, vector=(x, y)) # 从 v1 开始滑动,沿着vector方向。

    参数:
    v1 – 滑动的起点,可以是一个Template图片实例,或是绝对坐标 (x, y)
    v2 – 滑动的终点,可以是一个Template图片实例,或是绝对坐标 (x, y)
    vector – 滑动动作的矢量坐标,可以是绝对坐标 (x,y) 或是屏幕百分比,例如 (0.5, 0.5)
    **kwargs – 平台相关的参数 kwargs,请参考对应的平台接口文档

    引发:
    Exception – 当没有足够的参数来执行滑动时引发异常

    返回:
    原点位置和目标位置

    支持平台:
    Android, Windows, iOS

    在讲实际用法前,我们先来看下swipe()的源码:

     1# 文件位置:your_python_path/site-packages/airtest/core/api.py
    2def swipe(v1, v2=None, vector=None, **kwargs):
    3    if isinstance(v1, Template):
    4        pos1 = loop_find(v1, timeout=ST.FIND_TIMEOUT)
    5    else:
    6        try_log_screen()
    7        pos1 = v1
    8
    9    if v2:
    10        if isinstance(v2, Template):
    11            pos2 = loop_find(v2, timeout=ST.FIND_TIMEOUT_TMP)
    12        else:
    13            pos2 = v2
    14    elif vector:
    15        if vector[0] <= 1 and vector[1] <= 1:
    16            w, h = G.DEVICE.get_current_resolution()
    17            vector = (int(vector[0] * w), int(vector[1] * h))
    18        pos2 = (pos1[0] + vector[0], pos1[1] + vector[1])
    19    else:
    20        raise Exception("no enough params for swipe")
    21
    22    G.DEVICE.swipe(pos1, pos2, **kwargs)
    23    delay_after_operation()
    24    return pos1, pos2

    swipe支持点击坐标或图片,所以前两个参数v既可以是一个Template图片实例,也可以是一个绝对坐标(x, y)。

    • 传入图片的情况,如果你是使用的AirtestIDE,只需简单操作,IDE会自动帮你生成Template实例代码(swipe在AirtestIDE中的用法可以看AirtestIDE基本功能(一))。如果你不是通过AirtestIDE自动生成代码,而想自己写,或者在生成之后还想改下代码,可以看之前的Template文章Airtest-API精讲之Template

    • 如果是传入的绝对坐标,写成tuple(x,y)或list[x,y]都可以。

    第3行if isinstance(v, Template)判断第一个v是不是Template,如果是图片,则通过loop_find()找到坐标并赋值给pos1(loop_find的逻辑可以看之前文章Airtest源码分析--图像识别整体流程),如果是坐标则直接赋值给pos1。

    第9行if v2:判断有没有传v2参数,因为swipe的终点参数可以是v,也可以是一个向量vector。

    第10行if isinstance(v2, Template):,如果传了v2,则判断v2是不是Template,之后的逻辑同v1一样。

    第14行elif vector:,判断有没有传vector参数。

    第15行if vector[0] <= 1 and vector[1] <= 1:,如果传了vector参数,且是传的相对坐标,则在第16、17行将相对坐标换算成绝对坐标,赋值给vector。

    第18行pos2 = (pos1[0] + vector[0], pos1[1] + vector[1]),将向量绝对坐标(直接传入或是上面换算的)+v1的绝对坐标,得出pos2基于整个屏幕的绝对坐标。

    第20行raise Exception("no enough params for swipe"),既没有传入v2,也没传入vector,则报错提示缺少参数。

    第22行G.DEVICE.swipe(pos1, pos2, **kwargs),执行当前设备的swipe()方法,Android、Windows、iOS的swipe内部逻辑是不一样。

    第24行return pos1, pos2,返回坐标,这个主要是针对传入图片的情况。

    从源码我们可以看出,最基本的swipe,还是分别传入开始/结束绝对坐标;也支持开始/结束点是图片的情况;还支持从一个图片/坐标向一个相对方向滑动,这个相对方向可以是绝对坐标,也可以是相对坐标。

    实例演示

    以公众号:测试工程师小站的文章列表为例,开始点是第2篇文章的黄色图片,结束点是第1篇文章的灯泡图片

    图片

    1. 传入v1是图片,vector是相对坐标向量
    这种方式是AirtestIDE默认的录制方式,操作方法:点击‘swipe’按钮,在手机屏幕上拖动选取要识别的图片,选择完后,在向要滑动的地方点击一下。

    这里我就不演示了,放一张以前教学的动图

    图片

    操作完之后会生成如下

    图片

     

    1# 代码模式
    2swipe(Template(r"start.png", record_pos=(0.055, 0.478), resolution=(1080, 2340)), vector=[0.2117, -0.3541])

    AirtestIDE截图后的图片名称都是一串数字,为了好理解,我改了图片名称,怎么改图片名称可以看这:AirtestIDE高级功能

    点击运行(为了方便查看,我在手机Android开发者选项中打开了坐标显示)

    图片

    2. 传入v1是图片,vector是绝对坐标向量

    图片

    在AirtestIDE设置中选中‘实时坐标显示’,我们可以看到A点(560,1850),B点(820,1030)

    那么A点到B点的向量x=820-560=260,A点到B点的向量y=1030-1850=-820,y为什么是负数,请复习初中的坐标系数学知识,你只需要记住如果是往左,x就是负数;往上,y就是负数。

    我们只要把算出来的绝对坐标替换掉vector中的相对坐标即可

    1# 代码模式
    2swipe(Template(r"start.png", record_pos=(0.055, 0.478), resolution=(1080, 2340)), vector=[260, -820])

    3. 传入v1是绝对坐标,vector是绝对坐标向量
    我们只需要把方法2中的v1改成A点绝对坐标即可

    1# 代码模式
    2swipe((560,1850), vector=[260, -820])

    4.传入v1是绝对坐标,vector是相对坐标向量

    1# 代码模式
    2swipe((560,1850), vector=[0.2117, -0.3541])

    5. 传入v1是图片,v2是图片
    在AirtestIDE中,我们把vector删掉,点击左上截屏按钮,框选灯泡图片

    图片

    1# 代码模式
    2swipe(Template(r"start.png", record_pos=(0.055, 0.478), resolution=(1080, 2340)), Template(r"end.png", record_pos=(0.252, -0.109), resolution=(1080, 2340)))

    6. 传入v1是图片,v2是绝对坐标
    把v2换成绝对坐标,即B点

    1# 代码模式
    2swipe(Template(r"start.png", record_pos=(0.055, 0.478), resolution=(1080, 2340)), (820,1030))

    7. 传入v1是绝对坐标,v2是图片
    把v1换成绝对坐标,即A点

    1# 代码模式
    2swipe((560,1850), Template(r"end.png", record_pos=(0.252, -0.109), resolution=(1080, 2340)))

    8. 传入v1是绝对坐标,v2是绝对坐标

    1# 代码模式
    2swipe((560,1850), (820,1030)

    Android和IOS平台

    除了上述参数以外,swipe在Android和IOS平台下,还有几个比较特别的参数:

    • duration – 在屏幕上滑动的时长,默认是0.5

    • steps – 滑动过程中的步数,默认为5

    • fingers – 滑动的手指数量,1或者2,默认为1

    示例:滑动3秒,滑动5步,并且用两只手指滑动

    1swipe((150,1000),(900,1200),duration=3,steps=5,fingers=2)

    图片

    Windows平台

    与Android和IOS平台不同的是,Windows平台下的swipe接口只有duration和steps这俩个平台相关的参数;并且duration默认为0.8。

    ---------------------------------------------------------------------------------

    关注微信公众号即可在手机上查阅,并可接收更多测试分享~

  • 相关阅读:
    Android中得到布局文件对象有三种方式
    android中的键值对
    .length()与.length与.size()
    异常处理
    Python操作Excel
    写一个简单的爬虫(博客)
    开发一个登录接口(Mysql)
    常用模块
    内置函数
    装饰器
  • 原文地址:https://www.cnblogs.com/songzhenhua/p/15452282.html
Copyright © 2020-2023  润新知