Несколько драйверов одновременно

Чтобы запустить несколько драйверов браузера одновременно можно воспользоваться Python Multiprocessing

import multiprocessing from selenium import webdriver from selenium.webdriver.chrome.options import Options def main(): # Нужное число драйверов driver_count = 3 for i in range(0, driver_count): p = multiprocessing.Process(target=run) p.start() processes_list.append(p) for p in processes_list: p.join() def run(): chrome_options = webdriver.ChromeOptions() driver = webdriver.Chrome(options=chrome_options) driver.get(http://urn.su) if __name__ == '__main__': main()

Ещё один пример, в котором действия драйвера оформлены в виде функций.

Также в этом примере можно увидеть обход предупреждения о посещении небезопасной страницы.

# Этот скрипт вызывается с # аргументами командной строки # python3 multidriver.py # USERNAME SERVICE_IP SERVICE_PWD HOST_PWD NUMBER_OF_PROCESSES import multiprocessing import time import datetime import sys from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options print('Number of arguments:', len(sys.argv), 'arguments.') print('Argument List:', str(sys.argv)) class User: def __init__(self, name, SERVICE_ip, SERVICE_ui_pwd, remote_host_pwd): self._name = name self._SERVICE_ip = SERVICE_ip self._SERVICE_url = "https://" + SERVICE_ip + "/" self._SERVICE_ui_pwd = SERVICE_ui_pwd self._remote_host_pwd = remote_host_pwd def name(self): return self._name def SERVICE_ip(self): return self._SERVICE_ip def SERVICE_url(self): return self._SERVICE_url def SERVICE_ui_pwd(self): return self._SERVICE_ui_pwd def remote_host_pwd(self): return self._remote_host_pwd def main(): NUMBER_OF_TASKS = int(sys.argv[5]) print("URN.SU: -------------------------------------------\n NEW TEST STARTED") with open("performance_data.txt", "a") as pf: pf.write("URN.SU: -------------------------------------------\nNEW TEST STARTED\n") processes_list = [] for i in range(0,NUMBER_OF_TASKS): p = multiprocessing.Process(target=run) p.start() processes_list.append(p) for p in processes_list: p.join() print("\n URN.SU: TEST FINISHED\n-------------------------------------------") def run(): start_time = datetime.datetime.utcnow() log_prefix = start_time.strftime("%Y%m%d%H%M%S%f") log_name = log_prefix + "_log.txt" with open(log_name,"w+") as f: f.write(f"{start_time}: Test started\r\n") user = setup_user() driver = setup_driver() driver = open_SERVICE(driver, user) driver = pass_unsafe_warning(driver) driver = login_to_SERVICE(driver, user) driver = open_connections_tab(driver) driver = select_host(driver) driver = login_to_host(driver, user) confirm_login(driver) finish_time = datetime.datetime.utcnow() tdelta = finish_time - start_time with open(log_name,"a") as f: f.write(f"{finish_time}: Test finished \r\n") f.write(f"Test execution time is {tdelta} \r\n") with open("performance_data.txt", "a") as pf: pf.write(f"{log_name} : {tdelta} \r\n") def setup_user(): current_time = datetime.datetime.utcnow() USERNAME = sys.argv[1] SERVICE_IP = sys.argv[2] SERVICE_UI_PWD = sys.argv[3] REMOTE_HOST_PWD = sys.argv[4] user = User(USERNAME, SERVICE_IP, SERVICE_UI_PWD, REMOTE_HOST_PWD) return user def setup_driver(): current_time = datetime.datetime.utcnow() chrome_options = webdriver.ChromeOptions() driver = webdriver.Chrome(options=chrome_options) driver.set_window_size(1366, 768) return driver def open_SERVICE(driver, user): current_time = datetime.datetime.utcnow() driver.get(user.SERVICE_url()) return driver def pass_unsafe_warning(driver): try: driver.implicitly_wait(10) advanced_button = driver.find_element_by_id("details-button"); advanced_button.click() driver.implicitly_wait(10) proceed_to_link = driver.find_element_by_id("proceed-link"); proceed_to_link.click() except: print("URN.SU: unable to find unsafe warning") return driver return driver def login_to_SERVICE(driver, user): driver.implicitly_wait(10) input_tags = driver.find_elements_by_tag_name("input") username_input = input_tags[0] username_input.send_keys(user.name()) password_input = input_tags[1] password_input.send_keys(user.SERVICE_ui_pwd()) title_class = driver.find_elements_by_class_name("title") for el in title_class: if el.text == "LOGIN": login_button = el login_button.click() return driver def open_connections_tab(driver): driver.implicitly_wait(10) tab_link_class = driver.find_elements_by_class_name("tab-link") connections_button = tab_link_class[1] connections_button.click() return driver def select_host(driver): driver.implicitly_wait(10) glyph_icon_right_triangle = driver.find_elements_by_class_name("glyph-icon-right-triangle") glyph_icon_right_triangle[0].click() glyph_icon_command_line_interface = driver.find_elements_by_class_name("glyph-icon-command-line-interface") glyph_icon_command_line_interface[0].click() return driver def login_to_host(driver, user): driver.implicitly_wait(10) auth_dialog_class = driver.find_elements_by_class_name("AuthenticationDialog") driver.implicitly_wait(10) input_tags = driver.find_elements_by_tag_name("input") for el in input_tags: attribute = el.get_attribute("type") if attribute == "password": password_button = el password_button.send_keys(user.remote_host_pwd()) driver.implicitly_wait(10) title_class = driver.find_elements_by_class_name("title") for el in title_class: if el.text == "LOGIN" or el.text == "Login" or el.text == "login": login_button = el login_button.click() else: pass if not(login_button): print("URN.SUERROR: LOGIN button not found") return driver def confirm_login(driver): driver.implicitly_wait(10) menu_class = driver.find_elements_by_class_name("menu") driver.implicitly_wait(10) terminals_button = driver.find_elements_by_xpath("//*[contains(text(), 'Terminals')]") if (terminals_button): print("URN.SU: Success") else: print("URN.SUERROR: Did not find Terminals button") return driver if __name__ == '__main__': main()

Статьи о Python
Программирование на Python
Интерактивный режим
Списки
Циклы
Методы
Функции
*args **kwargs
enum
Опеределить тип переменной Python
Тестирование с помощью Python
Работа с REST API на Python
Работа с файлами в Python
Скачать файл по сети
SQLite3: работа с БД
datetime: Дата и время в Python
Selenium + Python
Сложности при работе с Python
DJANGO
Flask
Скрипт для ZPL принтера
socket :Python Sockets
Виртуальное окружение
subprocess: выполнение bash команд из Python
multiprocessing: несколько процессов одновременно
psutil: cистемные ресурсы
sys.argv: аргументы командной строки
pydantic: валидация данных
paramiko: SSH из Python
enumerate

Поиск по сайту

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящуюю по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: