Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作
1. 滑动和拖拽
我们在做自动化测试的时候,有些按钮是需要滑动几次屏幕后才会出现,此时,我们需要使用代码来模拟手指的滑动,也就是接下来要学的滑动和拖拽了。
1.1 swipe滑动事件
从一个坐标位置滑动到另一个坐标位置,只能是两个点之间的滑动。
方法:
driver.swipe(start_x, start_y, end_x, end_y, duration=None):参数分别是起点坐标的x,y和终点坐标的x,y,以及滑动时间,滑动事件的单位是ms。
实例1:
模拟手指从(100,2000),滑动到(100,1000)的位置。
driver.swipe(100, 2000, 100, 1000)
实例2:
模拟手指从(100, 2000),滑动到(100, 100)的位置。
driver.swipe(100, 2000, 100, 100)
实例3:
模拟手指从(100, 2000),滑动到(100, 100)的位置,持续5秒。
driver.swipe(100, 2000, 100, 100, 5000)
距离相同时,持续时间越长,惯性越小。
持续时间相同时,手指滑动的距离越大,实际滑动的距离也就越大。
1.2 scroll滑动事件
从一个元素滑动到另一个元素,直到页面自动停止。
方法:
driver.scroll(origin_el, destination_el):参数分别是滑动开始的元素和滑动结束的元素。
实例:
从“存储”滑动到“更多”。
save_button = driver.find_element_by_xpath("//*[@text='存储']")
more_button = driver.find_element_by_xpath("//*[@text='更多']")
driver.scroll(save_button, more_button)
不能设置持续时间,惯性很大。
1.3 drag_and_drop拖拽事件
从一个元素滑动到另一个元素,第二个元素代替第一个元素原本屏幕上的位置。
方法:
driver.drag_and_drop(origin_el, destination_el):参数分别是滑动开始的元素和滑动结束的元素。
将“存储”拖拽到“更多”。
save_button = driver.find_element_by_xpath("//*[@text='存储']")
more_button = driver.find_element_by_xpath("//*[@text='更多']")
driver.drag_and_drop(save_button, more_button)
不能设置持续时间,没有惯性
1.4 滑动和拖拽的选择
滑动和拖拽无非就是考虑是否具有“惯性”,以及传递的参数是“元素”还是“坐标”。
可以分为四种情况:
有 “惯性” ,传入 “元素”:scroll。
无 “惯性” ,传入 “元素”:drag_and_drop。
有 “惯性” ,传入 “坐标”:swipe,并且设置较短的duration时间。
无 “惯性” ,传入 “坐标”:swipe,并且设置较长的duration时间。
2. 高级手势
高级手势TouchAction可以实现一些针对手势的操作,比如滑动、长按、拖动等。我们可以将这些基本手势组合成一个相对复杂的手势。比如,我们解锁手机或者一些应用软件都有手势解锁的这种方式。
想要使用TouchAction,必须要创建TouchAction对象,通过对象调用想要执行的手势,通过perform()执行动作。
需要导入的模块:
from appium.webdriver.common.touch_action import TouchAction
2.1 轻敲操作
模拟手指对某个元素或坐标按下并快速抬起。比如,固定点击(100, 100)的位置。
方法:
TouchAction(driver).tap(element=None, x=None, y=None).perform():参数可以是元素,也可以是x,y坐标。
实例:
打开《设置》,轻敲“WLAN”。
# coding:utf-8
from appium import webdriver
from time import sleep
from appium.webdriver.common.touch_action import TouchAction # 初始化
desired_caps = {}
# 使用哪种移动平台
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings' # 启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) el = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
TouchAction(driver).tap(el).perform() sleep(5) #退出driver
driver.quit()
2.2 按下和抬起操作
模拟手指一直按下,模拟手指抬起。可以用来组合成轻敲或长按操作。
方法:
TouchAction(driver).press(el=None, x=None, y=None).perform():模拟手指按下,参数和轻敲操作一样。
方法:
TouchAction(driver).release().perform():模拟手指对元素或坐标的抬起操作。
实例1:
使用坐标的形式按下 WLAN(650, 650),2 秒后,按下(650, 650)的位置。
# coding:utf-8
from appium import webdriver
from time import sleep
from appium.webdriver.common.touch_action import TouchAction # 初始化
desired_caps = {}
# 使用哪种移动平台
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings' # 启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) TouchAction(driver).press(x=650, y=650).perform()
sleep(2)
TouchAction(driver).press(x=650, y=650).perform() sleep(5) #退出driver
driver.quit()
实例2:
使用坐标的形式按下 WLAN (650, 650),2 秒后,按下(650, 650)的位置,并抬起。
# coding:utf-8
from appium import webdriver
from time import sleep
from appium.webdriver.common.touch_action import TouchAction # 初始化
desired_caps = {}
# 使用哪种移动平台
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings' # 启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) TouchAction(driver).press(x=650, y=650).perform()
sleep(2)
TouchAction(driver).press(x=650, y=650).release().perform() sleep(5) #退出driver
driver.quit()
2.3 等待操作
模拟手指等待,比如按下后等待5秒之后再抬起。
方法:
TouchAction(driver).wait(ms=0).perform():参数是暂停的毫秒数。
实例:
使用坐标的形式点击 WLAN(650, 650),2 秒后,按下(650, 650)的位置,暂停2秒,并抬起。
# coding:utf-8
from appium import webdriver
from time import sleep
from appium.webdriver.common.touch_action import TouchAction # 初始化
desired_caps = {}
# 使用哪种移动平台
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.Settings' # 启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) TouchAction(driver).tap(x=650, y=650).perform()
sleep(2)
TouchAction(driver).press(x=650, y=650).wait(2000).release().perform() sleep(5) #退出driver
driver.quit()
2.4 长按操作
模拟手指移动操作,比如,手势解锁需要先按下,再移动。
方法:
TouchAction(driver).move_to(el=None, x=None, y=None).perform():参数同上。
实例:
在手势解锁中,画一个如下图的案例。
手势解锁的包名和界面名:
com.android.settings/.ChooseLockPattern
# coding:utf-8
from appium import webdriver
from time import sleep
from appium.webdriver.common.touch_action import TouchAction # 初始化
desired_caps = {}
# 使用哪种移动平台
desired_caps['platformName'] = 'Android'
# Android版本
desired_caps['platformVersion'] = '5.1.1'
#使用adb devices -l 查询,当有多台设备时,需要声明
desired_caps['deviceName'] = '127.0.0.1:62001'
#包名
desired_caps['appPackage'] = 'com.android.settings'
#界面名
desired_caps['appActivity'] = '.ChooseLockPattern' # 启动服务
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) TouchAction(driver).press(x=150, y=525).move_to(x=450, y=525).move_to(x=750,
y=525).move_to(x=750, y=825).move_to(x=450, y=825).move_to(x=150,
y=825).move_to(x=450, y=1125).release().perform() sleep(5) #退出driver
driver.quit()
3. 手机操作
3.1 获取手机分辨率
自动化测试可能会需要根据当前设备的屏幕分辨率来计算一些点击或者滑动的坐标。
方法:
driver.get_window_size()
实例:
输出当前设备的屏幕分辨率。
print(driver.get_window_size())

