在Appium中提供了三种滑动的方式,swipe滑动、scroll滑动、drag拖拽事件。

除了这三种滑动方式外,我们还可以自定义一些滑动方式。

下面我们来看看这三种滑动方式。

1、swipe滑动

从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动。

swipe()方法说明:

  1. swipe(start_x, start_y, end_x, end_y, duration=None)
  2. 参数:
  3. 1.start_x:起点X轴坐标
  4. 2.start_y:起点Y轴坐标
  5. 3.end_x 终点X轴坐标
  6. 4.end_y,: 终点Y轴坐标
  7. 5.duration 滑动这个操作一共持续的时间(也可以称惯性),单位:ms(毫秒)
  8. (重点)什么是惯性,就是在上拉下滑的过程中,滑动动作结束后屏幕会还会滑一段距离,这个现象就是惯性。
  9. duration时间越短,duration=None,这样惯性滑动的距离会非常的多。
  10. duration时间越长,滑动这个动作越缓慢,惯性滑动的距离会变少。

业务场景:

  1. 进入设置。
  2. 从坐标(148,659)滑动到坐标(148,248)。

说明:

在一个手机界面上,左上角的坐标是(0,0)点。

横向是x轴坐标,纵向是y轴坐标。

在设置APP中,左右滑动无效,只能上下滑动,

所以只有y坐标在变化。

y坐标从小到大,是向下滑动,以手势作为参考,而不以屏幕作参考.

y坐标从大到小,是向上滑动手势,以手势作为参考,而不以屏幕作参考。

注意:

可以通过driver.get_window_size()命令来获取手机屏幕大小。

坐标的选择不能在屏幕的坐标之外,

也不能选择在边界值上,要在屏幕坐标之内的范围选择。

练习:

  1. """
  2. 1.学习目标
  3. 掌握swipe滑动方法使用
  4. 2.操作步骤
  5. swipe滑动方法,从一个坐标滑动到另一个坐标
  6. driver.swipe(start_x,start_y,end_x,end_y,duration=None)
  7. 3.需求
  8. 在设置APP首页实现swipe方法滑动
  9. 使用swipe方法在设置首页,实现向上滑动
  10. (x坐标不变,y坐标从大到小)
  11. 4.总结
  12. swipe()滑动说明
  13. 操作对象 : 坐标
  14. 操作过程有惯性有惯性
  15. 消除惯性,添加duration值,
  16. 当值越大,惯性越小,无限接近坐标差
  17. """
  18. # 1.导入appium
  19. import time
  20. from appium import webdriver
  21. # 2.创建Desired capabilities对象,添加启动参数
  22. desired_caps = {
  23. "platformName": "Android", # 系统名称
  24. "platformVersion": "7.1.2", # 系统版本
  25. "deviceName": "127.0.0.1:21503", # 设备名称
  26. "appPackage": "com.android.settings", # APP包名
  27. "appActivity": ".Settings" # APP启动名
  28. }
  29. # 3.启动APP
  30. driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
  31. # 获取屏幕大小
  32. size = driver.get_window_size()
  33. print("设备屏幕大小:", size)
  34. # 设备屏幕大小: {'width': 810, 'height': 1440}
  35. # 4.操作APP
  36. # 使用swipe方法在设置首页,实现向上滑动
  37. # x坐标不变,y坐标从大到小
  38. # start_x = 0 # 不能选择屏幕的大小的边界值,否则会报错
  39. # start_y = 1440 # 不能选择屏幕的大小的边界值,否则会报错
  40. # end_x = 0
  41. # end_y = 400
  42. start_x = 300
  43. start_y = 1000
  44. end_x = 300
  45. end_y = 500
  46. driver.swipe(start_x, start_y, end_x, end_y, duration=5000)
  47. # 6.关闭APP
  48. time.sleep(3)
  49. driver.quit()

2、scroll滑动

从一个元素滑动到另一个元素,直到页面自动停止。

