selenium - واعادتها - طريقة تحميل وتفعيل برنامج تكرار حركة الماوس والكيبورد



حركات الماوس الشبيهة بالإنسان عبر السيلينيوم (1)

القصة:

يتمثل أحد أساليب حل اختبارات captcha ، مثل Google ReCaptcha ، في محاولة محاكاة إجراءات الماوس البشرية : الحركات والتحويم والنقرات.

أفاد بعض المستخدمين أن تحريك الماوس كما عملت منحنيات B-spline لهم.

السؤال:

كيفية تحريك الماوس إلى عنصر معين بعد مسار B-spline عبر السيلينيوم؟

لاحظ أن browser.actions().mouseMove(elm).perform(); العادي browser.actions().mouseMove(elm).perform(); سوف "القفز" إلى العنصر مباشرة وبسرعة كبيرة. ما أفهمه هو أنها مسألة إبطاء سرعة الحركة ، "القفز" من نقطة إلى أخرى بسلاسة في أعقاب النموذج الرياضي لمسار B-spline.

نحن نستخدم المنقلة / جافا سكريبت ، ولكن السؤال هو حقا لاغية اللغة. لاحظ أنني لا أحاول حل اختبار CAPTCHA ، أو المساهمة في حل "captcha-making" الذي يصنع روبوتات شريرة جديدة تنتهك شروط الاستخدام هنا وهناك. أنا فقط فضولية ومتلهفة للحصول على المزيد من المهارات في مجال التشغيل الآلي للاختبار.


يمكنك استخدام scipy.interpolate منحنيات B-spline كما يمكنك أن ترى في هذا question

هنا سأستخدم أحد نماذج B-spline للحصول على قيم 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]]; #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

باستخدام قيم x و y ، يمكنك تحريك مؤشر الماوس باستخدام 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)




bots