3.2 手机截图
有些自动化的操作可能没有反应,但并不报错。此时我们就可以将操作过后的关键情况,截图留存。后 期也可以根据图片发现问题。
方法:
get_screenshot_as_file(filename):参数是将截图保存为指定路径下、指定格式的图片。
实例:
打开《设置》界面,截图当前页面保存到当前目录,命名为screen.png。(也可以修改为绝对路径,将图片保存在目标文件夹中。)
driver.get_screenshot_as_file("screen.png")


3.3 获取和设置手机网络
视频应用在使用流量看视频的时候,大部分都会提示用户正在是否继续播放。作为测试人员,我们可能需要用自动化的形式来判断是否有对应的提示。即,用流量的时候应该有提示,使用WIFI的时候应该没有提示。
3.3.1 获取手机网络
方法:
driver.network_connection
实例:
获取当前网络类型,并打印到控制台。
print(driver.network_connection)

打印了一个6,这是什么意思呢,我们去查看下driver.network_connection的源码。

可以看到6代表的意思是所有网络全部打开,即手机流量和WIFI都是开启状态的。
3.3.2 设置手机网络
方法:
driver.set_network_connection(connectionType):参数为网络类型。
实例:
设置当前设备为飞行模式。
driver.set_network_connection(1)

又将网络设置为全部打开
driver.set_network_connection(6)

