以下基于
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。
---------------------------------------------------------------------------------
关注微信公众号即可在手机上查阅,并可接收更多测试分享~