python+selenium使用ActionChains类move_by_offset拖动鼠标重复执行位移问题

首先声明,以下都是个人见解,如果错误,欢迎指正!

逛论坛发现的问题,其实吧对于这个问题刚开始我也不懂,但谁让我是一个乐于探究的人呢,于是就用代码去测试这个问题,发现在循环内使用move_by_offset去移动鼠标的时候确实是会来回重复移动。循环移动代码:

for x in track:
    action.move_by_offset(xoffset=x, yoffset=0).perform()
    time.sleep(0.2)
action.release().perform()

后来网上找答案,说是ActionChains对象会自动累加位移,需要在循环中新建对象,这个测试了确实是没有问题,加了后可以正常移动。

for x in track:
    action.move_by_offset(xoffset=x, yoffset=0).perform()
    # 新建ActionChains对象
    action = ActionChains(driver)
    time.sleep(0.2)
action.release().perform()

但是!我看了ActionChains类的源代码后,发现move_by_offset方法好像本身就是用来移动鼠标的,既然如此,为什么还要在move_by_offset后面加个perform?想到就做,最后删掉perform后,一样可以正常移动。

for x in track:
    action.move_by_offset(xoffset=x, yoffset=0)
    time.sleep(0.2)
action.release().perform()

perform方法会执行ActionChains对象中的所有动作链,重复执行移动的最大的问题就是在move_by_offset后面加了perform方法 (个人理解)

move_by_offset是将鼠标从上一次鼠标位置移到当前位置(这个方法本身就是根据坐标移动鼠标用的),当循环调用ActionChains对象并再执行动作链,ActionChains对象中还保留着前面位移的动作链,鼠标就会先回到上一次的位置,然后再移到当前位置,就是重复执行了一次上一次位移坐标(看到的结果就是会左右来回移动)。

把move_by_offset后面的perform方法去掉就是为了不执行ActionChains对象中所有的动作链。

这个位移重复执行的问题网上几乎所有能找到的答案都是告诉你,在位移后面新建ActionChains对象清除对象中的动作链,避免重复累加,就能正常移动。

最后吐槽一下,好多人在循环中使用move_by_offset方法移动鼠标都会在后面加一个perform(几乎百分之九十以上),这让我有点想不通。。。为什么要多此一举,这个方法本身就是移动鼠标的,当你加个执行动作链,一次拖动鼠标到目的坐标的时候加个perform确实没有问题,但当使用循环进行多次分段移动的时候就会导致重复执行位移动作,最后还要在后面重建ActionChains对象清除动作链,才能正常移动,这不是自找麻烦么。

emmm~~对此我只想说,你们开心就好!

当然,以上只是我的一些个人见解~勿喷!

另外,我也不是大佬~如果有说错的,可以指出来,共同进步!

你可能感兴趣的:(其它,selenium,python)