之前的swipe API提供的操作可以实现单向滑动,如果想要实现类似于九宫格这种连续的滑动需求,该怎么做呢?
TouchAction包含一系列的操作,比如按压、长按、点击、移动、暂停等,可以由这些操作组成一组工作来完成实际的连续滑动需求。
在分析实际需求时,我们会发现有两种情况:
第一种 :整个解锁图案就是一个view,没有其他子元素,那么我们就只能采取坐标的形式:
解决问题思路:先获取元素坐标位置,再获取元素大小,然后切割图片,获取步长,分别计算出每个点的坐标
#首先得到对应 滑动解锁经过的坐标点 element=driver.find_element_by_id("com.xxzb.fenwoo:id/lpv_password") #获取起始坐标-九宫格左上顶点 loc=element.location #获取元素大小 size=element.size #获取分割后的均值,即下面要用到的九宫格的步长 step=size["height"]/6 #得到九宫格绘制的起点坐标,这里例子为第一个坐标点 start_x=loc["x"]+step start_y=loc["y"]+step #滑动九宫格操作,从第一个点、一次滑动到第二个、第三个、第五个、第九个 ta=TouchAction(driver) ta.press(x=start_x,y=start_y).wait(200). move_to(x=start_x+step*2,y=start_y).wait(200). move_to(x=satrt_x+step*4,y=start_y).wait(200). move_to(x=start_x+step*2,y=start_y+step*2).wait(200). move_to(x=start_x+step*4,y=start_y+step*4).wait(200). release().wait(200). perform()
第二种情况是:九个点不是由一整个view构成,而是由分开的imageview的集合构成;
解决问题思路:每个点可以直接定位到,然后移动
#得到所有imageview的集合 images=driver.find_elements(By.xpath,"//android.widget.FrameLayout/android.widget.ImageView") #滑动 ta=TouchAction(driver) ta.press(images[0])wait(200). move_to(images[1]).wait(200). move_to(images[2]).wait(200). move_to(images[4]).wait(200). move_to(images[9]).wait(200). release().wait(200). perform()
这种情况就是常见的场景,先找到各个元素的定位,然后通过TouchAction()来滑动。
关于TouchAction:
1.源码可以在这个路径找到:Lib\site-packages\appium\webdriver\common\touch_action.py
class TouchAction(object): def __init__(self, driver=None): self._driver = driver self._actions = [] def tap(self, element=None, x=None, y=None, count=1): 模拟手指触摸屏 def press(self, el=None, x=None, y=None): 短按:模拟手指按住一个元素,或者坐标 def long_press(self, el=None, x=None, y=None, duration=1000): 长按:模拟按住一个元素,或者坐标 def wait(self, ms=0): 按住元素后的等待时间 def move_to(self, el=None, x=None, y=None): 移动手指到另外一个元素,或者坐标,注意这里坐标不是绝对坐标,是偏移量 def release(self): 释放手指 def perform(self): 执行前面的动作
2.TouchAction里面有这几个动作:
- 触摸 (tap)
- 短按 (press)
- 长按 (long_press)
- 等待 (wait)
- 移动到 (moveTo)
- 释放 (release)
- 执行 (perform)