@Held6991

Как распаралелить одно окно браузера на несколько процессов?

Здраствуйте, столкнулся с проблемой разрыва сессии логина на определенном сайте, если запускаешь новый браузер, пришла идея не запускать новый браузер, а открыть новые окна с текущего, тогда сессия не рветься, но у меня почему-то закрывается первый браузер, подскажите, пожалуйста, как фиксить и может есть какие-то советы по улучшению кода, другая логика или может более универсальные варианты (хранить печеньки не получается, сайт рвет сессию, когда их грузишь)

import os
import threading
import warnings
from time import sleep
from selenium.webdriver.common.keys import Keys
from selenium import webdriver

warnings.filterwarnings("ignore")

def app(i):
    chrome2 = webdriver.Chrome(chrome_options=options, executable_path=os.getcwd() + '\\chromedriver.exe')
    chrome2.get("site url")
    chrome.quit()

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--disable-blink-features=AutomationControlled")
# options.add_argument("--headless")
chrome = webdriver.Chrome(chrome_options=options, executable_path=os.getcwd() + '\\chromedriver.exe')

try:
    chrome.get("site url")
    chrome.find_element_by_xpath('//a[@href="login/index.php"]').click()
    sleep(1)
    chrome.find_element_by_xpath('//input[@id="username"]').send_keys("login")
    chrome.find_element_by_xpath('//input[@id="password"]').send_keys("pass")
    chrome.find_element_by_xpath('//button[@id="loginbtn"]').click()
    for i in range(4):
        t = threading.Thread(target=app, args=(i,))
        t.start()
except:
    print("Error")
finally:
    chrome.quit()


Пробовал еще вот так открывать именно новые окна сочетанием клавиш, но почему-то оно не создает новых окон, а все делает в одном
import os
import threading
import warnings
from time import sleep
from selenium.webdriver.common.keys import Keys
from selenium import webdriver

warnings.filterwarnings("ignore")

category = ['siteurl/category1',
            'siteurl/category2',
            'siteurl/category3',
            'siteurl/category4']

def app(i):
    body = chrome.find_element_by_tag_name("body")
    body.send_keys(Keys.CONTROL + 'N')
    sleep(2)
    chrome.get(f"{category[i]}")
    chrome.quit()

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument("--disable-blink-features=AutomationControlled")
# options.add_argument("--headless")
chrome = webdriver.Chrome(chrome_options=options, executable_path=os.getcwd() + '\\chromedriver.exe')

chrome.get("site url")
chrome.find_element_by_xpath('//a[@href="login/index.php"]').click()
sleep(1)
chrome.find_element_by_xpath('//input[@id="username"]').send_keys("login")
chrome.find_element_by_xpath('//input[@id="password"]').send_keys("pass")
chrome.find_element_by_xpath('//button[@id="loginbtn"]').click()
for i in range(4):
    t = threading.Thread(target=app, args=(i,))
    t.start()


Заранее всем огромное спасибо
  • Вопрос задан
  • 334 просмотра
Пригласить эксперта
Ответы на вопрос 1
goctio
@goctio
Добрый день. Для чего нужно открывать новые браузеры? Если работа идет на одном сайте, при этом надо чтоб не терялись куки - нужно открывать новые вкладки, а не браузеры.

Делается это так:
driver.execute_script("window.open('https://www.google.com');")


Список активных вкладок можно вывести так:
print(driver.window_handles)

Т.к это реально список, то по нему можно перемещать браузер, то есть переходить по активным вкладкам. Делается это так:
driver.switch_to.window(driver.window_handles[0])

Где 0 - это самая первая вкладка, а 1 - новая, которую вы открыли.

Механика думаю понятна. Надеюсь поможет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы