Привіт, Гість

dsoft blog

Паралельні запити Python Selenium на прикладі авторизації десяти одночасних користувачів

Published by ds

Інструкція для запуску браузера Selenium з використанням паралельного виконання у Python

Якщо вам потрібно автоматизувати веб-додатки або скрипти, які взаємодіють з веб-сторінками, вам може знадобитися Selenium - фреймворк для тестування веб-додатків, який дозволяє виконувати автоматизовані тести в реальному веб-браузері.

У цій інструкції я покажу вам, як запустити браузер Selenium з використанням паралельного виконання у Python, що дозволить вам ефективніше виконувати завдання.

Крок 1: Встановлення Selenium та необхідних залежностей

Перш за все, вам потрібно встановити Selenium та необхідні залежності. Найпростіший спосіб зробити це - використовуючи менеджер пакетів pip:

pip install selenium

 

Також вам знадобиться браузерний драйвер для того, щоб браузер Selenium працював з браузером на вашому комп'ютері. У цій інструкції ми будемо використовувати Google Chrome, тому вам потрібно завантажити ChromeDriver.

Крок 2: Написання коду для запуску браузера Selenium

У цьому прикладі я використовую Python 3 та бібліотеку concurrent.futures для паралельного виконання. Наступний код демонструє, як запустити браузер Selenium з використанням паралельного виконання.

import time
import concurrent.futures
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

def run_driver(username, password):
    # створюємо параметри для браузера Chrome
    chrome_options = Options()
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_experimental_option("detach", True)
    chrome_options.add_argument("--incognito")
    
    # створюємо об'єкт драйвера
    driver = webdriver.Chrome('chromedriver' ,options=chrome_options)
    
    # затримка для завантаження сторінки

time.sleep(5)

driver.get('https://my.site.com/login')

uname = driver.find_element("name", "login-email")

uname.send_keys(username)

pword = driver.find_element("id", "password")

pword.send_keys(password)

driver.find_element(By.TAG_NAME, "button").click()

WebDriverWait(driver=driver, timeout=50).until(

lambda x: x.execute_script("return document.readyState === 'complete'")

)

error_message = "Incorrect username or password."

errors = driver.find_elements(By.CLASS_NAME, "flash-error")

if any(error_message in e.text for e in errors):

print(f"[!] Login failed for user {username}")

else:

print(f"[+] Login successful for user {username}")

driver.close()

# список користувачів та їх паролів

users = [

{"username": "[email protected]", "password": "12321"},

{"username": "[email protected]", "password": "12321"}, ...] 

 

Основна мета даної програми - зайти на сайт та автоматично оновлювати сторінку. Для цього функція run_driver використовує бібліотеку selenium, яка дозволяє автоматизувати дії в браузері.

Для кожного користувача створюється окремий об'єкт драйвера за допомогою функції webdriver.Chrome(). У даному випадку використовується Google Chrome. Також до об'єкту драйвера додаються різноманітні настройки, такі як --headless, --no-sandbox та --disable-dev-shm-usage. Ці настройки дозволяють запустити браузер у фоновому режимі, що дає змогу зменшити використання ресурсів комп'ютера та збільшити швидкість виконання програми.

Далі, функція використовує метод get() для відкриття веб-сторінки. У даному випадку це посилання на сайт https://my.site.com/login.

Після відкриття сторінки, функція шукає елементи "login-email" та "password" за допомогою методів find_element(), встановлює значення введених логіну та пароля за допомогою методу send_keys(), та натискає на кнопку "login" за допомогою методу click(). Для забезпечення успішного входу на сторінку, програма чекає 50 секунд на завантаження сторінки, використовуючи функцію WebDriverWait().

Якщо введені дані для входу невірні, програма виводить повідомлення про невдалу спробу входу, в іншому випадку - про успішний вхід.

Запускаємо функцію run_driver для кожного користувача

