Airtest和Poco下的滑动操作

版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途
此文章来源于项目官方公众号:“AirtestProject”

前言

如同点击操作一样,滑动操作也是测试过程中非常常用的操作。下文将向大家讲述Airtestpoco下的swipe如何使用以及应用swipe解决跳过APP介绍页和连续滑动等实际应用的问题。

Airtest下的swipe接口

swipe接口实现在当前设备画面上进行一次滑动操作,它支持的平台有AndroidIOSWindows。参数如下:

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

swipe有两种传入参数的方式:

  • 从 v1 滑动到 v2,swipe(v1, v2) ,例如:
swipe((672,1214),(336,1305))
  • 从 v1 开始滑动,沿着vector方向,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个参数时,运行报告就会如下图所示:

image

Android和IOS平台

除了上述参数以外,swipeAndroidIOS平台下,还有几个比较特别的参数:

  • duration – 在屏幕上滑动的时长,默认是0.5
  • steps – 滑动过程中的步数,默认为5
  • fingers – 滑动的手指数量,1或者2,默认为1

如果你想自定义滑动,比如把滑动时长改为1,滑动步数改为6,并且用两只手指滑动,可以向下面这样依次把参数传进去:

swipe((672,1214),(336,1305),duration=1,steps=6,fingers=2)
Windows平台

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

poco下的swipe接口

poco框架下,swipe是从一个UI开始,滑动到某个点或朝着某个方向滑动一段距离。
我们既可以选中UI来执行swipe,也可以不选中UI执行swipe

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CpinupTq-1581858508357)(https://poco-chinese.readthedocs.io/zh_CN/latest/_images/scroll1.gif)]

# 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传入完整的起点和终点坐标,或者传入起点以及移动方向和距离,就像上述代码展示的一样。另外pocoswipe还可以按比例滑动,这一点与Airtest的滑动是不一样的:

poco.swipe([0.9,0.5], [0.1,0.5])
滑动的特殊情况–拖动(darg_to)

poco中,还有与swipe接口非常相似的一个UI操作–拖动(drag_to)。它是从一个UI到另一个UI,本质上,拖动是滑动的特殊情况。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yv84ouTz-1581858508359)(https://poco-chinese.readthedocs.io/zh_CN/latest/_images/drag_to.png)]

如图,我们想要把星星拖动到贝壳里,这时候我们就会使用到drag_to

# coding=utf-8

from poco.drivers.unity3d import UnityPoco

poco = UnityPoco()

# 把“星星”拖动到“贝壳”上
poco('star').drag_to(poco('shell'))

应用swipe的特殊场景

应用swipe跳过APP的介绍页

在考拉app打开后,有4个介绍页需要滑动后才能进去。如果我们通过airtest/poco的UI测试语句,需要运行半天。但如果执行四下固定坐标位置滑动,则可以很容易跳过这四个介绍页。

要注意的是,这里坐标脚本的连续运行操作得太快,设备有可能会反应不过来,一般每行语句后面需要加一下sleep(1.0),等待一下设备响应。

image

如果这种情形非常多的话,可以封装成通用的函数,用到的时候调用一下即可。 省代码+快速~

# 获取设备的高度和宽度
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)  # 等待设备的响应

当然,除了自己计算分辨率和坐标,然后使用Airtestswipe来执行,我们还可以使用pocoswipe的按比例滑动来跳过这几个介绍页:

for i in range(5):
    poco.swipe([0.9,0.5], [0.1,0.5])
    sleep(1)  # 等待设备的响应

这样看起来似乎帮我们省去了获取设备高度宽度以及计算滑动坐标的步骤,但实际上运行速度会大大降低:
image
所以如果比较在意运行速度的话,还是选用Airtestswipe会好一些。

应用swipe_along实现连续滑动

有些时候在安卓手机上面,我们需要实现连续滑动多个点的操作(例如屏幕滑动图案解锁功能),我们提供了一个 swipe_along 操作,示例代码如下:

from airtest.core.api import *
dev = device()  # 获取当前手机设备
# 手指按照顺序依次滑过3个坐标
dev.minitouch.swipe_along([(100, 100), (200, 200), (300, 300)])

点击选项--设置--勾选实时坐标显示,即可让手机屏幕的绝对坐标显示在画面上,右键点击鼠标还能将坐标复制到剪贴板中,这样可以很方便地实现一些在坐标间滑动的需求,如图:

image

请注意这个接口目前只有在使用了默认的 minitouch 模式时才能使用。

<think>我们正在讨论Airtest框架中的滑动操作实现方法。根据引用内容,特别是引用[3]提到了移动端小游戏自动化测试中的寻路问题,其中涉及滑动操作。 引用[3]指出:“如果什么图像都没有,那建议使用拖拽的办法,屏幕长按移动的中间位置,点击鼠标后向右滑动且不松手。这个在airtest或appium中均有办法实现,实在不行,还可以用adb来实现。” 在Airtest中,滑动操作通常使用`swipe`方法。该方法的基本语法是: `swipe(start_pos, end_pos, duration=0.5, steps=5)` 其中: - start_pos: 滑动的起始位置,可以是坐标(x,y)或图片(Airtest会尝试在屏幕上找到该图片并以其中心作为起始点) - end_pos: 滑动的结束位置,同样可以是坐标(x,y)或图片 - duration: 滑动持续时间,单位秒(默认0.5秒) - steps: 滑动过程的步数(默认5步) 此外,Airtest还提供了`swipe_along`方法,用于沿着给定的路径滑动(多个点)。 根据引用[4]中提到的xpath定位方式,我们知道在Web自动化测试中,Airtest-Selenium结合使用,但滑动操作通常用于移动端,因此我们主要参考移动端的API。 实现步骤: 1. 确定起始点结束点的坐标。可以通过AirtestIDE的截图功能获取坐标,或者通过图像识别来定位元素。 2. 调用swipe函数执行滑动。 示例代码(在移动端应用中): ```python from airtest.core.api import * # 连接设备 connect_device("Android:///") # 从点(100, 200)滑动到点(300, 400),持续1秒 swipe((100, 200), (300, 400), duration=1) # 或者通过图片识别来滑动(假设存在图片"start.png""end.png") # 注意:如果使用图片,需要确保图片在屏幕上能够被找到 swipe(Template("start.png"), Template("end.png")) ``` 如果滑动操作需要更复杂的路径,可以使用`swipe_along`,例如: ```python # 沿着路径点滑动 path = [(100, 200), (150, 300), (300, 400)] swipe_along(path) ``` 另外,引用[3]还提到了一种长按后滑动的方法,这实际上可以拆分为: - 在起始点长按(touch并持续一段时间) - 然后移动到结束点(使用move_to) - 最后释放(release) 但是,Airtest的swipe函数已经封装了这一过程,通常使用swipe即可。如果遇到特殊需求(如需要中间停顿),可以分解为: ```python # 模拟长按滑动 touch(start_pos, duration=长按时间) # 长按起始点 # 然后移动到结束点 swipe(start_pos, end_pos, duration=滑动时间) # 或者使用move_to,但注意swipe内部已经包含按下、移动释放 # 实际上,直接使用swipe已经可以满足大部分需求 ``` 注意:在Airtest中,滑动操作默认是按下-移动-释放的过程。如果使用分解步骤,可以这样写: ```python dev = device() # 获取当前设备 dev.touch(start_pos, 'down') # 按下 sleep(0.5) # 长按一段时间 dev.touch(end_pos, 'move') # 移动到中间点(如果需要多个中间点,可以多次调用move) # ... 可以添加多个move dev.touch(end_pos, 'up') # 在结束点释放 ``` 但是,对于简单的直线滑动,使用swipe是最方便的。 总结:在Airtest中实现滑动操作,主要使用`swipe`函数,根据需求选择坐标或图片定位起止点,并设置合适的持续时间步数。 相关问题: 1. 如何确定滑动的起始点结束点坐标? 2. Airtest滑动操作在哪些情况下会失败?如何避免? 3. 除了swipe,Airtest还有哪些移动操作方法?</think>### Airtest滑动操作实现方法详解 在Airtest中实现滑动操作主要有以下几种方法,结合引用[3]中的实践建议: #### 1. **基础滑动方法 `swipe()`** ```python from airtest.core.api import * # 从点A(x1,y1)滑动到点B(x2,y2) swipe((x1, y1), (x2, y2), duration=滑动时间) # 示例:从屏幕中央向右滑动 swipe((500, 1000), (800, 1000), duration=0.5) ``` - `duration`参数控制滑动速度(单位:秒) - 坐标可通过AirtestIDE的Poco辅助窗获取 #### 2. **基于图像识别的滑动(推荐)** ```python # 识别起始图片并滑动到目标位置 touch(Template("start_image.png")) swipe(Template("start_image.png"), vector=[x, y]) # 向量滑动 # 示例:向下滑动300像素 swipe(Template("menu_icon.png"), vector=[0, -300]) ``` #### 3. **长按后滑动(引用[3]方法)** ```python # 长按起始位置后滑动 dev = device() # 获取当前设备 start_pos = (500, 1000) end_pos = (800, 1000) dev.touch(start_pos, 'down') # 长按 sleep(1) # 持续按压 dev.touch(end_pos, 'move') # 滑动 dev.touch(end_pos, 'up') # 释放 ``` #### 4. **相对位置滑动** ```python # 基于当前屏幕百分比滑动 swipe((0.5, 0.8), (0.5, 0.2)) # 从屏幕底部80%滑到顶部20% ``` #### 5. **特殊场景处理** - **游戏寻路滑动**(如引用[3]所述): ```python # 持续滑动实现角色移动 for _ in range(5): swipe((0.5, 0.5), (0.7, 0.5), duration=0.3) sleep(0.5) ``` - **列表滚动**: ```python # 垂直滚动列表 swipe((0.5, 0.8), (0.5, 0.3), steps=10) # steps增加滑动流畅度 ``` #### 最佳实践建议: 1. 优先使用图像识别定位,避免坐标适配问题 2. 复杂滑动组合`touch()``swipe()`实现精细控制 3. 添加`sleep()`缓冲确保操作完成 4. 使用`ST.SAVE_IMAGE = False`关闭截图提升性能[^3] > 引用[3]特别建议:"如果什么图像都没有,那建议使用拖拽的办法,屏幕长按移动的中间位置,点击鼠标后向右滑动且不松手。这个在airtest或appium中均有办法实现,实在不行,还可以用adb来实现。" 相关问题: 1. 如何解决不同分辨率设备上的滑动适配问题? 2. Airtest滑动操作中`duration``steps`参数有什么区别? 3. 如何实现曲线滑动或弧形滑动轨迹? 4. 滑动操作在游戏自动化测试中有哪些特殊应用场景?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值