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篇文章的灯泡图片

Airtest API精讲之swipe()

Airtest API精讲之swipe()

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

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

Airtest API精讲之swipe()

Airtest API精讲之swipe()

操作完之后会生成如下

Airtest API精讲之swipe()

 Airtest API精讲之swipe()

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

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

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

Airtest API精讲之swipe()

 

 

Airtest API精讲之swipe()

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

Airtest API精讲之swipe()

 

 

Airtest API精讲之swipe()

在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删掉,点击左上截屏按钮,框选灯泡图片

Airtest API精讲之swipe()

 

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)

 

Airtest API精讲之swipe()

Windows平台

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

 

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

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

Airtest API精讲之swipe()

上一篇:2021-10-23


下一篇:vector学习笔记