简介
在网页中我们经常使用缩放操作来便利的查看具体的信息, 在 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 次, 将地图缩小三次; 紧接着执行放大函数, 将地图放大三次
代码运行结果
运行代码夜神模拟器自动化操作
参考代码
- # 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()
- if __name__ == '__main__':
- for i in range(3):
- pinch()
- for i in range(3):
- 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, 可以加宏哥的微信拉你进群, 请备注: 进群)
来源: https://www.cnblogs.com/du-hong/p/11319445.html