ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Airtest API精讲之双指滑动two_finger_swipe()

2021-11-13 12:03:34  阅读:313  来源: 互联网

标签:双指 精讲 swipe 50 steps finger offset self


 

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

之前我们讲Airtest API精讲之swipe()的时候,有提到一个参数fingers,当给其赋值为2时,就是两个手指滑动。当时给的例子是横滑,可以出现上下两条线,但如果是竖滑,两条线就会重叠成一条线,只是有个先后罢了。今天给大家介绍一个two_finger_swipe(),让我们可以自定义出更符合自己要求的双指滑动。

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

首先说明一点,某些模拟器如果你选择的连接参数中有"Use Adb Touch",可能将无法使用two_finger_swipe(),不行就换真机吧。

源码解析

我们先来看下two_finger_swipe()的源码(不想看源码的可以直接跳到后面的演示实例):

# 文件位置:your_python_path/site-packages/airtest/core/android/touch_methods/base_touch.py
def two_finger_swipe(self, tuple_from_xy, tuple_to_xy, duration=0.8, steps=5, offset=(0, 50)):
"""
Perform two finger swipe action

minitouch protocol example::

    d 0 0 0 50
    d 1 1 0 50
    c
    m 0 20 0 50
    m 1 21 0 50
    c
    m 0 40 0 50
    m 1 41 0 50
    c
    m 0 60 0 50
    m 1 61 0 50
    c
    m 0 80 0 50
    m 1 81 0 50
    c
    m 0 100 0 50
    m 1 101 0 50
    c
    u 0
    u 1
    c

Args:
    tuple_from_xy: start point
    tuple_to_xy: end point
    duration: time interval for swipe duration, default is 0.8
    steps: size of swipe step, default is 5
    offset: coordinate offset of the second finger, default is (0, 50)

Returns:
    None
"""
from_x, from_y = tuple_from_xy
to_x, to_y = tuple_to_xy
# 根据偏移量计算第二个手指的坐标
from_x2, from_y2 = (min(max(0, from_x + offset[0]), self.size_info['width']),
            min(max(0, from_y + offset[1]), self.size_info['height']))
to_x2, to_y2 = (min(max(0, to_x + offset[0]), self.size_info['width']),
        min(max(0, to_y + offset[1]), self.size_info['height']))
swipe_events = [DownEvent(tuple_from_xy, contact=0, pressure=self.default_pressure),
        DownEvent((from_x2, from_y2), contact=1, pressure=self.default_pressure),
        ]

interval = float(duration) / (steps + 1)
for i in range(1, steps + 1):
    move_events = [
    SleepEvent(interval),
    MoveEvent((from_x + ((to_x - from_x) * i / steps), from_y + (to_y - from_y) * i / steps),
          contact=0, pressure=self.default_pressure),
    MoveEvent((from_x2 + (to_x2 - from_x2) * i / steps, from_y2 + (to_y2 - from_y2) * i / steps),
          contact=1, pressure=self.default_pressure),
    ]
    swipe_events.extend(move_events)
swipe_events.extend([UpEvent(contact=0), UpEvent(contact=1)])
self.perform(swipe_events)

 

参数:
tuple_from_xy:开始坐标
tuple_to_xy:结束坐标
duration:时间间隔,默认0.8秒
steps:执行步数,默认5
offset:第二根手指偏移量,默认(0, 50)

如果你之前看过swipe_along()的源码解析,会发现这两个方法的实现是如此之像,就是多了一根手指的处理。以上代码中contact=0代表第一根手指,contact=1代表第二根手指

第40-41行

from_x, from_y = tuple_from_xy
to_x, to_y = tuple_to_xy

 

分别定义开始/结束的坐标x,y变量(第一根手指)

第43-46行

from_x2, from_y2 = (min(max(0, from_x + offset[0]), self.size_info['width']),
            min(max(0, from_y + offset[1]), self.size_info['height']))
to_x2, to_y2 = (min(max(0, to_x + offset[0]), self.size_info['width']),
        min(max(0, to_y + offset[1]), self.size_info['height']))

 

根据第一根手指开始/结束的坐标x,y变量计算出第二根手指开始/结束的坐标

第47行,向滑动事件列表swipe_events分别加入两根手指的按下事件

第51-60行,向滑动事件列表swipe_events依次加入等待事件、两根手指的分段移动事件

第61行,给滑动事件列表swipe_events追加两个手指的抬起事件

第62行self.perform(swipe_events)将滑动事件列表中的每个事件依次执行

因为和swipe_along()源码极其相似,想看更详细的源码解析的,可以去看下之前swipe_along()的文章Airtest API精讲之连续滑动swipe_along()

从源码可知第二根手指的默认偏移量是(0, 50),所以假如你给的横滑的开始/结束坐标为(0,100),(100,100),那么算出来的第二根手指的开始/结束坐标就是(0,150),(100,150),即两条相距50垂直距离的平行线。

相应的,假如你给的竖滑的开始/结束坐标为(100,100),(100,200),用默认偏移量(0, 50),那么算出来的第二根手指的开始/结束坐标就是(100,150),(100,150),即两条部分重叠的竖线。所以如果你想要两条平行的竖线,偏移量就要是(50, 0)

 

演示实例

画两条横向平行线

# -*- encoding=utf8 -*-
__author__ = "测试工程师小站"

from airtest.core.api import *

# 获取当前手机设备
dev = device()
# 从[150, 1000]到[700, 1000],其余参数全部用默认
dev.touch_proxy.two_finger_swipe([150, 1000],[700, 1000])

 

图片

画两条竖向平行线

# -*- encoding=utf8 -*-
__author__ = "测试工程师小站"

from airtest.core.api import *

# 获取当前手机设备
dev = device()
# 从[250, 550]到[250, 700],持续10秒,分5步,第2根手指偏移量(200,0)
dev.touch_proxy.two_finger_swipe([250, 550],[250, 700], duration=10, steps=5, offset=(200, 0))

 

图片

遇到问题

我用的小米手机,MIUI12,每次执行完毕后,第二根手指会多一段距离的惯性滑动。咨询过官方说是虽然显示多一段,但实际那一段没有执行;可是我自己试的应该是执行了的(双指下滑的时候相册歪了)。假如你要用到two_finger_swipe(),使用过程中也真的多执行了一段,并且影响到了功能实现,那么可以通过调整duration、steps、offset的大小,也许可以解决问题。

 

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

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

标签:双指,精讲,swipe,50,steps,finger,offset,self
来源: https://www.cnblogs.com/songzhenhua/p/15547638.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有