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:\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()

小结

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

相关推荐
Thomas_YXQ2 分钟前
Unity3D Overdraw性能优化详解
开发语言·人工智能·性能优化·unity3d
lanbing9 分钟前
PHP 与 面向对象编程(OOP)
开发语言·php·面向对象
yzx99101310 分钟前
Gensim 是一个专为 Python 设计的开源库
开发语言·python·开源
数巨小码人12 分钟前
Linux常见命令
大数据·linux·运维·服务器·elasticsearch·搜索引擎
麻雀无能为力27 分钟前
python自学笔记2 数据类型
开发语言·笔记·python
Ndmzi31 分钟前
matlab与python问题解析
python·matlab
懒大王爱吃狼37 分钟前
怎么使用python进行PostgreSQL 数据库连接?
数据库·python·postgresql
猫猫村晨总38 分钟前
网络爬虫学习之httpx的使用
爬虫·python·httpx
web1508541593539 分钟前
Python线性回归:从理论到实践的完整指南
python·机器学习·线性回归
招风的黑耳40 分钟前
Java集合框架详解与使用场景示例
java·开发语言