『与善仁』Appium基础 — 23、操作滑动的方式
在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时间越长,滑动这个动作越缓慢,惯性滑动的距离会变少。
业务场景:
- 进入设置。
- 从坐标(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(毫秒)
业务场景:
- 进入设置。
- 模拟手指从存储菜单位置到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:滑动结束的元素
业务场景:
- 进入设置。
- 模拟手指将存储菜单 滑动到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、操作滑动的方式的更多相关文章
- 『与善仁』Appium基础 — 18、元素定位工具(二)
目录 1.Appium Inspector介绍 2.Appium Inspector打开方式 3.Appium Inspector布局介绍 4.Appium Inspector工具的配置 5.Appi ...
- 『与善仁』Appium基础 — 8、Appium自动化测试框架介绍
目录 1.主流的移动端自动化测试框架 (1)Robotium (2)Macaca (3)Appium 2.自动化测试工具的选择 3.Appium简介 提示:我们前面说的Android环境搭建和adb命 ...
- 『与善仁』Appium基础 — 20、Appium元素定位
目录 1.by_id定位 2.by_name定位 3.by_class_name定位 4.by_xpath定位 5.by_accessibility_id定位 6.by_android_uiautom ...
- 『与善仁』Appium基础 — 26、常用手机操作的API说明
目录 1.获取当前手机的时间 2.获取手机屏幕的宽和高 3.获取手机当前网络 4.设置手机网络模式 5.操作手机通知栏 6.综合练习 7.发送键到设备(掌握) 8.手机截图(掌握) 是针对手机一些常用 ...
- 『与善仁』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架构 ...
- 『与善仁』Appium基础 — 10、Appium基本原理
目录 1.Appium自动化测试架构 2.Appium架构图 3.Session说明 4.Desired Capabilities说明 5.Appium Server说明 6.Appium Clien ...
- 『与善仁』Appium基础 — 12、Appium的安装详解
目录 (一)Appium server安装 方式一:(桌面方式:推荐) 1.Appium Desktop下载 2.Appium Desktop安装 3.Appium Desktop使用 方式二:(No ...
- 『与善仁』Appium基础 — 14、Appium测试环境搭建
目录 1.Appium测试环境搭建整体思路 (1)Android测试环境搭建 (2)Appium测试环境搭建 (3)测试脚本语言的环境搭建 2.Appium在Android端和IOS端的工作流程 (1 ...
- 『与善仁』Appium基础 — 15、使用Appium的第一个Demo
我们使用Python语言作为测试脚本的编写语言. 执行脚本前提: Android模拟器或者手机是开机状态. 使用确保电脑和Android设备进行了链接. 也就是使用ADB命令adb connect链接 ...
随机推荐
- sui Mobile 试玩
.... 突然就用上这东西还不熟悉就写了一个页面而已 <a class="open-popup button pull-right create-actions" id=&q ...
- [loj2978]杜老师
假设所有素数从小到大依次为$p_{1},p_{2},...,p_{k}$,我们将$x$转换为一个$k$位的二进制数,其中从低到高第$i$位为1当且仅当其$p_{i}$的幂次为奇数 不难发现以下两个性质 ...
- [loj6518]序列
参考ExtremeSpanningTrees,考虑优化整体二分时求$g_{i}\in \{w_{mid},w_{mid+1}\}$的最优解 首先题目有一个条件似乎没有写出来,是保证$l\le k\le ...
- [loj3343]超现实树
定义1:两棵树中的$x$和$y$对应当且仅当$x$到根的链与$y$到根的链同构 定义2:$x$和$y$的儿子状态相同当且仅当$x$与儿子所构成的树与$y$与儿子所构成的树同构 根据题中所给的定义,有以 ...
- Java设计模式之(七)——装饰器模式
1.什么是装饰器模式? Attach additional responsibilities to an object dynamically keeping the same interface.D ...
- SSM(Spring-MyBatis-SpringMVC)框架整合【完整版】
整合SSM 01 基本配置文件的关系 web.xml配置DispatcherServlet 02 需要的maven依赖 <!--依赖 1.junit 2.数据库连接池 3.servlet 4.j ...
- 7.2 k8s 基于PV、PVC搭建zookeeper 3节点集群
1.PV,PVC介绍 1.1.StorageClass & PV & PVC关系图 Volumes 是最基础的存储抽象,其支持多种类型,包括本地存储.NFS.FC以及众多的云存储,我们 ...
- P6585 中子衰变
我们偶数的时候只要对称操作. 奇数的话,我们定义\(1\)的相反数为\(-1\),\(0\)相反数为\(0\). 我们维护最长的两边的相反串,中间一段除了一个端点,其他均被染成同色. 那么如果对方染端 ...
- [ARC101C] Ribbons on Tree
神仙的容斥题与神仙的树形DP题. 首先搞一个指数级的做法:求总的.能够覆盖每一条边的方案数,通过容斥可以得到\(\text{ans}=\sum\limits_E{(-1)^{|E|}F(E)}\).其 ...
- 富集分析DAVID、Metascape、Enrichr、ClueGO
前言 一般我们挑出一堆感兴趣的基因想临时看看它们的功能,需要做个富集分析.虽然公司买了最新版的数据库,如KEGG,但在集群跑下来嫌麻烦.这时网页在线或者本地化工具派上用场了. DAVID DAVID地 ...