zoukankan      html  css  js  c++  java
  • Airtest API精讲之双指滑动two_finger_swipe()

    以下基于
    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的大小,也许可以解决问题。

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

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

  • 相关阅读:
    爬取阳光问政平台
    CrawlSpider爬取腾讯招聘信息
    LinkExtractor
    镜像源列表
    screen命令总结
    PHP解决中文乱码问题
    Linux查找大文件或目录
    CentOS6/7系列防火墙管理
    删除win10冗余的服务
    解决win10安装wireshark新版本,欢迎界面卡顿情况
  • 原文地址:https://www.cnblogs.com/songzhenhua/p/15547638.html
Copyright © 2011-2022 走看看