Appium多点触控操作——地图缩放

问题思考

在使用地图App中,我们经常需要对界面进行缩放操作来更加便利的查看位置。那么在Appium中怎样去模拟这类操作呢?

MultiAction

MultiAction 是多点触控的类,可以模拟用户多点操作。主要包含 add()perform() 两个方法,
MultiAction可以结合前面所说的 ActionTouch可以模拟出用户的多个手指滑动的操作效果;

1
2
from appium.webdriver.common.multi_action import MultiAction
from appium.webdriver.common.touch_action import TouchAction

add()

方法add(self, *touch_actions)TouchAction对象添加到MultiAction中,稍后再执行。

参数:

touch_actions : 一个或多个TouchAction对象,描述一个手指要执行的动作链

用法

1
2
3
4
5
6
7
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()

perform(self) 执行存储在对象中的操作。

用法

1
2
3
4
5
6
7
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
进入地图后分别进行放大缩小操作

测试环境

  • Appium 1.7.2
  • Win10 64bit
  • 夜神模拟器 Android5.1.1
  • 百度地图Android版 V10.6.5

滑动原理图解

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from appium import webdriver
from time import sleep
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:62025'
desired_caps['platforVersion']='5.1.1'

desired_caps['app']=r'C:\Users\Shuqing\Desktop\com.baidu.BaiduMap.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)

driver.find_element_by_id('com.baidu.BaiduMap:id/dj2').click()
driver.find_element_by_id('com.baidu.BaiduMap:id/byo').click()

x=driver.get_window_size()['width']
y=driver.get_window_size()['height']

def pinch():
action1=TouchAction(driver)
action2=TouchAction(driver)
zoom_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()

print('start pinch...')
zoom_action.add(action1,action2)
zoom_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()

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


if __name__ == '__main__':
for i in range(3):
pinch()

for i in range(3):
zoom()

效果演示

参考资料

http://appium.io/docs/cn/writing-running-appium/touch-actions/

https://stackoverflow.com/questions/38565116/zoom-action-in-android-using-appium-python-client