简介
在网页中我们经常使用缩放操作来便利的查看具体的信息,在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:\Users\DELL\Downloads\base.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=x* 0.2 ,y=y* 0.2 ).wait( 1000 ).move_to(x=x* 0.4 ,y=y* 0.4 ).wait( 1000 ).release() 49 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() 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:\Users\DELL\Downloads\base.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()
小结
好了,时间不早了,关于多点触控宏哥就简单的介绍到这里,大家晚安!!!
您的肯定就是我进步的动力。
如果你感觉还不错,就请鼓励一下吧!记得点波
推荐
哦!!!(点击右边的小球即可! :))
个人公众号 微信群 (微信群已满100,可以加宏哥的微信拉你进群,请备注:进群)