scroll()方法说明:

  1. scroll(origin_el, destination_el, duration)
  2. 参数
  3. 1.origin_el :滑动开始的元素
  4. 2.destination_el :滑动结束的元素
  5. 3.duration : 滑动效果的持续时间 单位ms(毫秒)

业务场景:

  1. 进入设置。
  2. 模拟手指从存储菜单位置到WLAN菜单位置的上滑操作。

代码实现:

  1. # 定位到存储菜单栏
  2. el1 = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
  3. # 定位到WLAN菜单栏
  4. el2 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
  5. # 执⾏滑动操作
  6. driver.scroll(el1,el2)

练习:

  1. """
  2. 1.学习目标
  3. 掌握scroll滑动方法(熟悉即可)
  4. 2.操作步骤
  5. scroll滑动 从一个元素滑动到另一个元素
  6. driver.scroll(origin_el,destination_el,duration=None)
  7. origin_el 起始元素
  8. destination_el 终止元素
  9. duration 滑动效果的持续时间 单位ms(毫秒)
  10. 3.需求
  11. 实现scroll方法
  12. 在设置首页从”存储“滑动到“蓝牙“
  13. 4. 总结
  14. scroll方法
  15. 操作对象 : 元素
  16. 操作过程有惯性,需要添加duration参数,
  17. 参数值越大,惯性越小。
  18. """
  19. # 1.导入appium
  20. import time
  21. from appium import webdriver
  22. # 2.创建Desired capabilities对象,添加启动参数
  23. desired_caps = {
  24. "platformName": "Android", # 系统名称
  25. "platformVersion": "7.1.2", # 系统版本
  26. "deviceName": "127.0.0.1:21503", # 设备名称
  27. "appPackage": "com.android.settings", # APP包名
  28. "appActivity": ".Settings" # APP启动名
  29. }
  30. # 3.启动APP
  31. driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
  32. # 4.操作APP
  33. # 定位”存储“和”蓝牙“
  34. store = driver.find_element_by_android_uiautomator('new UiSelector().text("存储")')
  35. blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("蓝牙")')
  36. # 从”存储“滑动到”蓝牙“
  37. driver.scroll(store, blue_tooth, duration=5000)
  38. # 实际操作手机是手指在屏幕向上滑动,
  39. # 点击存储的位置,向上滑动到蓝牙的位置,来查看页面中下方的内容。
  40. # 6.关闭APP
  41. time.sleep(3)
  42. driver.quit()

3、drag拖拽事件

从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置。

drag_and_drop()方法说明:

  1. drag_and_drop(origin_el, destination_el)
  2. 参数:
  3. 1.origin_el:滑动开始的元素
  4. 2.destination_el:滑动结束的元素

业务场景:

  1. 进入设置。
  2. 模拟手指将存储菜单 滑动到WLAN菜单栏位置。

代码实现:

  1. # 定位到存储菜单栏
  2. el1 = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
  3. # 定位到WLAN菜单栏
  4. el2 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
  5. # 执⾏滑动操作
  6. driver.drag_and_drop(el1,el2)

练习:

  1. """
  2. 1.学习目标
  3. 掌握drag_and_drop滑动方法(熟悉)
  4. 2.操作步骤
  5. drag_and_drop方法 从一个元素拖拽到另一个元素上
  6. driver.drag_and_drop(origin_el,destination_el)
  7. origin_el 起始元素
  8. destination_el 终止元素
  9. 3.需求
  10. 实现drag_and_drop方法
  11. 在设置首页从”存储“滑动到“蓝牙“
  12. 4. 总结
  13. drag_and_drop方法
  14. 操作对象 : 元素
  15. 操作过程没有惯性。
  16. """
  17. # 1.导入appium
  18. import time
  19. from appium import webdriver
  20. # 2.创建Desired capabilities对象,添加启动参数
  21. desired_caps = {
  22. "platformName": "Android", # 系统名称
  23. "platformVersion": "7.1.2", # 系统版本
  24. "deviceName": "127.0.0.1:21503", # 设备名称
  25. "appPackage": "com.android.settings", # APP包名
  26. "appActivity": ".Settings" # APP启动名
  27. }
  28. # 3.启动APP
  29. driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
  30. # 4.操作APP
  31. # 定位”存储“和”蓝牙“
  32. store = driver.find_element_by_android_uiautomator('new UiSelector().text("存储")')
  33. blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("蓝牙")')
  34. # 从”存储“滑动到”蓝牙“
  35. driver.drag_and_drop(store, blue_tooth)
  36. # 6.关闭APP
  37. time.sleep(3)
  38. driver.quit()

