之前的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里面有这几个动作:
原文:https://www.cnblogs.com/123blog/p/12622325.html