我正在使用 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])
说明:ActionChains 类中的默认持续时间设置为 250 毫秒。
要覆盖此设置,请使用“duration”参数: 动作= ActionChains(驱动程序,持续时间= 50)