4、滑动方法小结

滑动方法名称 实现方式 是否有惯性
swipe 传入坐标滑动 有惯性(当持续时间足够长时,实现的效果和drag一致)
scroll 传入元素滑动 有惯性
drag 传入元素滑动 无惯性

5、拓展:多次滑动

需求:实现多次滑动手机屏幕的效果。

代码如下:(多看里边的注意事项)

  1. """
  2. 1.学习目标
  3. 掌握多次滑动操作(上面三种滑动方式,那种都可以)
  4. 2.操作步骤
  5. 以scroll方式滑动为例。
  6. 3.需求
  7. 在设置APP首页实现多次滑动(向上滑动)
  8. 从存储滑动到蓝牙
  9. 再从安全滑动到存储
  10. """
  11. # 1.导入appium
  12. import time
  13. from appium import webdriver
  14. # 2.创建Desired capabilities对象,添加启动参数
  15. desired_caps = {
  16. "platformName": "Android", # 系统名称
  17. "platformVersion": "7.1.2", # 系统版本
  18. "deviceName": "127.0.0.1:21503", # 设备名称
  19. "appPackage": "com.android.settings", # APP包名
  20. "appActivity": ".Settings" # APP启动名
  21. }
  22. # 3.启动APP
  23. driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
  24. # 获取屏幕大小
  25. size = driver.get_window_size()
  26. print("设备屏幕大小:", size)
  27. # 设备屏幕大小: {'width': 810, 'height': 1440}
  28. # 4.操作APP
  29. # 4.1 定位存储和蓝牙
  30. store = driver.find_element_by_android_uiautomator('new UiSelector().text("存储")')
  31. blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("蓝牙")')
  32. # 4.2 从存储滑动到蓝牙
  33. driver.scroll(store, blue_tooth, duration=5000)
  34. # 4.3 定位安全
  35. # 重点注意1:
  36. # 因为安全这个元素在设置app的界面中没有显示出来,
  37. # 如果你直接进行定位,就会报错,NoSuchElementException,
  38. # 你需要等到滑动界面显示出安全这个元素,才能进行定位。
  39. # 不用完全显示,只要某个元素在屏幕中出现了一点点部分,也可以用find_element找到该元素.
  40. # 这里一定要注意。
  41. safe = driver.find_element_by_android_uiautomator('new UiSelector().text("安全")')
  42. # 4.4 从安全滑动到存储
  43. driver.scroll(safe, store, duration=5000)
  44. # 重点注意2
  45. # 如果在演示的时候,发下第二次滑动的效果有问题(滑动距离很短)
  46. # 原因是:
  47. # find_element如果找到了某个元素,会将具体位置缓存在系统中;
  48. # 只要不重新获取,即使该元素已经跑出屏幕外,但也会认为该元素在之前缓存的位置.
  49. # (这是一个系统定位机制的问题)
  50. # 所以第二次实际滑动的距离是:
  51. # 从安全的位置滑动到,第一次滑动时存储所在的位置。
  52. # 这里一定要注意。
  53. # 所以通过上边的说明,如果我们需要进行连续的滑动操作时,
  54. # 既然会存储元素的位置,我们直接两次从存储滑动到蓝牙操作,
  55. # 不就解决了,多次等距离滑动的操作。
  56. # 如下,执行两次存储滑动到蓝牙操作
  57. # driver.scroll(store, blue_tooth, duration=5000)
  58. # driver.scroll(store, blue_tooth, duration=5000)
  59. # 如果需要多次,可以写一个for循环来执行多次。
  60. # 我使用Android 7.1.1版本的系统,没有发现有元素位置缓存的现象,
  61. # 所以直接正常写就好了,如果出现了上述注意2的现象,
  62. # 这里我们知道是怎么回事就好了。
  63. # 6.关闭APP
  64. time.sleep(3)
  65. driver.quit()

说明:

代码中注意事项2补充:

如果要解决这个问题,只需要对第二次的两个元素重新获取(也就是重新定位),再执行操作就解决了。

如上面的代码中,执行第二次滑动的时候,安全获取了,只需要在重新获取一下存储元素,第二次滑动就能正常操作了。

6、综合练习

需求:

1,封装上下左右滑动操作到一个工具类中。

2, 实现在滑动的过程中找到"时间和日期"元素,并点击进入该页面。(这个例子类似于Selenium中学习的聚焦元素)

封装滑动工具类:

  1. # 1.导入appium
  2. import time
  3. from appium import webdriver
  4. # 定义driver
  5. def app_driver():
  6. # 2.创建Desired capabilities对象,添加启动参数
  7. desired_caps = {
  8. "platformName": "Android", # 系统名称
  9. "platformVersion": "7.1.2", # 系统版本
  10. "deviceName": "127.0.0.1:21503", # 设备名称
  11. "appPackage": "com.android.settings", # APP包名
  12. "appActivity": ".Settings" # APP启动名
  13. }
  14. # 3.启动APP
  15. driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
  16. return driver
  17. # 把滑动操作封装成一个工具类
  18. class AppSwipe:
  19. # 初始化方法
  20. # 需要一个全局的driver(相当于一个启动的app),
  21. def __init__(self, driver):
  22. self.driver = driver
  23. # size是一个字典类型的数据,一个宽度,一个高度
  24. self.size = self.driver.get_window_size() # 获取手机屏幕大小
  25. """
  26. 封装滑动方法:使用driver.swipe()方法
  27. 因为scroll滑动和drag拖拽是使用元素定位,左右滑动的时候可能实现不了。
  28. 因为没个设备的屏幕大小不一样,我们需要先获取屏幕的大小,在适用坐标定位。
  29. """
  30. def swipeUp(self, t=5000, n=1):
  31. '''
  32. 手势:向上滑动
  33. :param duration:持续时间
  34. :param n:滑动次数
  35. :return:
  36. '''
  37. # 根据手机屏幕的宽高,来确定起始坐标位置
  38. # 上下滑动水平x轴不变,屏幕的宽度*0.5 表示屏幕的中间
  39. start_x = self.size['width'] * 0.5 # x坐标
  40. # 手势向上滑动,y轴的坐标从大到小
  41. start_y = self.size['height'] * 0.75 # 起点y坐标
  42. end_y = self.size['height'] * 0.25 # 终点y坐标
  43. for i in range(n):
  44. self.driver.swipe(start_x, start_y, start_x, end_y, t)
  45. def swipeDown(self, duration=5000, n=1):
  46. '''
  47. 手势:向下滑动
  48. :param duration:持续时间
  49. :param n:滑动次数
  50. :return:
  51. '''
  52. # 根据手机屏幕的宽高,来确定起始坐标位置
  53. # 上下滑动水平x轴不变,屏幕的宽度*0.5 表示屏幕的中间
  54. start_x = self.size['width'] * 0.5 # x坐标
  55. # 手势向下滑动,y轴的坐标从小到大
  56. start_y = self.size['height'] * 0.25 # 起始y坐标
  57. end_y = self.size['height'] * 0.75 # 终点y坐标
  58. for i in range(n):
  59. self.driver.swipe(start_x, start_y, start_x, end_y, duration)
  60. def swipLeft(self, duration=5000, n=1):
  61. '''
  62. 手势:向左滑动
  63. :param duration:持续时间
  64. :param n:滑动次数
  65. :return:
  66. '''
  67. # 根据手机屏幕的宽高,来确定起始坐标位置
  68. # 手势向左滑动,x轴的坐标从大到小
  69. start_x = self.size['width'] * 0.75
  70. end_x = self.size['width'] * 0.25
  71. # 左右滑动垂直y轴不变,屏幕的高度*0.5 表示屏幕的中间
  72. start_y = self.size['height'] * 0.5
  73. for i in range(n):
  74. self.driver.swipe(start_x, start_y, end_x, start_y, duration)
  75. def swipRight(self, duration=5000, n=1):
  76. '''
  77. 手势:向右滑动
  78. :param duration:持续时间
  79. :param n:滑动次数
  80. :return:
  81. '''
  82. # 根据手机屏幕的宽高,来确定起始坐标位置
  83. # 手势向右滑动,x轴的坐标从小到大
  84. start_x = self.size['width'] * 0.25
  85. end_x = self.size['width'] * 0.75
  86. # 左右滑动垂直y轴不变,屏幕的高度*0.5 表示屏幕的中间
  87. start_y = self.size['height'] * 0.5
  88. for i in range(n):
  89. self.driver.swipe(start_x, start_y, end_x, start_y, duration)
  90. if __name__ == '__main__':
  91. driver = app_driver()
  92. swipe = AppSwipe(driver)
  93. swipe.swipeDown() # 手势:向下滑动
  94. swipe.swipeUp(n=2) # 手势:向上滑动
  95. time.sleep(2)

