zoukankan      html  css  js  c++  java
  • Python+Appium自动化测试(10)-TouchAction类与MultiAction类(控件元素的滑动、拖动,九宫格解锁,手势操作等)

    滑动屏幕方法swipe一般用于对页面进行上下左右滑动操作,但自动化过程中还会遇到其他情况,如对控件元素进行滑动、拖拽操作,九宫格解锁,手势操作,地图的放大与缩小等。这些需要针对控件元素的滑动操作,或者点至点、元素至元素之间的滑动操作,使用swipe方法显然不是很方便,这时候就可以用到appium里提供TouchAction类和MultiAction类。

    一,TouchAction类

    1,TouchAction类由webdriver库提供,提供以下方法:

    • tap(self, element=None, x=None, y=None, count=1),点击,点击元素el或坐标点(x, y) 1次

    • press(self, el=None, x=None, y=None, pressure=None),短按,按压元素el或坐标点(x, y)

    • long_press(self, el=None, x=None, y=None, duration=1000),长按,长按元素el或坐标点(x, y),duration为按压时间,默认1000ms

    • wait(self, ms=0),暂停,时间默认为0

    • move_to(self, el=None, x=None, y=None),移动到,滑动至目标元素el位置或目标坐标点(x, y)

    • release(self),释放,将指针提离屏幕结束操作

    • perform(self),执行,将命令发送到要操作的服务器来执行该操作

    注意,坐标x、y为int型,示例如下:

    # @author: 给你一页白纸
    
    from appium import webdriver
    # 需要导入模块TouchAction
    from appium.webdriver.common.touch_action import TouchAction
    
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "PCT_AL10",
        "appPackage": "com.ss.android.article.news",
        "appActivity": ".activity.MainActivity",
        "automationName": "uiautomator2",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
        "noReset": False,
    }
    # 启动app
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    
    # 构造TouchAction实例对象
    action = TouchAction(driver)
    按住点(x1, y1),等待1000ms,滑动至点(x2, y2),释放
    action.press(x=x1, y=y1).wait(1000).move_to(x=x2, y=y2).release()
    # 执行操作
    action.perform()
    

    2,tap点击

    # 点击元素的中心点
    tap(element=ele1)
    # 点击坐标(x1, y1)
    tap(x=x1, y=y1)
    # 以元素ele1左上角的x坐标向右移动x2单位,y坐标向下移动y2单位,在点(x+x2, y+y2)上点击
    tap(element=ele1, x=x2, y=y2)
    

    3,press短按

    # 按压元素
    press(el=ele1)
    # 按压坐标
    press(x=x1, y=y1)
    # 以元素ele1左上角的x坐标向右移动x2单位,y坐标向下移动y2单位,在点(x+x2, y+y2)上按压
    press(el=ele1, x=x2, y=y2)
    

    4,long_press长按

    # 按压元素,默认1000ms
    long_press(el=ele1)
    # 按压坐标500ms
    long_press(x=x1, y=y1, duration=500)
    # 以元素ele1左上角的x坐标向右移动x2单位,y坐标向下移动y2单位,在点(x+x2, y+y2)上按压
    long_press(el=ele1, x=x2, y=y2)
    

    5,move_to移动至目标点

    # 该方法需要与press()、long_press()结合使用
    
    # 从另一个点移动至目标元素ele1
    move_to(el=ele1)
    # 从另一个点移动至点(x1, y1)
    move_to(x=x1, y=y1)
    # 从另一个点移动至点(x+x2, y+y2), (x, y)为元素ele1左上角的坐标
    move_to(el=ele1, x=x2, y=y2)
    

    6,wait等待

    # 等待,如等待500ms
    wait(500)
    

    7,release释放

    # 释放操作,与按压、长按结合使用
    release()
    

    8,perform执行

    # 将动作命令发送至服务器来执行该动作,如:
    action = TouchAction(driver).press(x=x1, y=y1).move_to(x=x2, y=y2).release()
    执行滑动操作
    action.perform()
    

    二,多点触控MultiAction类

    1,MultiAction类中提供以下方法:

    • add(self, *touch_actions),参数*touch_actions为触摸操作集合,将一个或多个触摸操作添加至当前的多点触控实例中

    • perform(self),执行多点触控操作

    使用场景,如页面的放大、缩小等

    2,示例

    # @author: 给你一页白纸
    
    from appium import webdriver
    from appium.webdriver.common.touch_action import TouchAction
    # 需要导入模块MultiAction
    from appium.webdriver.common.multi_action import MultiAction
    
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "PCT_AL10",
        "appPackage": "com.ss.android.article.news",
        "appActivity": ".activity.MainActivity",
        "automationName": "uiautomator2",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
        "noReset": False,
    }
    # 启动app
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps
    
    # 创建两个触摸事件
    action = TouchAction(driver)
    action1 = action.press(ele1).move_to(ele2).release()
    action2 = action.press(x=50, y=50).move_to(x=100, y=200).release()
    
    # 创建MultiAction实例对象
    multi_action = MultiAction(driver)
    # 将触摸事件加入TouchAction对象
    multi_action.add(action1, action2)
    
    # 执行事件
    multi_action.perform()
    

    三,使用场景

    1,TouchAction使用场景--控件元素滑动

    • 今日头条顶部菜单栏向左滑动

      思路:长按"视频"元素滑动至"关注"元素位置,然后释放

    # 关注按钮元素
    concern_ele = driver.find_element_by_xpath("//*[@content-desc='关注']")
    # 视频按钮元素
    video_ele = driver.find_element_by_xpath("//*[@content-desc='视频']")
    
    action = TouchAction(driver)
    长按"视频"元素滑动至"关注"元素位置,然后释放
    action.long_press(video_ele).move_to(concern_ele).release().perform()
    
    • 还有下面这种形式,通过对滑动控件元素来选择时间:

      思路:通过向上滑动选择年月日。以日期选择控件为例,按压日期元素滑动至【确定】按钮即可滚动日期(由于元素属性的原因这里不能选择精确的日期)

    # 日期元素
    day_ele = driver.find_element_by_id("resource-id")
    # 视频按钮元素
    sure_ele = driver.find_element_by_xpath("//*[@text='确定']")
    
    action = TouchAction(driver)
    # 长按日期元素滑动至确定按钮元素位置,然后释放
    action.long_press(day_ele).move_to(sure_ele).release().perform()
    

    2,TouchAction使用场景--九宫格解锁

    # @author: 给你一页白纸
    
    from appium.webdriver.common.touch_action import TouchAction
    
    class NineSquUnlock(object):
        '''
        九宫格解锁,九宫格中每个点的坐标可以通过uiautomatorviewer获取,以下仅为示例
        '''
        def __init__(self, driver):
            self.driver = driver
            self.pwd = '1235789'   # 解锁密码
            self.unit_location = [
            (300, 300), (300, 600), (300, 900),
            (600, 200), (600, 600), (600, 900),
            (900, 200), (900, 600), (900, 900)
            ]
    
        def unlock(self):
            # 将密码转换为对应坐标点的索引,获取密码对应的坐标点
            pwd_loc = []
            for i in self.pwd:
                unit_index = self.unit_location[int(i)]
                pwd_loc.append(unit_index)
    
            action = TouchAction(self.driver)
            # 按压起点
            action.press(*pwd_loc[0]).wait(200)
            # 根据坐标点滑动
            for i in range(1, len(pwd_loc)):
                action.move_to(*pwd_loc[i]).wait(200)
            # 释放动作并执行
            action.release().perform()
    
    if __name__ == '__main__':
        # 调试,构造的driver仅为示例
        from appium import webdriver
        driver = webdriver.Remote()
        NineSquUnlock(driver).unlock()
    

    3,MultiAction使用场景

    app中地图的放大、缩小;app中图片的放大、缩小。

    如下图中A、B、C、D四个坐标点,1所示滑动操作则放大图片,2所示滑动操作则缩小照片。

    代码参考第二步中示例。

  • 相关阅读:
    SqlServer存储过程函数加解密[极有用]
    BMDThread控件动态创建多线程示例
    cxGrid右键自定义菜单
    越狱中Michael的一种疾病
    静态链表
    单行编辑框SelectText()
    开机得按F1
    jquery调用页面后台方法‏
    .net调用存储过程详解
    javascript兼容各种浏览器的异步请求
  • 原文地址:https://www.cnblogs.com/lfr0123/p/13679568.html
Copyright © 2011-2022 走看看