L'histoire:
L'une des approches pour résoudre les captchas, comme Google ReCaptcha, consiste à essayer d'imiter les actions de la souris humaine: mouvements, survol et clics.
Certains utilisateurs ont signalé que faire des mouvements de souris comme courbes B-spline fonctionnait pour eux.
La question:
Comment déplacer la souris vers un élément particulier en suivant la trajectoire de la B-spline via le sélénium?
Notez que la browser.actions().mouseMove(Elm).perform();
régulière "sauterait" à l'élément directement et beaucoup trop rapidement. Ma compréhension est qu'il s'agit de ralentir la vitesse de déplacement, de "sauter" d'un point à un autre en douceur en suivant le modèle mathématique de la trajectoire B-spline.
Nous utilisons Protractor/JavaScript, mais la question est vraiment indépendante du langage.Notez que je n'essaie pas de résoudre le captcha, ni de contribuer à l'espace "résoudre le captcha en créant de nouveaux robots malveillants violant les conditions d'utilisation ici et là". Je suis simplement curieux et désireux d'acquérir plus de compétences dans l'espace d'automatisation des tests.
Vous pouvez utiliser scipy.interpolate
pour interpoler les courbes B-spline comme vous pouvez le voir dans cette question .
Ici, je vais utiliser l'un des exemples B-spline pour obtenir les valeurs de x
et 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
Avec les valeurs de x
et y
, vous pouvez déplacer le curseur de la souris avec 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)