3.4 发送键到设备
模拟按 “返回键” “home键” 等等操作,比如,很多应用有按两次返回键退出应用的功能,如果这个功能 需要我们做自动化,那么一定会用到这个方法。
方法:
driver.press_keycode(keycode, metastate=None):第一个参数是发送给设备的关键代码,第二个是关键代码的元信息,一般是默认值。
按键对应的编码,大家可以看我找到的一个CSDN大佬总结的:https://blog.csdn.net/feizhixuan46789/article/details/16801429
实例:
点击三次音量加,再点击返回,再点击两次音量减。(为了让效果明显,我设置了暂停)
driver.press_keycode(24)
sleep(1)
driver.press_keycode(24)
sleep(1)
driver.press_keycode(24)
sleep(1)
driver.press_keycode(4)
sleep(1)
driver.press_keycode(25)
sleep(1)
driver.press_keycode(25)
3.5 操作手机通知栏
测试即时通信类软件的时候,如果A给B发送一条消息,B的通知栏肯定会显示对应的消息。我们想通过通知栏来判断B是否收到消息,一定要先操作手机的通知栏。
方法:
driver.open_notifications():打开手机通知栏。
appium官方并没有为我们提供关闭通知的api,那么现实生活中怎么关闭,就怎样操作就行,比如,手指从下往上滑动,或者,按返回键。
实例:
打开通知栏,两秒后,关闭通知栏。
driver.open_notifications()
sleep(2)
driver.press_keycode(4)
Appium(九):Appium API(三) 滑动和拖拽、高级手势、手机操作的更多相关文章
- h5页面ios,双击向上滑动,拖拽到底部还能继续拖拽(露出黑色背景)
h5页面ios,双击向上滑动,拖拽到底部还能继续拖拽 标签: 手机 2016-02-02 18:09 696人阅读 评论(0) 收藏 举报 在ios下,双击屏幕某些地方,滚动条会自动向上走一段. ...
- 基于html5拖拽api实现列表的拖拽排序
基于html5拖拽api实现列表的拖拽排序 html代码: <ul ondrop="drop_handler(event);" ondragover="dragov ...
- Android滑动列表(拖拽,左滑删除,右滑完成)功能实现(1)
场景: 近期做的TODO APP需要在主页添加一个功能,就是可以左滑删除,右滑完成.看了一下当前其他人做的例如仿探探式的效果,核心功能基本一样,但是和我预想的还是有少量区别,于是干脆自己重头学一遍如何 ...
- Android滑动列表(拖拽,左滑删除,右滑完成)功能实现(2)
ItemTouchHelper类 之前我们实现了滑动列表的一些基本功能,为了实现更多的效果,我们来仔细看一下ItemTouchHelper中的类: ItemTouchHelper.SimpleCall ...
- FileReader (三) - 网页拖拽并预显示图片简单实现
以下是一个很贱很简单的一个 在网页上图拽图片并预显示的demo. 我是从https://developer.mozilla.org/en-US/docs/Web/API/FileReader#Stat ...
- C#开发PACS医学影像处理系统(九):序列控件与拖拽
1.先看结构: 创建WPF用户控件:YourTab 创建WPF用户控件:YourItem 创建选项卡时循环添加item,并设置序列缩略图到控件和异步下载的进度条, 1个病人1个或多个Study检查,1 ...
- QTGraphics-View拖拽以及鼠标指针操作
因为QGraphicsView继承自QWidget,它也提供了像QWidget那样的拖拽功能. 另外,为了方便,Graphics View框架也为场景以及每个item提供拖拽支持.当视图接收到拖拽事件 ...
- jQ插件--时间线插件和拖拽API
这个时间轴是工作上用到的,自己写了一个, qq空间有时间轴的控件, 百度文库也有时间轴的控件: 百度的时间轴大概是这样的: 用户点击对应的锚链接, 那个三角会滚动, 然后左侧的界面也会滚动: 实际的 ...
- JS组件系列——Bootstrap Table 表格行拖拽
前言:之前一直在研究DDD相关知识,好久没更新JS系列文章了.这两天做了一个简单的业务需求,觉得效果还可以,今天在这里分享给大家,欢迎拍砖~~ 一.业务需求及实现效果 项目涉及到订单模块,那天突然接到 ...
随机推荐
- SQL追踪器的安装和使用
SQL追踪器主要作用快速查出错误SQL语言.此工具能几秒钟追踪出sql 数据库操作,能几分钟内分析任意项目系统数据库表结构,瞬间无刷新测试.调试 php代码 第一步:下载 https://pan.ba ...
- Python面试180道题
版权声明:本文为CSDN博主「CSDN学院官方账号」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/csd ...
- 华为ARM64服务器上手体验--不吹不黑,用实际应用来看看TaiShan鲲鹏的表现
背景 中美贸易冲突以来,相信最大的感受,并不是我对你加多少关税,而是我有,可我不卖给你."禁售"成了市场经济中最大的竞争力. 相信也是因为这个原因,华为"备胎转正&quo ...
- JGit----将 Git 嵌入你的应用
如果你想在一个 Java 程序中使用 Git ,有一个功能齐全的 Git 库,那就是 JGit . JGit 是一个用 Java 写成的功能相对健全的 Git 的实现,它在 Java 社区中被广泛使用 ...
- P2910 [USACO08OPEN]寻宝之路Clear And Present Danger |Floyd
题目描述 农夫约翰正驾驶一条小艇在牛勒比海上航行. 海上有N(1≤N≤100)个岛屿,用1到N编号.约翰从1号小岛出发,最后到达N号小岛. 一张藏宝图上说,如果他的路程上经过的小岛依次出现了Ai,A2 ...
- MD5、公钥、私钥、加密、认证
MD5 MD5的全称是Message-Digest Algorithm 5. MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法. 换句话说就是,即使你看到 ...
- Springboot结合Redis
安装 Redis 安装 gcc Yum install gcc-c++ 解压 redis.3.0.0.tar.gz 压缩包 tar -zxvf redis-3.0.0.tar.gz 进入解压后的目 ...
- 移动开发在路上-- IOS移动开发 五 网络请求封装
接着上次的讲,这次我们讲 网络请求的封装 打开创建的项目,让我们一起来继续完成他, 上次我们说到GET请求地址的拼接: 我们接着上次的继续完善: 下边我们要定义的是 block //定义block ...
- 【解决】http: server gave HTTP response to HTTPS client
[问题]上传镜像到私有仓库时报错 $ docker push xxx.xxx.xxx.xxx:5000/java-8 The push refers to repository [xxx.xxx.xx ...
- ARTS-S k8s配制文件demo
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: go-demo-hostname spec: replicas: 2 t ...