(7)Appium模拟手势高级操作
TouchAction是AppiumDriver的辅助类,主要针对手势操作,比如滑动、长按、拖动等,
原理是将一系列的动作放在一个链条中发送到服务器,服务器接受到该链条后,解析各个动作,逐个执行。
-
⚠️ 所有手势都要通过执行函数perform()才会运行.
-
1.手指轻敲操作
模拟手指轻敲一下屏幕操作 方法:tap(element=None, x=None, y=None) 方法:perform() # 发送命令到服务器执行操作 参数: 1.element:被定位到的元素 2.x:相对于元素左上角的坐标,通常会使用元素的X轴坐标 3.y:通常会使用元素的Y轴坐标
业务场景: 1.进入设置 2.点击WLAN选项
代码实现: # 通过元素定位方式敲击屏幕 el = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]") TouchAction(driver).tap(el).perform() # 通过坐标方式敲击屏幕,WLAN坐标:x=155,y=250 TouchAction(driver).tap(x=155,y=250).perform()
-
2.手指按操作
模拟手指按下屏幕,按就要对应着离开.
方法:press(el=None, x=None, y=None) 方法:release() # 结束动作,手指离开屏幕 参数: 1.element:被定位到的元素 2.x:通常会使用元素的X轴坐标 3.y:通常会使用元素的Y轴坐标
业务场景: 1.进入设置 2.点击WLAN选项
代码实现: # 通过元素定位方式按下屏幕 el = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]") TouchAction(driver).press(el).release().perform() # 通过坐标方式按下屏幕,WLAN坐标:x=155,y=250 TouchAction(driver).press(x=155,y=250).release().perform()
-
3.等待操作
方法:wait(ms=0) 参数: ms:暂停的毫秒数
业务场景: 1.进入设置 2.点击WLAN选项 3.长按WiredSSID选项5秒
代码实现: # 点击WLAN driver.find_element_by_xpath("//*[contains(@text,'WLAN')]").click() # 定位到WiredSSID el =driver.find_element_by_id("android:id/title") # 通过元素定位方式长按元素 TouchAction(driver).press(el).wait(5000).perform() # 通过坐标方式模拟长按元素 # 添加等待(有长按)/不添加等待(无长按效果) TouchAction(driver).press(x=770,y=667).wait(5000).release().perform()
-
4.手指长按操作
模拟手机按下屏幕一段时间,按就要对应着离开.
方法:long_press(el=None, x=None, y=None, duration=1000) 参数: 1.element:被定位到的元素 2.x:通常会使用元素的X轴坐标 3.y:通常会使用元素的Y轴坐标 4.duration:持续时间,默认为1000ms
业务场景: 1.进入设置 2.点击WLAN选项 3.长按WiredSSID选项5秒
代码实现: # 点击WLAN driver.find_element_by_xpath("//*[contains(@text,'WLAN')]").click() # 定位到WiredSSID el =driver.find_element_by_id("android:id/title") # 通过元素定位方式长按元素 TouchAction(driver).long_press(el,duration=5000).release().perform() # 通过坐标方式长按元素,WiredSSID坐标:x=770,y=667 # 添加等待(有长按)/不添加等待(无长按效果) TouchAction(driver).long_press(x=770,y=667).perform()
- 5.手指移动操作
模拟手机的滑动操作 方法:move_to(el=None, x=None, y=None) 参数: 1.el:定位的元素 2.x:相对于前一个元素的X轴偏移量 3.y:相对于前一个元素的Y轴偏移量
业务场景1: 1.进入设置 2.向上滑动屏幕
代码实现:
# 定位到存储
el = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
# 定位到更多
el1 = driver.find_element_by_xpath("//*[contains(@text,'更多')]")
# 元素方式滑动
TouchAction(driver).press(el).move_to(el1).release().perform()
# 坐标的方式滑动
TouchAction(driver).press(x=240,y=600).wait(100).move_to(x=240,y=100).release().perform()
注意press连接一个move_to实际调用的是swip方法,可在log中查询,不要给绝对坐标(屏幕尺寸不一样)。
业务场景2:
1.进入设置
2.向上滑动屏幕到可见"安全"选项
3.进入到安全
4.点击屏幕锁定方式
5.点击图案
6.绘制图案
代码实现:
# 定位到WLAN
el1 = driver.find_element_by_xpath("//*[contains(@text,'WLAN')]")
# 定位到存储
el2 = driver.find_element_by_xpath("//*[contains(@text,'存储')]")
# 存储上滑到WLAN
driver.drag_and_drop(el2,el1)
# 定位到用户
el3 = driver.find_element_by_xpath("//*[contains(@text,'用户')]")
# 注意 这次使用drag_and_drop方法,传入的"存储定位"仍使用其原始在屏幕上的位置,所以是由存储滑动到用户才可以上滑,否则需要重新"定位存储"
# 存储上滑倒用户位置
driver.drag_and_drop(el2,el3)
# 点击安全按钮
driver.find_element_by_xpath("//*[contains(@text,'安全')]").click()
# 点击屏幕锁定方式按钮
driver.find_element_by_xpath("//*[contains(@text,'屏幕锁定')]").click()
# 点击图案按钮
driver.find_element_by_xpath("//*[contains(@text,'图案')]").click()
# 绘制图案四个坐标 1:(244,967) 2:(723,967) 3:(723,1442) 4:(244,1916)
TouchAction(driver).press(x=244,y=967).wait(100).move_to(x=479,y=0).wait(100)\
.move_to(x=0,y=475).wait(100).move_to(x=-479,y=474).release().perform()
根据手机页面尺寸进行滑动
window_rect=self._driver.get_window_rect()
width=window_rect['width']
height=window_rect['height']
x1=int(width/2)
y_start=int(height*4/5)
y_end=int(height*1/5)
TouchAction(driver).press(x=x1,y=y_start).wait(100).move_to(x=x1,y=y_end).release().perform()
posted on 2020-03-01 16:24 crystal1126 阅读(175) 评论(0) 编辑 收藏 举报