滑动屏幕方法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型,示例如下:

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

2,tap点击:

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

3,press短按:

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

4,long_press长按

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

5,move_to移动至目标点

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

6,wait等待

  1. # 等待,如等待500ms
  2. wait(500)

7,release释放

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

8,perform执行

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

二,多点触控MultiAction类

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

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

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

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

2,示例

  1. # @author: 给你一页白纸
  2. from appium import webdriver
  3. from appium.webdriver.common.touch_action import TouchAction
  4. # 需要导入模块MultiAction
  5. from appium.webdriver.common.multi_action import MultiAction
  6. desired_caps = {
  7. "platformName": "Android",
  8. "platformVersion": "10",
  9. "deviceName": "PCT_AL10",
  10. "appPackage": "com.ss.android.article.news",
  11. "appActivity": ".activity.MainActivity",
  12. "automationName": "uiautomator2",
  13. "unicodeKeyboard": True,
  14. "resetKeyboard": True,
  15. "noReset": False,
  16. }
  17. # 启动app
  18. driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps
  19. # 创建两个触摸事件
  20. action = TouchAction(driver)
  21. action1 = action.press(ele1).move_to(ele2).release()
  22. action2 = action.press(x=50, y=50).move_to(x=100, y=200).release()
  23. # 创建MultiAction实例对象
  24. multi_action = MultiAction(driver)
  25. # 将触摸事件加入TouchAction对象
  26. multi_action.add(action1, action2)
  27. # 执行事件
  28. multi_action.perform()

三,使用场景

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

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

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

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

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

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

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

  1. # @author: 给你一页白纸
  2. from appium.webdriver.common.touch_action import TouchAction
  3. class NineSquUnlock(object):
  4. '''
  5. 九宫格解锁,九宫格中每个点的坐标可以通过uiautomatorviewer获取,以下仅为示例
  6. '''
  7. def __init__(self, driver):
  8. self.driver = driver
  9. self.pwd = '1235789' # 解锁密码
  10. self.unit_location = [
  11. (300, 300), (300, 600), (300, 900),
  12. (600, 200), (600, 600), (600, 900),
  13. (900, 200), (900, 600), (900, 900)
  14. ]
  15. def unlock(self):
  16. # 将密码转换为对应坐标点的索引,获取密码对应的坐标点
  17. pwd_loc = []
  18. for i in self.pwd:
  19. unit_index = self.unit_location[int(i)]
  20. pwd_loc.append(unit_index)
  21. action = TouchAction(self.driver)
  22. # 按压起点
  23. action.press(*pwd_loc[0]).wait(200)
  24. # 根据坐标点滑动
  25. for i in range(1, len(pwd_loc)):
  26. action.move_to(*pwd_loc[i]).wait(200)
  27. # 释放动作并执行
  28. action.release().perform()
  29. if __name__ == '__main__':
  30. # 调试,构造的driver仅为示例
  31. from appium import webdriver
  32. driver = webdriver.Remote()
  33. NineSquUnlock(driver).unlock()

3,MultiAction使用场景

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

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

代码参考第二步中示例。

