appium里提供TouchAction类和MultiAction类来实现元素的操作.

TouchAction类

TouchAction类:将一系列的动作放在一个链条中,然后将该链条传递给服务器,服务器接受该链条后,解析各个动作,逐个执行.

TouchAction类提供了以下几种方法:
tap:点击
press:短按
long_press:长按,默认1s
wait:等待,单位ms
movie_to:移动到
relese:释放
perform:执行
cancle:取消

为更好的看到效果可在手机上开启:开发者选项-输入-指针位置.
注:appium中左上角为(0,0)

一,单点触控

1,单点触控实现划屏

TouchAction实现从下到上划动:

from appium.webdriver.common.touch_action import TouchAction
#获取窗口大小
size=driver.get_window_size()
#确定要划动的点x轴的位置为屏幕中央
x=size["wedth"]*0.5
#确定从下到上划动距离开始和结束位置
y_start=size["height"]*0.9
y_end=size["height"]*0.1
#初始化
ta=TouchAction(driver)
#按住起始位置移动到结束位置
ta.press(x=x,y=y_start).move_to(x=x,y=y_end).wait(200)

webdriver.py中的swipe()方法已封装该功能,可直接使用.

from appium import webdriver
size = driver.get_window_size()
x=size["width"]*0.5
y_start=size["height"]*0.9
y_end=size["height"]*0.1
driver.swipe(x,y_start,x,y_end,200)

注:如果从上向下划动可调换y_end和y_start的值;如果从左向右划可调换x和y的值

2,列表划动

使用场景:页面展示内容很多需要划动来查看,比如浏览小红书中的内容,看到感兴趣的点击进入详情页面.
分析:
现确定感兴趣内容,如何找到?
通过划屏来找元素,不确定划多少屏用到while循环.

while循环什么时候停止?
找到元素或划到底.

如何确定已经划到下一页面了?
新页面和老页面的源代码不同可判断为新页面;
old历史页面初始值为None,new当前页面driver.page_source获取当前页面源码,循环过程中执行划动后将new赋值给old,直到old==new,即划不动了.

#要找到元素
loc=(MobileBy.ANDROID_UIAUTOMATOR,'text("aa")')
#设置old和new的初始值
old=None
new=driver.page_source
while old!=new:
	#找元素-driver.find_element或者等待,没有找找元素或者等待失败,都抛异常
	try:
		WebDriverWait(driver,5).until(EC.visibility_of_element_located(loc))
	except:
		#没找到,继续划到下一屏
		driver.swipe(x,y_start,y_end,200)
		sleep(1)
		#更新新旧页面
		old=new
		new=driver.page_source
	else:
		#找到了点击一下,结束循环
		driver.find_element(*loc).click()
		break

二,多点触控

1,实现放大缩小

MultiAction类中提供了多点触控的方式,该类下面只有add()和perform()方法;
原理是将多条轨迹合并在一起同步执行,只需要将每条轨迹的动作添加到add()方法中再perform()就OK.
使用场景:放大和缩小的场景中使用偏多.
已下代码为在百度地图中屏幕正中间放大.

#设备大小
size=driver.get_window_size()
#实例话多点触控类
ma=MultiAction(driver)
#第一个touchAction
ta1=TouchAction(driver)
ta1.press(x=size["width"*0.5],y=size["height"]*0.5).wait(200)\
	.move_to(x=size["width"*0.1],y=size["height"]*0.9).wait(200).release()
#第二个
ta2=TouchAction(driver).press(x=size["width"*0.5],y=size["height"]*0.5).wait(200)\
	.move_to(x=size["width"*0.9],y=size["height"]*0.1).wait(200).release()
#加入多点触控中
ma.add(ta1,ta2)
#执行
ma.perform()
sleep(6)
driver.quit()

2,实现多指点击

场景:使用场景比较少,比如双击屏幕实现截图
driver.tap()方法实现.其中的要求:最多支持5个指头;只有点击和长按两种动作;当duration=None时为点击,duration不为None时为长按,长按的时间根据传入的duration值决定;第一个参数positions需要传入坐标,并且格式为嵌套元组的列表,第二个参数为duration,单位ms,例如:[(100, 20), (100, 100)], 500].

难者不会 会者不难 学是关键