这是一个错误吗:Python 的 Selenium ActionChains,与“执行”函数之间有奇怪的延迟?

问题描述 投票:0回答:1

我正在使用 Selenium 的 WebDrivers 用 Python 编写一个函数,以类似人类的方式单击页面中的坐标。它使用 Firefox,但我也注意到 ChromeDriver 也存在同样的问题。

它需要两个参数:一个元素(我的函数从中获取其坐标)和目标点。它将鼠标沿着曲线从一个点移动到另一个点以模仿真人。然后,它会点击目标点。

奇怪的是,我发现“action.perform”函数从起点获得的最大偏移量变得更慢。

此外,我还发现了一些可能是巧合的事情:它被卡住的次数大约是我从元素偏移的

x
的值。因此,当我移动 (x:0,y:0) 时,速度很快,但是当我在循环中以偏移量 (x:14,y:2) 移动时,它会等待大约 14 秒。不过这可能只是巧合。

最后,我听说 java 中有一个针对动作链的 *kwarg 参数,其中包括延迟。我读到大多数人没有使用它,这导致了默认的约 250 毫秒的惩罚。但我找不到Python这样的东西。

有人知道我可能做错了什么,或者这是否是一个错误?

非常感谢!

这是我编写的一个简化示例,它重现了这个问题。

import selenium.webdriver, re
from selenium.common.exceptions import NoSuchElementException  
from selenium.webdriver import ActionChains  
import numpy as np
from time import sleep as delay

def hanging_line(point1, point2): #calculates the coordinates for none-straight line which gets from point1 to point2
    a = (point2[1] - point1[1])/(np.cosh(point2[0]) - np.cosh(point1[0]))
    b = point1[1] - a*np.cosh(point1[0])
    x = np.linspace(point1[0], point2[0], 100)
    y = a*np.cosh(x) + b
    return (x,y)


def click(element,coordinates):
    delay(3)
    actionmouse = ActionChains(driver)
    actionmouse.move_to_element(element);
    actionmouse.perform();

    targetx = coordinates[0]
    targety = coordinates[1]

    points = hanging_line((0,0),(targetx,targety))

    for i in range(len(points[0])):
        x = int(round(points[0][i],1)) #I tried to round it, and to convert it to an int,
        y = int(round(points[1][i],1)) #but found no differences in performance

        print('moving')
        actionmouse.move_by_offset(x, y)
        print('performing') #get stuck here for seconds=`x` value
        actionmouse.perform()
        print(x,y)


    action = ActionChains(driver)
    action.move_to_element_with_offset(element, targetx, targety).click().perform()
    delay(0.3)


driver = selenium.webdriver.Firefox()
driver.get("https://www.dailychess.com/chess/chess-fen-viewer.php")
element = driver.find_element_by_class_name('sidebar-action-button')
click(element,[37,94])

python selenium selenium-webdriver firefox webdriver
1个回答
0
投票

更新:找到解决方案!不是错误...

说明:ActionChains 类中的默认持续时间设置为 250 毫秒。

要覆盖此设置,请使用“duration”参数: 动作= ActionChains(驱动程序,持续时间= 50)

© www.soinside.com 2019 - 2024. All rights reserved.