Cómo guardar y cargar cookies usando Python + Selenium WebDriver

1 minuto de lectura

Como guardar y cargar cookies usando Python Selenium WebDriver
Aaron Hiniker

¿Cómo puedo guardar todas las cookies en Selenium WebDriver de Python en un archivo .txt y luego cargarlas más tarde?

La documentación no dice mucho sobre la función getCookies.

Como guardar y cargar cookies usando Python Selenium WebDriver
Ali Akber Saifee

Puede guardar las cookies actuales como un objeto Python usando pickle. Por ejemplo:

import pickle
import selenium.webdriver

driver = selenium.webdriver.Firefox()
driver.get("http://www.google.com")
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))

Y luego para agregarlos de nuevo:

import pickle
import selenium.webdriver

driver = selenium.webdriver.Firefox()
driver.get("http://www.google.com")
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    driver.add_cookie(cookie)

  • Recibo el error “el protocolo de pepinillo debe ser <= 2". Usando el código pickle que publicaste. ¿Qué significa esto? ¿Se refiere a los argumentos?

    – Aarón Hiniker

    25 de febrero de 2013 a las 0:50

  • ¿Esto haría lo mismo? cookieFile = open(“cookies.pkl”, “w”) dump = pickle.dumps(driver.get_cookies()) cookieFile.write(dump)

    – Aarón Hiniker

    25 de febrero de 2013 a las 1:00


  • Hola, Aaron, modifiqué un poco la muestra; básicamente, se agregó el indicador ‘b’ a las secciones abiertas del archivo. ¿Puedes probar con eso?

    – Ali Akber Saifee

    25 de febrero de 2013 a las 1:03

  • Mismo error, no estoy familiarizado con pickle, así que no estoy seguro de qué es. “raise ValueError(“el protocolo pickle debe ser <= %d" % HIGHEST_PROTOCOL"

    – Aarón Hiniker

    25 de febrero de 2013 a las 1:06

  • Tengo un problema con esto. Sin embargo, funciona bien cuando intento drive.add_cookie De nuevo, recibí un mensaje de error que decía que la clave de “caducidad” no es válida. Estoy usando chromedriver en Mac OS

    – Solal

    12 de agosto de 2019 a las 22:32

1646755753 203 Como guardar y cargar cookies usando Python Selenium WebDriver
Eduard Florinescu

Cuando necesite cookies de una sesión a otra, hay otra forma de hacerlo. Use las opciones de Chrome user-data-dir para usar carpetas como perfiles. Corro:

# You need to: from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com")

Aquí puede hacer los inicios de sesión que verifican la interacción humana. Hago esto y luego las cookies que necesito ahora cada vez que inicio Webdriver con esa carpeta, todo está allí. También puede instalar manualmente las Extensiones y tenerlas en cada sesión.

La segunda vez que ejecuto, todas las cookies están allí:

# You need to: from selenium.webdriver.chrome.options import Options    
chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com") # Now you can see the cookies, the settings, extensions, etc., and the logins done in the previous session are present here. 

La ventaja es que puede usar múltiples carpetas con diferentes configuraciones y cookies, Extensiones sin la necesidad de cargar, descargar cookies, instalar y desinstalar Extensiones, cambiar configuraciones, cambiar inicios de sesión a través de código y, por lo tanto, no hay forma de que la lógica del programa se rompa. etc

Además, esto es más rápido que tener que hacerlo todo por código.

  • Esta fue la mejor solución para mí cuando se trata de inicios de sesión de Google. En algún momento, mi uso de desarrollo se marcó como actividad sospechosa.

    –Moshé Stauber

    13 de marzo de 2019 a las 5:00

  • @p1g1n fue marcado antes o después de usar esta solución

    –Eduard Florinescu

    13 de marzo de 2019 a las 7:55

  • Lo sentimos, se marcó antes de usar la solución. Ahora sigo conectado para que no haya actividad sospechosa.

    –Moshé Stauber

    14 de marzo de 2019 a las 1:45

  • chrome_options = Options() me da name 'Options' is not defined … ?

    – Dan

    3 de abril de 2020 a las 5:37

  • @Dan necesitas: from selenium.webdriver.chrome.options import Options

    –Eduard Florinescu

    3 de abril de 2020 a las 8:31

Como guardar y cargar cookies usando Python Selenium WebDriver
Exsónico

Recuerde, solo puede agregar una cookie para el dominio actual.

Si desea agregar una cookie para su cuenta de Google, haga

browser.get('http://google.com')
for cookie in cookies:
    browser.add_cookie(cookie)

  • Esto debería estar en su documentación 🙁

    – Tjorriemorrie

    10/03/2018 a las 22:45

  • @TjorrieMorrie selenium-python.readthedocs.io/…

    – Mauricio Cortázar

    12/03/2018 a las 21:49

  • @MauricioCortazar no dice nada sobre el requisito de dominio, que es a lo que me refería

    – Tjorriemorrie

    13 de marzo de 2018 a las 3:04

  • @Tjorriemorrie eso es básico hombre, las cookies solo se almacenan en el dominio, incluso el subdominio no está permitido

    – Mauricio Cortázar

    13 de marzo de 2018 a las 3:24

  • Este comentario parece relevante cuando se trata de múltiples dominios que usan una cookie de un dominio raíz. Por ejemplo, google.com podría ser el dominio raíz y otro dominio o subdominio propiedad de Google podría usar la misma cookie. Me gusta más la solución de @Eduard Florinescu debido a esto (y otras razones), ya que no requiere usar el navegador. obtener antes de cargar las cookies, simplemente ya están allí desde el directorio de datos. Parece que aquí se requiere browser.get adicional antes de cargar el archivo de cookies (según este comentario), aunque no lo probé.

    –Roel Van de Paar

    3 de junio de 2019 a las 5:07


1646755754 23 Como guardar y cargar cookies usando Python Selenium WebDriver
Jagadeeswara Reddy P

Solo una ligera modificación del código escrito por Roel Van de Paar, ya que todo el crédito es suyo. Estoy usando esto en Windows y funciona perfectamente, tanto para configurar como para agregar cookies:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--user-data-dir=chrome-data")
driver = webdriver.Chrome('chromedriver.exe',options=chrome_options)
driver.get('https://web.whatsapp.com')  # Already authenticated
time.sleep(30)

1646755754 685 Como guardar y cargar cookies usando Python Selenium WebDriver
Roel Van de Paar

Basado en la respuesta de Eduard Florinescu, pero con un código más nuevo y las importaciones faltantes agregadas:

$ cat work-auth.py
#!/usr/bin/python3

# Setup:
# sudo apt-get install chromium-chromedriver
# sudo -H python3 -m pip install selenium

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--user-data-dir=chrome-data")
driver = webdriver.Chrome('/usr/bin/chromedriver',options=chrome_options)
chrome_options.add_argument("user-data-dir=chrome-data")
driver.get('https://www.somedomainthatrequireslogin.com')
time.sleep(30)  # Time to enter credentials
driver.quit()

$ cat work.py
#!/usr/bin/python3

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--user-data-dir=chrome-data")
driver = webdriver.Chrome('/usr/bin/chromedriver',options=chrome_options)
driver.get('https://www.somedomainthatrequireslogin.com')  # Already authenticated
time.sleep(10)
driver.quit()

  • Lo de los pepinillos no funcionó para mí. (Esta es la segunda vez que intento usarlo). Así que usé su método, que tampoco funcionó para mí al principio. Cambios que tuve que hacer: tuve que escribir chrome_options.add_argument(‘no-sandbox’) debido al problema documentado en github.com/theintern/intern/issues/878 y tuve que hacer que user-data-dir fuera una ruta completa en mi entorno de Windows 10.

    –Eric Klien

    10 de junio de 2019 a las 9:21


  • No funciona para mi sitio web que almacena datos de autenticación en cookies

    – Martillo salvaje

    14 de diciembre de 2019 a las 23:26

  • Podrías haber mejorado su respuesta, básicamente está funcionando bien

    – clel

    6 de febrero de 2021 a las 15:07

1646755755 363 Como guardar y cargar cookies usando Python Selenium WebDriver
Pedro Mortensen

Este es el código que usé en Windows. Funciona.

for item in COOKIES.split(';'):
    name,value = item.split('=', 1)
    name=name.replace(' ', '').replace('\r', '').replace('\n', '')
    value = value.replace(' ', '').replace('\r', '').replace('\n', '')
    cookie_dict={
            'name':name,
            'value':value,
            "domain": "",  # Google Chrome
            "expires": "",
            'path': "https://stackoverflow.com/",
            'httpOnly': False,
            'HostOnly': False,
            'Secure': False
        }
    self.driver_.add_cookie(cookie_dict)

  • Lo de los pepinillos no funcionó para mí. (Esta es la segunda vez que intento usarlo). Así que usé su método, que tampoco funcionó para mí al principio. Cambios que tuve que hacer: tuve que escribir chrome_options.add_argument(‘no-sandbox’) debido al problema documentado en github.com/theintern/intern/issues/878 y tuve que hacer que user-data-dir fuera una ruta completa en mi entorno de Windows 10.

    –Eric Klien

    10 de junio de 2019 a las 9:21


  • No funciona para mi sitio web que almacena datos de autenticación en cookies

    – Martillo Salvaje

    14 de diciembre de 2019 a las 23:26

  • Podrías haber mejorado su respuesta, básicamente está funcionando bien

    – clel

    6 de febrero de 2021 a las 15:07

Idealmente, sería mejor no copiar el directorio en primer lugar, pero esto es muy difícil, vea

  • ¿Cómo evitar que Selenium 3.0 (Geckodriver) cree perfiles temporales de Firefox?
  • ¿Cómo uso un perfil existente en el lugar con Selenium Webdriver?

también

  • No se puede usar el perfil de Firefox existente en Selenium WebDriver usando C# (solución similar a la siguiente)

Esta es una solución que guarda el directorio de perfil para Firefox (similar al user-data-dir (directorio de datos de usuario) en Chrome) (implica copiar manualmente el directorio. No he podido encontrar otra forma):

Fue probado en Linux.


Version corta:

  • Para guardar el perfil
driver.execute_script("window.close()")
time.sleep(0.5)
currentProfilePath = driver.capabilities["moz:profile"]
profileStoragePath = "/tmp/abc"
shutil.copytree(currentProfilePath, profileStoragePath,
                ignore_dangling_symlinks=True
                )
  • Para cargar el perfil
driver = Firefox(executable_path="geckodriver-v0.28.0-linux64",
                 firefox_profile=FirefoxProfile(profileStoragePath)
                )

Versión larga (con demostración de que funciona y mucha explicación; vea los comentarios en el código)

El código usa localStorage para demostración, pero también funciona con cookies.

#initial imports

from selenium.webdriver import Firefox, FirefoxProfile

import shutil
import os.path
import time

# Create a new profile

driver = Firefox(executable_path="geckodriver-v0.28.0-linux64",
                  # * I'm using this particular version. If yours is
                  # named "geckodriver" and placed in system PATH
                  # then this is not necessary
                )

# Navigate to an arbitrary page and set some local storage
driver.get("https://DuckDuckGo.com")
assert driver.execute_script(r"""{
        const tmp = localStorage.a; localStorage.a="1";
        return [tmp, localStorage.a]
    }""") == [None, "1"]

# Make sure that the browser writes the data to profile directory.
# Choose one of the below methods
if 0:
    # Wait for some time for Firefox to flush the local storage to disk.
    # It's a long time. I tried 3 seconds and it doesn't work.
    time.sleep(10)

elif 1:
    # Alternatively:
    driver.execute_script("window.close()")
    # NOTE: It might not work if there are multiple windows!

    # Wait for a bit for the browser to clean up
    # (shutil.copytree might throw some weird error if the source directory changes while copying)
    time.sleep(0.5)

else:
    pass
    # I haven't been able to find any other, more elegant way.
    #`close()` and `quit()` both delete the profile directory


# Copy the profile directory (must be done BEFORE driver.quit()!)
currentProfilePath = driver.capabilities["moz:profile"]
assert os.path.isdir(currentProfilePath)
profileStoragePath = "/tmp/abc"
try:
    shutil.rmtree(profileStoragePath)
except FileNotFoundError:
    pass

shutil.copytree(currentProfilePath, profileStoragePath,
                ignore_dangling_symlinks=True # There's a lock file in the
                                              # profile directory that symlinks
                                              # to some IP address + port
               )

driver.quit()
assert not os.path.isdir(currentProfilePath)
# Selenium cleans up properly if driver.quit() is called,
# but not necessarily if the object is destructed


# Now reopen it with the old profile

driver=Firefox(executable_path="geckodriver-v0.28.0-linux64",
               firefox_profile=FirefoxProfile(profileStoragePath)
              )

# Note that the profile directory is **copied** -- see FirefoxProfile documentation
assert driver.profile.path!=profileStoragePath
assert driver.capabilities["moz:profile"]!=profileStoragePath

# Confusingly...
assert driver.profile.path!=driver.capabilities["moz:profile"]
# And only the latter is updated.
# To save it again, use the same method as previously mentioned

# Check the data is still there

driver.get("https://DuckDuckGo.com")

data = driver.execute_script(r"""return localStorage.a""")
assert data=="1", data

driver.quit()

assert not os.path.isdir(driver.capabilities["moz:profile"])
assert not os.path.isdir(driver.profile.path)

Lo que no funciona:

  • Inicializar Firefox(capabilities={"moz:profile": "/path/to/directory"}) — el controlador no podrá conectarse.
  • options=Options(); options.add_argument("profile"); options.add_argument("/path/to/directory"); Firefox(options=options) — lo mismo que arriba.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad