通过Selenium进行类似人类的鼠标移动

时间:2016-09-10 04:09:04

标签: selenium selenium-webdriver automation protractor bots

故事:

解决验证码的方法之一,例如Google ReCaptcha,就是尝试模仿人类鼠标操作:移动,悬停和点击。

Some users reported让鼠标移动B-spline curves为他们工作。

问题:

如何通过Selenium将鼠标移动到B样条轨迹之后的特定元素?

请注意,常规browser.actions().mouseMove(elm).perform();会跳过"跳跃"对元素的直接和太快。我的理解是,这是一个减慢移动速度的问题,"跳跃"从B点样条轨迹的数学模型顺利地点到点。

我们使用的是Protractor / JavaScript,但这个问题确实与语言无关。 请注意,我并没有尝试解决验证码问题,也没有尝试解决验证码问题,因为新的恶意机器人在这里和那里违反了使用条款。空间。我只是好奇并渴望在测试自动化领域获得更多技能。

2 个答案:

答案 0 :(得分:22)

您可以使用scipy.interpolate插入B样条曲线,就像您在此question中看到的那样。

在这里,我将使用其中一个 B-spline 示例来获取xy的值:

import numpy as np
import scipy.interpolate as si

# Curve base:
points = [[0, 0], [0, 2], [2, 3], [4, 0], [6, 3], [8, 2], [8, 0]];
points = np.array(points)

x = points[:,0]
y = points[:,1]


t = range(len(points))
ipl_t = np.linspace(0.0, len(points) - 1, 100)

x_tup = si.splrep(t, x, k=3)
y_tup = si.splrep(t, y, k=3)

x_list = list(x_tup)
xl = x.tolist()
x_list[1] = xl + [0.0, 0.0, 0.0, 0.0]

y_list = list(y_tup)
yl = y.tolist()
y_list[1] = yl + [0.0, 0.0, 0.0, 0.0]

x_i = si.splev(ipl_t, x_list) # x interpolate values
y_i = si.splev(ipl_t, y_list) # y interpolate values

使用xy的值,您可以使用ActionChains移动鼠标光标:

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

url = "https://codepen.io/falldowngoboone/pen/PwzPYv"
driver = webdriver.Chrome(executable_path="/home/selenium/chromedriver2.25")
driver.get(url)

action =  ActionChains(driver);

startElement = driver.find_element_by_id('drawer')

# First, go to your start point or Element:
action.move_to_element(startElement);
action.perform();

for mouse_x, mouse_y in zip(x_i, y_i):
    action.move_by_offset(mouse_x,mouse_y);
    action.perform();
    print(mouse_x, mouse_y)

答案 1 :(得分:1)

如果您是从台式机魔杖上运行此命令并希望使用实际的鼠标移动,则可以使用AutoIt延迟鼠标移动。