- Как сохранить сессию логина в Selenium?
- Selenium python как сохранить данные сессии и установить кастомный путь до профиля Chrome
- Selenium python как сохранить данные сессии и установить кастомный путь до профиля Chrome
- Persistent Selenium Sessions
- Python-bloggers
- Data science news and tutorials — contributed by Python bloggers
- Persistent Selenium Sessions
Как сохранить сессию логина в Selenium?
Здраствуйте, есть такая проблема, использую мультипроцессинг вместе с селениумом, но на одном сайте если логинишься с новоподнятого браузера (или другого браузера) то рветься предыдущая сессия логина (т.е. остается активной только последняя), есть способы сохранить текущую сессию логина для новоподнятного браузера и как это реализовать или может у кого-то будут другие какие-то идеи, заранее всем спасибо за ответы
Held6991, Это ни о чём. По ссылкам куча вариантов, пишите конкретно свой код, которым пользуетесь и на каком сайте.
AVKor, О чем или не о чем, но там взаимодействие с сайтом учебного заведения и логин с паролем управляющего аккаунта, которые сливать я не намерен, код ниже, пробовал и с печеньками и с user-data-dir — результат одинаковый
import os import threading import warnings from time import sleep import keyboard from selenium import webdriver from selenium.webdriver import Keys import pickle import selenium.webdriver warnings.filterwarnings("ignore") def app(i): 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("url") cookies = pickle.load(open("cookies.pkl", "rb")) for cookie in cookies: chrome.add_cookie(cookie) chrome.refresh() 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(fr'--user-data-dir=') # options.add_argument("--headless") chrome = webdriver.Chrome(chrome_options=options, executable_path=os.getcwd() + '\\chromedriver.exe') chrome.get("url") chrome.find_element_by_xpath('//a[@href="login/index.php"]').click() sleep(1) chrome.find_element_by_xpath('//input[@id="username"]').send_keys("логин") chrome.find_element_by_xpath('//input[@id="password"]').send_keys("пароль") chrome.find_element_by_xpath('//button[@id="loginbtn"]').click() sleep(5) pickle.dump(chrome.get_cookies(), open("cookies.pkl", "wb")) for i in range(4): t = threading.Thread(target=app, args=(i,)) t.start()
Selenium python как сохранить данные сессии и установить кастомный путь до профиля Chrome
При создании своего бота я столкнулся с одной неприятной проблемой, заключалась она в том, что авторизация на сайте слетала на следующий день. Для корректной работы бота требовалось чтобы авторизация не слетала больше месяца, как при работе с обычным браузером.
Аргументы которые помогли решить мой вопрос:
user-data-dir=PATH – Указывает расположение папки с профилями.
—profile-directory=Profile 1 – Задает папку профиля, по умолчанию стоит Default.
—allow-profiles-outside-user-dir – Позволяет указать кастомное расположение папки с профилями.
from time import sleep from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager options = webdriver.ChromeOptions() options.add_argument('--allow-profiles-outside-user-dir') options.add_argument('--enable-profile-shortcut-manager') options.add_argument(r'user-data-dir=.\User') options.add_argument('--profile-directory=Profile 1') with webdriver.Chrome(ChromeDriverManager().install(), options=options) as driver: driver.get("https://www.epicgames.com/store/ru/") sleep(120) print("Close")
После включения данных аргументов, данные будут сохранятся в папку User рядом с проектом и после каждого перезапуска будут подгружаться chrome-мом.
В коде используется библиотека webdriver-manager, облегчающая установку драйвера для браузера.
Дополнительная информация, полученная в ходе работы:
- Стандартный профиль chrome-а не удается использовать в headless режиме и наоборот.
- Если надо пройти двухфакторную аутентификацию на сайте через headless chrome, то можно добавить следующий аргумент: —remote-debugging-port=9222 Он поднимет удаленный сервер по адресу localhost:9222 через который можно управлять headless chrome-мом.
- При отключении детекта chromedriver-а ( аргумент: —disable-blink-features=AutomationControlled ), chrome перестал сохранять данные профиля. Помогли исправить ситуацию следующие аргументы: —profiling-flush=n – сбрасывает данные профиля в файл через n-ое число секунд. —enable-aggressive-domstorage-flushing – минимизирует потерю данных.
Selenium python как сохранить данные сессии и установить кастомный путь до профиля Chrome
При создании своего бота я столкнулся с одной неприятной проблемой, заключалась она в том, что авторизация на сайте слетала на следующий день. Для корректной работы бота требовалось чтобы авторизация не слетала больше месяца, как при работе с обычным браузером.
Аргументы которые помогли решить мой вопрос:
user-data-dir=PATH – Указывает расположение папки с профилями.
—profile-directory=Profile 1 – Задает папку профиля, по умолчанию стоит Default.
—allow-profiles-outside-user-dir – Позволяет указать кастомное расположение папки с профилями.
from time import sleep from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager options = webdriver.ChromeOptions() options.add_argument('--allow-profiles-outside-user-dir') options.add_argument('--enable-profile-shortcut-manager') options.add_argument(r'user-data-dir=.\User') options.add_argument('--profile-directory=Profile 1') with webdriver.Chrome(ChromeDriverManager().install(), options=options) as driver: driver.get("https://www.epicgames.com/store/ru/") sleep(120) print("Close")
После включения данных аргументов, данные будут сохранятся в папку User рядом с проектом и после каждого перезапуска будут подгружаться chrome-мом.
В коде используется библиотека webdriver-manager, облегчающая установку драйвера для браузера.
Дополнительная информация, полученная в ходе работы:
- Стандартный профиль chrome-а не удается использовать в headless режиме и наоборот.
- Если надо пройти двухфакторную аутентификацию на сайте через headless chrome, то можно добавить следующий аргумент: —remote-debugging-port=9222 Он поднимет удаленный сервер по адресу localhost:9222 через который можно управлять headless chrome-мом.
- При отключении детекта chromedriver-а ( аргумент: —disable-blink-features=AutomationControlled ), chrome перестал сохранять данные профиля. Помогли исправить ситуацию следующие аргументы: —profiling-flush=n – сбрасывает данные профиля в файл через n-ое число секунд. —enable-aggressive-domstorage-flushing – минимизирует потерю данных.
Persistent Selenium Sessions
I have a project where I need to have a persistent Selenium session. There’s a script which will leave a browser window open when it exits. When the script runs again it should connect to the same window.
Derive a new class from selenium.webdriver.Remote .
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.common.exceptions import WebDriverException SELENIUM_URL = "http://127.0.0.1:4444/wd/hub" class PersistentRemote(webdriver.Remote): def __init__(self, session_id=None): super(PersistentRemote, self).__init__( command_executor=SELENIUM_URL, desired_capabilities=DesiredCapabilities.CHROME, ) # # This will create a new window. if session_id is not None: # Close new window. self.close() # Change to other session. self.session_id = session_id # Will raise WebDriverException if session no longer valid. try: self.title except WebDriverException: raise WebDriverException(f"Session 'session_id>' no longer valid.")
The crux of this is that a new window will always be opened. If, however, you have an existing session, then close the new window and connect to the other session.
Here’s what the client code looks like.
import pickle # A file to store the session information. # SELENIUM_SESSION_PICKLE = "selenium-session.pkl" try: session = pickle.load(open(SELENIUM_SESSION_PICKLE, 'rb')) browser = persistent.PersistentRemote(session) # If you get to here then you are using an existing session. except (FileNotFoundError, persistent.WebDriverException): # If you end up here then you are creating a new session. browser = persistent.PersistentRemote() pickle.dump(browser.session_id, open(SELENIUM_SESSION_PICKLE, 'wb')) browser.get("https://www.google.com")
Python-bloggers
Data science news and tutorials — contributed by Python bloggers
Persistent Selenium Sessions
Posted on January 28, 2021 by Python | datawookie in Data science | 0 Comments
This article was first published on Python | datawookie , and kindly contributed to python-bloggers. (You can report issue about the content on this page here)
Want to share your content on python-bloggers? click here.
I have a project where I need to have a persistent Selenium session. There’s a script which will leave a browser window open when it exits. When the script runs again it should connect to the same window.
Derive a new class from selenium.webdriver.Remote .
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.common.exceptions import WebDriverException SELENIUM_URL = "http://127.0.0.1:4444/wd/hub" class PersistentRemote(webdriver.Remote): def __init__(self, session_id=None): super(PersistentRemote, self).__init__( command_executor=SELENIUM_URL, desired_capabilities=DesiredCapabilities.CHROME, ) # # This will create a new window. if session_id is not None: # Close new window. self.close() # Change to other session. self.session_id = session_id # Will raise WebDriverException if session no longer valid. try: self.title except WebDriverException: raise WebDriverException(f"Session '' no longer valid.")
The crux of this is that a new window will always be opened. If, however, you have an existing session, then close the new window and connect to the other session.
Here’s what the client code looks like.
import pickle # A file to store the session information. # SELENIUM_SESSION_PICKLE = "selenium-session.pkl" try: session = pickle.load(open(SELENIUM_SESSION_PICKLE, 'rb')) browser = persistent.PersistentRemote(session) # If you get to here then you are using an existing session. except (FileNotFoundError, persistent.WebDriverException): # If you end up here then you are creating a new session. browser = persistent.PersistentRemote() pickle.dump(browser.session_id, open(SELENIUM_SESSION_PICKLE, 'wb')) browser.get("http://www.google.com")