Тепер, коли ми створили список користувачів та паролів, а також функцію, яка запускає браузер і виконує необхідні дії, ми можемо запустити функцію run_driver для кожного користувача. Для цього ми використаємо concurrent.futures.ProcessPoolExecutor, що дозволяє запускати функції у різних процесах.

# створюємо список для зберігання об'єктів драйверів
drivers = []

with concurrent.futures.ProcessPoolExecutor(max_workers=20) as executor:
    # запускаємо функцію run_driver для кожного користувача
    for user in users:
        executor.submit(run_driver, user["username"], user["password"])

 

У цьому коді ми створюємо порожній список drivers для зберігання об'єктів драйверів. Потім ми створюємо ProcessPoolExecutor з max_workers=20, що означає, що ми можемо запускати до 20 процесів одночасно. Нарешті, ми запускаємо функцію run_driver для кожного користувача за допомогою executor.submit(). Це запускає функцію run_driver в окремому процесі для кожного користувача.

Завершення роботи

Після того, як ми запустили функцію run_driver для кожного користувача, ми можемо закінчити роботу. Проте, важливо пам'ятати, що функція run_driver використовує браузери, які не закриваються автоматично після виконання дій. Тому, щоб уникнути переповнення системи браузерами, ми маємо закрити кожен браузер в кінці роботи.

# закриваємо кожен браузер в кінці роботи
for driver in drivers:
    driver.quit()

У цьому коді ми проходимо по кожному об'єкту драйвера в списку drivers та викликаємо метод quit() для закриття кож

Для запуску кожної функції run_driver для кожного користувача, ми будемо використовувати concurrent.futures.ProcessPoolExecutor, який дозволить запускати функції паралельно в окремих процесах. Для цього створимо об'єкт executor і використаємо метод submit для запуску функції run_driver з параметрами username та password.

Завершивши запуск функцій для всіх користувачів, наш скрипт буде очікувати завершення їх виконання та закривати драйвери.

Код програми повинен виглядати наступним чином:

import time

import concurrent.futures

from selenium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.common.by import By

from selenium.webdriver.chrome.options import Options

def run_driver(username, password):

chrome_options = Options()

chrome_options = webdriver.ChromeOptions()

chrome_options.add_argument('--headless')

chrome_options.add_argument('--no-sandbox')

chrome_options.add_argument('--disable-dev-shm-usage')

chrome_options.add_experimental_option("detach", True)

chrome_options.add_argument("--incognito")

driver = webdriver.Chrome('chromedriver' ,options=chrome_options)

driver.get('https://my.site.net/login')

time.sleep(10)

uname = driver.find_element("name", "login-email")

uname.send_keys(username)

pword = driver.find_element("id", "password")

pword.send_keys(password)

driver.find_element(By.TAG_NAME, "button").click()

WebDriverWait(driver=driver, timeout=50).until(

lambda x: x.execute_script("return document.readyState === 'complete'")

)

error_message = "Incorrect username or password."

errors = driver.find_elements(By.CLASS_NAME, "flash-error")

if any(error_message in e.text for e in errors):

print(f"[!] Login failed for user {username}")

else:

print(f"[+] Login successful for user {username}")

#driver.close()

# список користувачів та їх паролів

users = [

{"username": "[email protected]", "password": "12321"},

{"username": "[email protected]", "password": "12321"},...

]

# створюємо список для зберігання об'єктів драйверів

drivers = []

with concurrent.futures.ProcessPoolExecutor(max_workers=20) as executor:

# запускаємо функцію run_driver для кожного користувача

for user in users:

executor.submit(run_driver, user["username"], user["password"])

Ще немає коментарів.

Авторизуйтесь, щоб залишити коментар.

Про нас

Деякі корисні статті присвячені розробці веб-додатків та технологіям, які допоможуть вам створити продуктивні та захищені веб-додатки.

Ми в соцемережах

  1. GitHub
  2. Twitter