51 votes

Mouvements de souris de type humain via le sélénium

L'Histoire:

Une des approches possibles pour résoudre les captchas, comme Google ReCaptcha, est d'essayer d' imiter l'homme les actions de la souris: les mouvements, en vol stationnaire et de clics.

Certains utilisateurs ont signalé que les décisions de la souris se déplace comme des courbes B-spline a travaillé pour eux.

La Question:

Comment faire pour déplacer la souris sur un élément en particulier à la suite de la B-spline trajectoire via le Sélénium?


Notez que l' browser.actions().mouseMove(elm).perform(); serait "sauter" à l'élément de droite et beaucoup trop vite. Ma compréhension est que c'est une question de ralentir la vitesse de déplacement, le "saut" de point à point en douceur en suivant le modèle mathématique de la courbe B-spline de la trajectoire.

Nous utilisons Rapporteur/JavaScript, mais la question est vraiment indépendant de la langue.Notez que je ne cherche pas à résoudre le captcha, ou de contribuer à la "captcha résolution de faire de nouveau mal les robots collecteurs de violer les conditions d'utilisation ici et là" de l'espace. Je suis juste curieux et désireux d'obtenir plus de compétences dans l'automatisation des tests de l'espace.

41voto

Guilherme Points 809

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 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]]; #curve base
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 interolate values
y_i = si.splev(ipl_t, y_list) #y_interpolate values
 

Avec les valeurs 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)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X