故事:
像Google ReCaptcha一样,解决验证码的方法之一就是尝试 模仿人的鼠标动作 :移动,悬停和点击。
一些用户报告说,随着B样条曲线的作用而使鼠标移动。
问题:
如何通过selenium将鼠标移动到遵循B样条轨迹的特定元素上?
请注意,常规browser.actions().mouseMove(elm).perform();会直接且太快地“跳转”到元素。我的理解是,这是放慢移动速度的问题,它遵循B样条轨迹的数学模型从点到点平滑地“跳跃”。
browser.actions().mouseMove(elm).perform();
我们正在使用量角器/ JavaScript,但问题实际上与语言无关。 请注意,我不是要解决验证码问题,也不是为了“解决验证码问题,使新的恶意机器人违反此处和此处的使用条款”做出贡献。我只是好奇并渴望在测试自动化领域获得更多技能。
您可以scipy.interpolate像在这个问题中看到的那样使用B样条曲线插值。
scipy.interpolate
在这里,我将使用 B样条 示例之一来获取x和的值y:
x
y
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
使用x和值y,您可以使用以下方法移动鼠标光标ActionChains:
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)