Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)
Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)
简介
在网页中我们经常使用缩放操作来便利的查看具体的信息,在appium中使用MultiAction多点触控的类来实现。MultiAction是多点触控的类,可以模拟用户多点操作。主要包含加载add()和执行perform()两个方法.
问题思考
在使用地图App中,我们经常需要对界面进行缩放操作来更加便利的查看位置。那么在Appium中怎样去模拟这类操作呢?
MultiAction
MultiAction 是多点触控的类,可以模拟用户多点操作。主要包含 add() 和 perform() 两个方法, MultiAction可以结合前面所学的 ActionTouch可以模拟出用户的多个手指滑动的操作效果; MultiAction一般和TouchAction结合使用,故需要导入以下模块:
from appium.webdriver.common.multi_action import MultiAction
from appium.webdriver.common.touch_action import TouchAction
加载:
方法add(self, *touch_actions)将TouchAction对象添加到MultiAction中,稍后再执行。
参数:
touch_actions - 一个或多个TouchAction对象,描述一个手指要执行的动作链
用法
复制代码
a1 = TouchAction(driver)
a1.press(el1).move_to(el2).release()
a2 = TouchAction(driver)
a2.press(el2).move_to(el1).release()
MultiAction(driver).add(a1, a2)
复制代码
执行
perform(self) 执行存储在对象中的操作。
用法
复制代码
a1 = TouchAction(driver)
a1.press(el1).move_to(el2).release()
a2 = TouchAction(driver)
a2.press(el2).move_to(el1).release()
MultiAction(driver).add(a1, a2).perform()
复制代码
Ps:是不是有点类似Python里面的多线程和多进程的使用。
多点触控操作实践——地图App缩放
测试场景
安装启动百度地图Android app 进入地图后分别进行放大缩小操作
测试环境
1.宏哥的系统环境是Windows 10版本 64位系统
2.宏哥的dk版本:"1.8.0_181"
3.宏哥的appium版本:1.4.16
4.selenium:3.141.0
安装selenium:
输入指令pip install selenium
验证安装成功:pip show selenium
5.测试设备:Android 5.1.1 (不能低于5.0版本)
6.Python:3.7.2
命令:python -V ,回车即可。
7.百度地图Android版 V10.6.5
滑动原理图解
放大(Zoom):则手指分别从B>A,C>D同时向外移动放大页面
缩小(pinch):则手指分别从A>B,D>C同时向中间移动缩小页面
想法与思路
安装启动百度地图APP
启动后代码实现点击“同意”,然后接着点击“进入地图”
进入地图由于最近刚过完七夕,有个抢红包的活动,将其关闭
执行缩小函数3次,将地图缩小三次;紧接着执行放大函数,将地图放大三次。
代码实现
(1)安装启动百度地图
(2)点击“同意”,然后接着点击“进入地图
(3)进入地图由于最近刚过完七夕,有个抢红包的活动,将其关闭
活动关闭定位
代码实现
(4)执行缩小函数3次,将地图缩小三次;紧接着执行放大函数,将地图放大三次
代码运行结果
运行代码夜神模拟器自动化操作
参考代码
复制代码
1 # coding=utf-8
2 # 1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
3
4 # 2.注释:包括记录创建时间,创建人,项目名称。
5 '''
6 Created on 2019-8-08
7 @author: 北京-宏哥 QQ交流群:707699217
8 Project:学习和使用appium自动化测试-多点触控操作
9 '''
10 # 3.导入模块
11 from appium import webdriver
12 from selenium.common.exceptions import NoSuchElementException
13 from appium.webdriver.common.touch_action import TouchAction
14 from appium.webdriver.common.multi_action import MultiAction
15
16 desired_caps={}
17 desired_caps['platformName']='Android'
18 desired_caps['deviceName']='127.0.0.1:62001'
19 desired_caps['platforVersion']='5.1.1'
20
21 desired_caps['app']=r'C:UsersDELLDownloadsbase.apk'
22 desired_caps['appPackage']='com.baidu.BaiduMap'
23 desired_caps['appActivity']='com.baidu.baidumaps.WelcomeScreen'
24
25 driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
26 driver.implicitly_wait(5)
27
28 x=driver.get_window_size()['width']
29 y=driver.get_window_size()['height']
30 #点击同意
31 driver.find_element_by_id('com.baidu.BaiduMap:id/ok_btn').click()
32 #点击进入地图
33 driver.find_element_by_id('com.baidu.BaiduMap:id/btn_enter_map').click()
34
35 #检测是否有活动页面弹窗,如果有就点击关闭(宏哥做的时候有个领红包的活动页面)
36 try:
37 closeBtn=driver.find_element_by_id('com.baidu.BaiduMap:id/guide_close')
38 except NoSuchElementException:
39 pass
40 else:
41 closeBtn.click()
42
43 def pinch():
44 action1=TouchAction(driver)
45 action2=TouchAction(driver)
46 pinch_action=MultiAction(driver)
47
48 action1.press(x=x0.2,y=y0.2).wait(1000).move_to(x=x0.4,y=y0.4).wait(1000).release()
49 action2.press(x=x0.8,y=y0.8).wait(1000).move_to(x=x0.6,y=y0.6).wait(1000).release()
50
51 pinch_action.add(action1,action2)
52 print('start pinch...')
53 pinch_action.perform()
54
55 def zoom():
56 action1 = TouchAction(driver)
57 action2 = TouchAction(driver)
58 zoom_action = MultiAction(driver)
59
60 action1.press(x=x 0.4, y=y 0.4).wait(1000).move_to(x=x 0.2, y=y 0.2).wait(1000).release()
61 action2.press(x=x 0.6, y=y 0.6).wait(1000).move_to(x=x 0.8, y=y 0.8).wait(1000).release()
62
63 zoom_action.add(action1,action2)
64 print("start zoom...")
65 zoom_action.perform()
66
67 if name == '__main__':
68 for i in range(3):
69 pinch()
70
71 for i in range(3):
72 zoom()
复制代码
合格开发的参考代码
复制代码
coding=utf-8
1.先设置编码,utf-8可支持中英文,如上,一般放在第一行
2.注释:包括记录创建时间,创建人,项目名称。
'''
Created on 2019-8-08
@author: 北京-宏哥 QQ交流群:707699217
Project:学习和使用appium自动化测试-多点触控操作
'''
3.导入模块
from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
from appium.webdriver.common.touch_action import TouchAction
from appium.webdriver.common.multi_action import MultiAction
初始化
desired_caps={}
desired_caps['platformName']='Android'
desired_caps['deviceName']='127.0.0.1:62001'
desired_caps['platforVersion']='5.1.1'
desired_caps['app']=r'C:UsersDELLDownloadsbase.apk'
desired_caps['appPackage']='com.baidu.BaiduMap'
desired_caps['appActivity']='com.baidu.baidumaps.WelcomeScreen'
driver=webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.implicitly_wait(5)
x=driver.get_window_size()['width']
y=driver.get_window_size()['height']
点击同意
driver.find_element_by_id('com.baidu.BaiduMap:id/ok_btn').click()
点击进入地图
driver.find_element_by_id('com.baidu.BaiduMap:id/btn_enter_map').click()
检测是否有活动页面弹窗,如果有就点击关闭(宏哥做的时候有个领红包的活动页面)
try:
closeBtn=driver.find_element_by_id('com.baidu.BaiduMap:id/guide_close')
except NoSuchElementException:
pass
else:
closeBtn.click()
定义缩小函数
def pinch():
action1=TouchAction(driver) #第一个手势 action2=TouchAction(driver) #第二个手势 pinch_action=MultiAction(driver) #缩小手势 action1.press(x=x*0.2,y=y*0.2).wait(1000).move_to(x=x*0.4,y=y*0.4).wait(1000).release() action2.press(x=x*0.8,y=y*0.8).wait(1000).move_to(x=x*0.6,y=y*0.6).wait(1000).release() pinch_action.add(action1,action2) #加载 print('start pinch...') pinch_action.perform() #执行
定义放大函数
def zoom():
action1 = TouchAction(driver) #第一个手势 action2 = TouchAction(driver) #第二个手势 zoom_action = MultiAction(driver) #放大手势 action1.press(x=x * 0.4, y=y * 0.4).wait(1000).move_to(x=x * 0.2, y=y * 0.2).wait(1000).release() action2.press(x=x * 0.6, y=y * 0.6).wait(1000).move_to(x=x * 0.8, y=y * 0.8).wait(1000).release() zoom_action.add(action1,action2) #加载 print("start zoom...") zoom_action.perform() #执行
主函数调用子函数
__name=’__main__’表示执行当前py文件;否则当前文件属于调用模块
if name == '__main__':
for i in range(3): #执行缩小函数3次,range(3)代表执行0,1,2共3次 pinch() for i in range(3): #执行放大函数3次,range(3)代表执行0,1,2共3次 zoom()
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
java代码之美(13)--- Predicate详解
java代码之美(13)--- Predicate详解遇到Predicate是自己在自定义Mybatis拦截器的时候,在拦截器中我们是通过反射机制获取对象的所有属性,再查看这些属性上是否有我们自定义的UUID注解。 如果有该注解,那么就给该属性赋值UUID随机字符串,作为主键保存到数据库。所以前提条件就是获取带有UUID注解的属性,就需要用到Predicate。 //获取所有带UUID注解的属性 Set allFields = ReflectionUtils.getFields(object.getClass(),x.getAnnotation(UUId.class) != null);也想到之前自己在用steam处理集合的时候,添加的过滤条件也是用Predicate,只不过它们不在同一包下。虽然它们不在同一包下但它们的作用是一致的,就是 Predicate接口主要用来判断一个参数是否符合要求 下面对这两个接口分别进行说明并举例。 一、java.util.function.Predicate这里类是java自带主要广泛用在支持lambda表达式的API中。 1、接口源码@Functio...
- 下一篇
看!闲鱼在ServiceMesh的探索和实践 | 8月9号云栖夜读
点击订阅云栖夜读日刊,专业的技术干货,不容错过! 阿里专家原创好文 1.看!闲鱼在ServiceMesh的探索和实践 在阿里服务端开发以Java为主的大背景下,其他异构语言业务如何调用现有Java服务,如何与集团中间件打通,就成为使用非Java语言团队必须要解决的首要问题。阅读更多》》 2.编码规范 | Java函数优雅之道(上) 本文总结了一套与Java函数相关的编码规则,旨在给广大Java程序员一些编码建议,有助于大家编写出更优雅、更高质、更高效的代码。这套编码规则,通过在高德采集部门的实践,已经取得了不错的成效。阅读更多》》 3.遍地开花的 Attention ,你真的懂吗? 被 paper 中各种各样的 Attentioin 搞得晕晕乎乎,尽管零零散散地整理过一些关于Attention 的笔记,重点和线索依然比较凌乱。今天,阿里巴巴工程师楠易,将 Attentioin 的知识系统性地梳理、回顾、总结,不求深刻,但求浅显,希望能帮助对 Attention 有疑惑的同学。阅读更多》》 4.手淘促活那些事儿 | 智能投放算法框架助力用户增长 本文主要介绍以手淘促活为目的的全链路智能投...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库