简介
在网页中我们经常使用缩放操作来便利的查看具体的信息,在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,可以加宏哥的微信拉你进群,请备注:进群)

