在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. MyScript 开发文档

    一.IInk SDK runtime 1.1 引擎创建 1.2 对象释放 1.3 获取并设置配置 配置 访问配置 配置识别 二.文件存储 2.1 支持的内容的类型 2.2 模型结构 2.3 Conte ...

  2. Modelsim仿真新手入门最详细教程

    2021年11月15日 00 安装包/版本 我是提前在网上下好的(但这一点也给我的实验造成了"麻烦"),用的是Modelsim SE-64 2020.4版本的,学校实验室的似乎不同 ...

  3. 菜鸡的Java笔记 comparator 比较器

    1.数组操作类: Arrays        2.两种比较器的使用: Comparable Comparator        3.实现二叉树算法            content (内容)   ...

  4. [hdu6581]Vacation

    首先发现,最终第0辆车一定被堵在某一辆车前,那么等价于它的初始位置就在(那辆车的位置+中间车的车长)/那辆车的速度,其中最大的那个就是答案因此得出结论:$ans=max((\sum_{j=1}^{i} ...

  5. [cf1215F]Radio Stations

    这道题如果没有功率的限制,显然就是一个裸的2-sat 考虑将功率的限制也放在图上:如果选择了功率i,那么功率区间不包含它的点只能不选,连边即可 但是这样建图的边数是o(n^2),需要优化 将功率区间分 ...

  6. LifseaOS 悄然来袭,一款为云原生而生的 OS

    作者:黄韶宇.初扬 审核&校对:溪洋.海珠 编辑&排版:雯燕 LifseaOS 在刚刚过去的云栖大会上,一款新的 Linux Base 操作系统悄悄发布,它就是 LifseaOS(Li ...

  7. AI剪辑和自定义UI,打造更智能的剪辑体验

    为满足开发者构建高效的应用内视频编辑能力,7月的HMS Core 6.0 推出了视频编辑服务(Video Editor Kit),一站式的视频处理能力获得了积极反响.同时,我们也关注到开发者需要集成丰 ...

  8. R语言与医学统计图形-【9】过渡函数qplot

    ggplot2绘图系统 基础绘图包向ggplot2过渡--qplot 绘图理念的不同: 基础绘图包是先铺好画布,再在这张画布上作图(常规思维): ggplot2打破常规,采用图层叠加的方法. qplo ...

  9. C语言 fastq文件转换为fasta文件2

    修改可读取压缩格式文件 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #in ...

  10. C语言按行读入文件

    getline() 函数无论一行多长,动态分配内存读入行 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <s ...