Python+Appium自动化测试(10)-TouchAction类与MultiAction类(控件元素的滑动、拖动,九宫格解锁,手势操作等)的更多相关文章

  1. Python+Appium自动化测试(13)-toast定位

    一,前言 在app自动化测试的过程中经常会遇到需要对toast进行定位,最常见的就是定位toast或者获取toast的文案进行断言,如下图,通过定位"登录成功"的toast就可以断 ...

  2. Python+Appium自动化测试(11)-location与size获取元素坐标

    appium做app自动化测试过程中,有时需要获取控件元素的坐标进行滑动操作.appium中提供了location方法获取控件元素左上角的坐标,再通过size方法获取控件元素的宽高,就可以得到控件元素 ...

  3. [Xcode 实际操作]三、视图控制器-(10)在Storyboard中使用图像视图控件

    目录:[Swift]Xcode实际操作 本文将演示常用的图像视图控件在故事板中的使用. 打开故事板文件[Main.storyboard]点击选择视图控制器的根视图. 点击库图标,打开控件库面板. 在控 ...

  4. MFC中 自定义类访问主对话框控件的方法

    之前一直在找有木有好点的方法.现在终于被我找到,收藏之~~~~~~ 在使用mfc的时候经常遇到自定义类访问主对话框控件的问题,例如自定义类中的方法要输出一段字符串到主对话框的EDIT控件.控制对话框的 ...

  5. Python+Appium自动化测试(15)-使用Android模拟器(详细)

    做APP的UI自动化测试时,我们往往会使用真机跑自动化测试脚本,因为这样才是最真实的使用场景.但前期调试脚本的话,可以先使用模拟器,这样相对更加方便. 不推荐使用Android SDK里自带模拟器,太 ...

  6. Python+Appium自动化测试(14)-yaml配置Desired capabilities

    一,前言 在之前的appium自动化测试示例中,我们都是把构造driver实例对象的数据(即Desired Capabilities)写在业务代码里,如下: # -*- coding:utf-8 -* ...

  7. Python+Appium自动化测试(6)-元素等待方法与重新封装元素定位方法

    在appium自动化测试脚本运行的过程中,因为网络不稳定.测试机或模拟器卡顿等原因,有时候会出现页面元素加载超时元素定位失败的情况,但实际这又不是bug,只是元素加载较慢,这个时候我们就会使用元素等待 ...

  8. Python+Appium自动化测试(1)-appium环境搭建

    用python+appium做appUI自动化测试,系统为Windows.首先是JDK与Android SDK的安装与环境变量的设置. 一,安装JDK,配置JDK环境变量 1,下载jdk jdk8官网 ...

  9. Python+Appium自动化测试(3)-编写自动化脚本

    之前一篇博客已经讲述怎样手动使用appium-desktop启动测试机上的app,但我们实际跑自动化脚本的过程中,是需要用脚本调用appium启动app的,接下来就尝试写Python脚本启动app并登 ...

随机推荐

  1. Java单例模式的实现与破坏

    单例模式是一种设计模式,是在整个运行过程中只需要产生一个实例.那么怎样去创建呢,以下提供了几种方案. 一.创建单例对象 懒汉式 public class TestSingleton { // 构造方法 ...

  2. python 3 break 循环控制

    人类的本质是一个复读机

  3. pytest文档3-pytest+Allure+jenkins+邮箱发送

    前言: 虽然网上有很多邮件配置的文章,但还是想自己写一下配置的过程,因为在中间也碰到了不同坑.按照这个文档配置的话,99%都可以成功.   一.jenkins 配置邮箱 1.打开jenkins后进入点 ...

  4. 2017年PHP程序员未来路在何方(转)

    PHP 从诞生到现在已经有20多年历史,从Web时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷, Node.js . GO . Python 不断地在挑战 PHP 的地位.这些技术的推 ...

  5. 想写一篇jvm的工具入门

    为什么要写一个jvm的工具入门呢,一是自己也不会,二是因为不会所以想学一下,还有就是这个确实很重要,对学习jvm有很多的用处,对定位问题有很大的便利,以前毕业那会我记得有个笔试,知道JAVA_HOME ...

  6. DataStax Bulk Loader教程(一)

    DataStax Bulk Loader - dsbulk是在DSE 6 引入的一种新的批量加载方法.(点击这里下载DataStax Bulk Loader). 它提供了将数据加载(load)到Dat ...

  7. Scala的lazy应用

    如果将一个变量声明为lazy,则只有在第一次使用该变量时,变量对应的表达式才会起作用. 例如:对于特别耗时的的计算操作特别有用,如打开文件IO,网络IO等. import scala.io.Sourc ...

  8. js之按钮切换

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  9. Springboot定时任务@Scheduled注解形式,参数详解

    参数详解 1.占位符 1 秒 是 0-59 , - * / 2 分 是 0-59 , - * / 3 时 是 0-23 , - * / 4 日 是 1-31 , - * ? / L W 5 月 是 1 ...

  10. docker部署rockermq集群(docker-compose版本)

    此处采用docker-compose部署 rockermq主主集群模式 创建相关文件夹 此处创建的文件一一对应docker-compose.yml文件中的映射文件夹,酌情创建,主要需要创建配置文件夹. ...