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

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

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

1、swipe滑动

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

swipe()方法说明:

swipe(start_x, start_y, end_x, end_y, duration=None)

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

业务场景:

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

说明:

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

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

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

所以只有y坐标在变化。

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

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

注意:

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

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

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

练习:

"""
1.学习目标
掌握swipe滑动方法使用
2.操作步骤
swipe滑动方法,从一个坐标滑动到另一个坐标
driver.swipe(start_x,start_y,end_x,end_y,duration=None)
3.需求
在设置APP首页实现swipe方法滑动
使用swipe方法在设置首页,实现向上滑动
(x坐标不变,y坐标从大到小)
4.总结
swipe()滑动说明
操作对象 : 坐标
操作过程有惯性有惯性
消除惯性,添加duration值,
当值越大,惯性越小,无限接近坐标差
""" # 1.导入appium
import time
from appium import webdriver # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) # 获取屏幕大小
size = driver.get_window_size()
print("设备屏幕大小:", size)
# 设备屏幕大小: {'width': 810, 'height': 1440} # 4.操作APP
# 使用swipe方法在设置首页,实现向上滑动
# x坐标不变,y坐标从大到小
# start_x = 0 # 不能选择屏幕的大小的边界值,否则会报错
# start_y = 1440 # 不能选择屏幕的大小的边界值,否则会报错
# end_x = 0
# end_y = 400 start_x = 300
start_y = 1000
end_x = 300
end_y = 500
driver.swipe(start_x, start_y, end_x, end_y, duration=5000) # 6.关闭APP
time.sleep(3)
driver.quit()

2、scroll滑动

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

scroll()方法说明:

scroll(origin_el, destination_el, duration)

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

业务场景:

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

代码实现:

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

练习:

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

3、drag拖拽事件

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

drag_and_drop()方法说明:

drag_and_drop(origin_el, destination_el)

参数:
1.origin_el:滑动开始的元素
2.destination_el:滑动结束的元素

业务场景:

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

代码实现:

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

练习:

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

4、滑动方法小结

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

5、拓展:多次滑动

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

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

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

说明:

代码中注意事项2补充:

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

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

6、综合练习

需求:

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

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

封装滑动工具类:

# 1.导入appium
import time
from appium import webdriver # 定义driver
def app_driver():
# 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
return driver # 把滑动操作封装成一个工具类
class AppSwipe: # 初始化方法
# 需要一个全局的driver(相当于一个启动的app),
def __init__(self, driver):
self.driver = driver
# size是一个字典类型的数据,一个宽度,一个高度
self.size = self.driver.get_window_size() # 获取手机屏幕大小 """
封装滑动方法:使用driver.swipe()方法
因为scroll滑动和drag拖拽是使用元素定位,左右滑动的时候可能实现不了。 因为没个设备的屏幕大小不一样,我们需要先获取屏幕的大小,在适用坐标定位。
""" def swipeUp(self, t=5000, n=1):
'''
手势:向上滑动
:param duration:持续时间
:param n:滑动次数
:return:
''' # 根据手机屏幕的宽高,来确定起始坐标位置 # 上下滑动水平x轴不变,屏幕的宽度*0.5 表示屏幕的中间
start_x = self.size['width'] * 0.5 # x坐标 # 手势向上滑动,y轴的坐标从大到小
start_y = self.size['height'] * 0.75 # 起点y坐标
end_y = self.size['height'] * 0.25 # 终点y坐标
for i in range(n):
self.driver.swipe(start_x, start_y, start_x, end_y, t) def swipeDown(self, duration=5000, n=1):
'''
手势:向下滑动
:param duration:持续时间
:param n:滑动次数
:return:
''' # 根据手机屏幕的宽高,来确定起始坐标位置
# 上下滑动水平x轴不变,屏幕的宽度*0.5 表示屏幕的中间
start_x = self.size['width'] * 0.5 # x坐标 # 手势向下滑动,y轴的坐标从小到大
start_y = self.size['height'] * 0.25 # 起始y坐标
end_y = self.size['height'] * 0.75 # 终点y坐标
for i in range(n):
self.driver.swipe(start_x, start_y, start_x, end_y, duration) def swipLeft(self, duration=5000, n=1):
'''
手势:向左滑动
:param duration:持续时间
:param n:滑动次数
:return:
'''
# 根据手机屏幕的宽高,来确定起始坐标位置
# 手势向左滑动,x轴的坐标从大到小
start_x = self.size['width'] * 0.75
end_x = self.size['width'] * 0.25
# 左右滑动垂直y轴不变,屏幕的高度*0.5 表示屏幕的中间
start_y = self.size['height'] * 0.5 for i in range(n):
self.driver.swipe(start_x, start_y, end_x, start_y, duration) def swipRight(self, duration=5000, n=1):
'''
手势:向右滑动
:param duration:持续时间
:param n:滑动次数
:return:
'''
# 根据手机屏幕的宽高,来确定起始坐标位置
# 手势向右滑动,x轴的坐标从小到大
start_x = self.size['width'] * 0.25
end_x = self.size['width'] * 0.75
# 左右滑动垂直y轴不变,屏幕的高度*0.5 表示屏幕的中间
start_y = self.size['height'] * 0.5
for i in range(n):
self.driver.swipe(start_x, start_y, end_x, start_y, duration) if __name__ == '__main__':
driver = app_driver()
swipe = AppSwipe(driver)
swipe.swipeDown() # 手势:向下滑动
swipe.swipeUp(n=2) # 手势:向上滑动
time.sleep(2)

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

# 1、导入刚刚封装好的滑动工具类app_swipe
from app_swipe import AppSwipe, app_driver
import time # 2、获得driver驱动和工具类的实体类
driver = app_driver()
swipe = AppSwipe(driver) # 3.操作APP--聚焦元素到"日期和时间"
# 如果设置app的界面中没有显示"日期和时间"元素,我们是无法定位的,
# 这个时候我们就执行向上滑动操作,
# 直到手机界面中显示了"日期和时间"元素,并且成功定位了该元素。
# 我们就执行点击操作,然后退出循环。即可执行更多的操作了。
while True:
try:
driver.find_element_by_android_uiautomator('new UiSelector().text("日期和时间")').click()
break
except:
# 向上滑动
AppSwipe(driver).swipe_up() # 向上滑动 # 4.关闭APP
time.sleep(3)
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. [第二章]c++学习笔记3(构造函数)

    成员函数的一种 (1)名字与类名相同,可以有参数,不能有返回值(void也不行) (2)作用是对对象初始化,如给成员变量赋初值 (3)如果定义类时没写构造函数,则编译器生成一个默认的无参数的构造函数( ...

  2. Visual Studio中使用Macros插件给代码添加注释、时间和以及自动脚本

    title: Visual Studio中使用Macros插件给代码添加注释.时间和以及自动脚本 date: 2020-09-11 sidebarDepth: 2 tags: 代码 Visual st ...

  3. Fastjson妙用之@JSONField注解

    在开发的过程中使用json格式的地方非常多,现在前后端分离的项目中,前后端数据交换的格式一般为json,这种格式的优/缺点这里不再赘述,感兴趣的可以百度.把java中的实体类序列化为json的方式也有 ...

  4. SQL Server学习之路:建立数据库、建立表

    1.前言 配置是win10+SQL Server 2012,使用的GUI管理工具是SQL Server 2012自带的SQL Server Management Studio(以下简称SSMS).本系 ...

  5. PAT A1091——BFS

    Acute Stroke One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. ...

  6. [atARC114F]Permutation Division

    由于是排列,即任意两个数字都各不相同,因此字典序最大的$q_{i}$就是将每一段的第一个数从大到小排序 接下来,考虑第一个元素,也就是每一段开头的最大值,分类讨论: 1.当$p_{1}\le k$时, ...

  7. 消息抽象层设计和实现-OSS.DataFlow

    前面已经介绍了消息生产消费中间类库(OSS.DataFlow)的简单使用,这篇主要介绍内部的设计实现.主要内容包含: 1. 消息生产消费的抽象设计. 2. 具体使用示例 一. 消息生产消费的抽象设计. ...

  8. 初识XSS攻击

    初识XSS攻击 本文参考于<白帽子讲Web安全>第3章跨站脚本攻击(XSS),该书出版于2014年,因而现在可能存在一些新场景或新技术而未被提及,但本文对学习和了解XSS攻击仍具有重要价值 ...

  9. Vue 中使用 extent 开发loading等全局 组件

    Vue 中使用 extend 开发组件 简介:再开发过程中那面会遇到自定义 loading alert 等全局组件,这里我们可以使用 vue 中的extend 来帮助我们完成 一个简单extend例子 ...

  10. Python中pymysql基本使用

    Python中pymysql模块通过获取mysql数据库命令行游标执行数据库命令来进行数据库操作 优点:操作数据库语句所见即所得,执行了什么数据库语句都很清楚 缺点:操作繁琐,代码量多 1. pymy ...