注:我们的 Airtest 官方公众号(AirtestProject)会持续更新大家对于 Airtest 感兴趣的问题,欢迎有需要的同学关注并查看我们更多的内容。
如想向我们反馈关于 AirtestProject 想了解的问题,欢迎到公众号后台留言。
如同点击操作一样,滑动操作也是测试过程中非常常用的操作。下文将向大家讲述Airtest
和poco
下的swipe
如何使用以及应用swipe
解决跳过 APP 介绍页和连续滑动等实际应用的问题。
swipe
接口实现在当前设备画面上进行一次滑动操作,它支持的平台有Android
、IOS
和Windows
。参数如下:
kwargs
swipe
有两种传入参数的方式:
swipe(v1, v2)
,例如:
swipe((672,1214),(336,1305))
swipe(v1, vector=(x, y))
,例如:
swipe(Template(r"tpl1574067097045.png", record_pos=(0.042, 0.145), resolution=(1080, 1920)), vector=[-0.2666, -0.0005])
当没有足够的参数来执行滑动时会引发Exception
,比如当我们只向 swipe 接口传入 1 个参数时,运行报告就会如下图所示:除了上述参数以外,swipe
在Android
和IOS
平台下,还有几个比较特别的参数:
如果你想自定义滑动,比如把滑动时长改为 1,滑动步数改为 6,并且用两只手指滑动,可以向下面这样依次把参数传进去:
swipe((672,1214),(336,1305),duration=1,steps=6,fingers=2)
与Android
和IOS
平台不同的是,Windows
平台下的swipe
接口只有duration
和steps
这俩个平台相关的参数;并且duration
默认为 0.8。
在poco
框架下,swipe
是从一个 UI 开始,滑动到某个点或朝着某个方向滑动一段距离。
我们既可以选中 UI 来执行swipe
,也可以不选中 UI 执行swipe
:
# coding=utf-8
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
# 选中UI执行swipe
# 向上滑动列表视图
poco('Scroll View').swipe([0, -0.1])
# 与上面这条代码一样, 并且还可以传入down/left/right
poco('Scroll View').swipe('up')
# 向下滑动列表视图
poco('Scroll View').swipe('down')
# 不选中UI执行swipe
x, y = poco('Scroll View').get_position()
end = [x, y - 0.1]
dir = [0, -0.1]
# 从点A滑动到点B
poco.swipe([x, y], end)
# 从点A沿着一定的方向滑动一段距离
poco.swipe([x, y], direction=dir)
当选中 UI 执行swipe
时,swipe
默认的起点是选中 UI 的锚点(即 UI 的中心点),那么只要像上述代码一样,给swipe
传入一个终点坐标或者滑动方向和距离即可。
当不选中 UI 执行swipe
时,就需要给swipe
传入完整的起点和终点坐标,或者传入起点以及移动方向和距离,就像上述代码展示的一样。另外poco
的swipe
还可以按比例滑动,这一点与Airtest
的滑动是不一样的:
poco.swipe([0.9,0.5], [0.1,0.5])
在poco
中,还有与swipe
接口非常相似的一个 UI 操作 -- 拖动(drag_to
)。它是从一个 UI 到另一个 UI,本质上,拖动是滑动的特殊情况。
如图,我们想要把星星拖动到贝壳里,这时候我们就会使用到drag_to
:
# coding=utf-8
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
# 把“星星”拖动到“贝壳”上
poco('star').drag_to(poco('shell'))
在考拉 app 打开后,有 4 个介绍页需要滑动后才能进去。如果我们通过airtest/poco
的 UI 测试语句,需要运行半天。但如果执行四下固定坐标位置滑动,则可以很容易跳过这四个介绍页。
要注意的是,这里坐标脚本的连续运行操作得太快,设备有可能会反应不过来,一般每行语句后面需要加一下sleep(1.0)
,等待一下设备响应。
如果这种情形非常多的话,可以封装成通用的函数,用到的时候调用一下即可。 省代码 + 快速~
# 获取设备的高度和宽度
width, height = device().get_current_resolution()
# 校准滑动的起点和终点
start_pt = (width * 0.9, height / 2)
end_pt = (width * 0.1, height / 2)
# 滑动5次:
for i in range(5):
swipe(start_pt, end_pt)
sleep(1) # 等待设备的响应
当然,除了自己计算分辨率和坐标,然后使用Airtest
的swipe
来执行,我们还可以使用poco
下swipe
的按比例滑动来跳过这几个介绍页:
for i in range(5):
poco.swipe([0.9,0.5], [0.1,0.5])
sleep(1) # 等待设备的响应
这样看起来似乎帮我们省去了获取设备高度宽度以及计算滑动坐标的步骤,但实际上运行速度会大大降低:
所以如果比较在意运行速度的话,还是选用Airtest
的swipe
会好一些。
有些时候在安卓手机上面,我们需要实现连续滑动多个点的操作(例如屏幕滑动图案解锁功能),我们提供了一个 swipe_along
操作,示例代码如下:
from airtest.core.api import *
dev = device() # 获取当前手机设备
# 手指按照顺序依次滑过3个坐标
dev.minitouch.swipe_along([(100, 100), (200, 200), (300, 300)])
点击选项--设置--勾选实时坐标显示
,即可让手机屏幕的绝对坐标显示在画面上,右键点击鼠标还能将坐标复制到剪贴板中,这样可以很方便地实现一些在坐标间滑动的需求,如图:
请注意这个接口目前只有在使用了默认的 minitouch
模式时才能使用。
最后,如果大家对 Airtest 有疑问、BUG、建议,请到https://github.com/AirtestProject/AirtestIDE/issues 发布 issue,我们会有专人解答。同时,我们还提供了官方 QQ 群给大家沟通交流,目前 1 群已满,欢迎大家加入 2 群: