简介

在网页中我们经常使用缩放操作来便利的查看具体的信息,在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位系统

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

2.宏哥的dk版本:"1.8.0_181"

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

3.宏哥的appium版本:1.4.16

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

4.selenium:3.141.0

安装selenium:

输入指令pip install selenium

验证安装成功:pip show selenium

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

5.测试设备:Android 5.1.1 (不能低于5.0版本)

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

6.Python:3.7.2

命令:python -V  ,回车即可。

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

7.百度地图Android版 V10.6.5

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

滑动原理图解

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

放大(Zoom):则手指分别从B>A,C>D同时向外移动放大页面

缩小(pinch):则手指分别从A>B,D>C同时向中间移动缩小页面

想法与思路

  • 安装启动百度地图APP
  • 启动后代码实现点击“同意”,然后接着点击“进入地图”
  • 进入地图由于最近刚过完七夕,有个抢红包的活动,将其关闭
  • 执行缩小函数3次,将地图缩小三次;紧接着执行放大函数,将地图放大三次。

代码实现

(1)安装启动百度地图

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

(2)点击“同意”,然后接着点击“进入地图

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

(3)进入地图由于最近刚过完七夕,有个抢红包的活动,将其关闭

活动关闭定位

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

代码实现

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

(4)执行缩小函数3次,将地图缩小三次;紧接着执行放大函数,将地图放大三次

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

代码运行结果

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

运行代码夜神模拟器自动化操作

参考代码

 # coding=utf-
 # .先设置编码,utf-8可支持中英文,如上,一般放在第一行

 # .注释:包括记录创建时间,创建人,项目名称。
 '''
 Created on --
 @author: 北京-宏哥   QQ交流群:
 Project:学习和使用appium自动化测试-多点触控操作
 '''
 # .导入模块
 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()

 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*).move_to(x=x*).release()
     action2.press(x=x*).move_to(x=x*).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 * ).move_to(x=x * ).release()
     action2.press(x=x * ).move_to(x=x * ).release()

     zoom_action.add(action1,action2)
     print("start zoom...")
     zoom_action.perform()

 if __name__ == '__main__':
     ):
         pinch()

     ):
         zoom()

合格开发的参考代码

# coding=utf-
# .先设置编码,utf-8可支持中英文,如上,一般放在第一行

# .注释:包括记录创建时间,创建人,项目名称。
'''
Created on --
@author: 北京-宏哥   QQ交流群:
Project:学习和使用appium自动化测试-多点触控操作
'''
# .导入模块
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()

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*).move_to(x=x*).release()
    action2.press(x=x*).move_to(x=x*).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 * ).move_to(x=x * ).release()
    action2.press(x=x * ).move_to(x=x * ).release()

    zoom_action.add(action1,action2)  #加载
    print("start zoom...")
    zoom_action.perform()  #执行

#主函数调用子函数

#__name=’__main__’表示执行当前py文件;否则当前文件属于调用模块
if __name__ == '__main__':
    ):     #执行缩小函数3次,range()代表执行0,,2共3次
        pinch()

    ):     #执行放大函数3次,range()代表执行0,,2共3次
        zoom()

小结

  好了,时间不早了,关于多点触控宏哥就简单的介绍到这里,大家晚安!!!

您的肯定就是我进步的动力。如果你感觉还不错,就请鼓励一下吧!记得点波 推荐 哦!!!(点击右边的小球即可! :))
Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

       个人公众号                                                             微信群 (微信群已满100,可以加宏哥的微信拉你进群,请备注:进群)          

Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP                                                                 Appium+python自动化(二十九)- 模拟手指在手机上多线多点作战 - 多点触控(超详解)-LMLPHP

05-11 13:21