实现"时间和日期"元素的定位和点击:

  1. # 1、导入刚刚封装好的滑动工具类app_swipe
  2. from app_swipe import AppSwipe, app_driver
  3. import time
  4. # 2、获得driver驱动和工具类的实体类
  5. driver = app_driver()
  6. swipe = AppSwipe(driver)
  7. # 3.操作APP--聚焦元素到"日期和时间"
  8. # 如果设置app的界面中没有显示"日期和时间"元素,我们是无法定位的,
  9. # 这个时候我们就执行向上滑动操作,
  10. # 直到手机界面中显示了"日期和时间"元素,并且成功定位了该元素。
  11. # 我们就执行点击操作,然后退出循环。即可执行更多的操作了。
  12. while True:
  13. try:
  14. driver.find_element_by_android_uiautomator('new UiSelector().text("日期和时间")').click()
  15. break
  16. except:
  17. # 向上滑动
  18. AppSwipe(driver).swipe_up() # 向上滑动
  19. # 4.关闭APP
  20. time.sleep(3)
  21. driver.quit()

『与善仁』Appium基础 — 23、操作滑动的方式的更多相关文章

  1. 『与善仁』Appium基础 — 18、元素定位工具(二)

    目录 1.Appium Inspector介绍 2.Appium Inspector打开方式 3.Appium Inspector布局介绍 4.Appium Inspector工具的配置 5.Appi ...

  2. 『与善仁』Appium基础 — 8、Appium自动化测试框架介绍

    目录 1.主流的移动端自动化测试框架 (1)Robotium (2)Macaca (3)Appium 2.自动化测试工具的选择 3.Appium简介 提示:我们前面说的Android环境搭建和adb命 ...

  3. 『与善仁』Appium基础 — 20、Appium元素定位

    目录 1.by_id定位 2.by_name定位 3.by_class_name定位 4.by_xpath定位 5.by_accessibility_id定位 6.by_android_uiautom ...

  4. 『与善仁』Appium基础 — 26、常用手机操作的API说明

    目录 1.获取当前手机的时间 2.获取手机屏幕的宽和高 3.获取手机当前网络 4.设置手机网络模式 5.操作手机通知栏 6.综合练习 7.发送键到设备(掌握) 8.手机截图(掌握) 是针对手机一些常用 ...

  5. 『与善仁』Appium基础 — 9、补充:C/S架构和B/S架构说明

    目录 1.C/S架构和B/S架构概念 2.C/S结构与B/S架构的区别 3.C/S架构和B/S架构优点和缺点 (1)B/S模式的优点和缺点: (2)C/S模式的优点和缺点: 1.C/S架构和B/S架构 ...

  6. 『与善仁』Appium基础 — 10、Appium基本原理

    目录 1.Appium自动化测试架构 2.Appium架构图 3.Session说明 4.Desired Capabilities说明 5.Appium Server说明 6.Appium Clien ...

  7. 『与善仁』Appium基础 — 12、Appium的安装详解

    目录 (一)Appium server安装 方式一:(桌面方式:推荐) 1.Appium Desktop下载 2.Appium Desktop安装 3.Appium Desktop使用 方式二:(No ...

  8. 『与善仁』Appium基础 — 14、Appium测试环境搭建

    目录 1.Appium测试环境搭建整体思路 (1)Android测试环境搭建 (2)Appium测试环境搭建 (3)测试脚本语言的环境搭建 2.Appium在Android端和IOS端的工作流程 (1 ...

  9. 『与善仁』Appium基础 — 15、使用Appium的第一个Demo

    我们使用Python语言作为测试脚本的编写语言. 执行脚本前提: Android模拟器或者手机是开机状态. 使用确保电脑和Android设备进行了链接. 也就是使用ADB命令adb connect链接 ...

随机推荐

  1. sui Mobile 试玩

    .... 突然就用上这东西还不熟悉就写了一个页面而已 <a class="open-popup button pull-right create-actions" id=&q ...

  2. [loj2978]杜老师

    假设所有素数从小到大依次为$p_{1},p_{2},...,p_{k}$,我们将$x$转换为一个$k$位的二进制数,其中从低到高第$i$位为1当且仅当其$p_{i}$的幂次为奇数 不难发现以下两个性质 ...

  3. [loj6518]序列

    参考ExtremeSpanningTrees,考虑优化整体二分时求$g_{i}\in \{w_{mid},w_{mid+1}\}$的最优解 首先题目有一个条件似乎没有写出来,是保证$l\le k\le ...

  4. [loj3343]超现实树

    定义1:两棵树中的$x$和$y$对应当且仅当$x$到根的链与$y$到根的链同构 定义2:$x$和$y$的儿子状态相同当且仅当$x$与儿子所构成的树与$y$与儿子所构成的树同构 根据题中所给的定义,有以 ...

  5. Java设计模式之(七)——装饰器模式

    1.什么是装饰器模式? Attach additional responsibilities to an object dynamically keeping the same interface.D ...

  6. SSM(Spring-MyBatis-SpringMVC)框架整合【完整版】

    整合SSM 01 基本配置文件的关系 web.xml配置DispatcherServlet 02 需要的maven依赖 <!--依赖 1.junit 2.数据库连接池 3.servlet 4.j ...

  7. 7.2 k8s 基于PV、PVC搭建zookeeper 3节点集群

    1.PV,PVC介绍 1.1.StorageClass & PV & PVC关系图 Volumes 是最基础的存储抽象,其支持多种类型,包括本地存储.NFS.FC以及众多的云存储,我们 ...

  8. P6585 中子衰变

    我们偶数的时候只要对称操作. 奇数的话,我们定义\(1\)的相反数为\(-1\),\(0\)相反数为\(0\). 我们维护最长的两边的相反串,中间一段除了一个端点,其他均被染成同色. 那么如果对方染端 ...

  9. [ARC101C] Ribbons on Tree

    神仙的容斥题与神仙的树形DP题. 首先搞一个指数级的做法:求总的.能够覆盖每一条边的方案数,通过容斥可以得到\(\text{ans}=\sum\limits_E{(-1)^{|E|}F(E)}\).其 ...

  10. 富集分析DAVID、Metascape、Enrichr、ClueGO

    前言 一般我们挑出一堆感兴趣的基因想临时看看它们的功能,需要做个富集分析.虽然公司买了最新版的数据库,如KEGG,但在集群跑下来嫌麻烦.这时网页在线或者本地化工具派上用场了. DAVID DAVID地 ...