Comment enregistrer et charger des cookies à l'aide de Python + Selenium WebDriver

108

Comment puis-je enregistrer tous les cookies dans Selenium WebDriver de Python dans un fichier txt, puis les charger plus tard? La documentation ne dit pas grand-chose sur la fonction getCookies.

Aaron Randonneur
la source

Réponses:

181

Vous pouvez enregistrer les cookies actuels en tant qu'objet python à l'aide de pickle. Par exemple:

import pickle
import selenium.webdriver 

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

et plus tard pour les rajouter:

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)
Ali-Akber Saifee
la source
1
J'obtiens une erreur "le protocole pickle doit être <= 2" En utilisant le code de cornichon que vous avez publié. Qu'est-ce que ça veut dire? Fait-il référence aux arguments?
Aaron Hiniker
Cela ferait-il la même chose? cookieFile = open ("cookies.pkl", "w") dump = pickle.dumps (driver.get_cookies ()) cookieFile.write (dump)
Aaron Hiniker
1
Salut Aaron, j'ai un peu modifié l'exemple - essentiellement le drapeau «b» ajouté aux sections ouvertes du fichier. Pouvez-vous essayer avec ça?
Ali-Akber Saifee
Même erreur, je ne connais pas le cornichon donc je ne suis pas sûr de ce que c'est. "rise ValueError (" pickle protocol must be <=% d "% HIGHEST_PROTOCOL"
Aaron Hiniker
5
J'ai un problème avec ça. Cela fonctionne bien cependant lorsque j'essaye de drive.add_cookienouveau, j'ai reçu un message d'erreur indiquant que la clé «expiration» n'est pas valide. J'utilise chromedriver sur Mac OS
Solal
56

Lorsque vous avez besoin de cookies de session en session, il existe une autre façon de le faire, utilisez les options Chrome user-data-dir afin d'utiliser des dossiers comme profils, je lance:

chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com")

Vous pouvez faire ici les connexions qui vérifient l'interaction humaine, je le fais, puis les cookies dont j'ai besoin maintenant chaque fois que je démarre le Webdriver avec ce dossier, tout y est. Vous pouvez également installer manuellement les extensions et les avoir dans chaque session. Secon fois que je cours, tous les cookies sont là:

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. 

L'avantage est que vous pouvez utiliser plusieurs dossiers avec différents paramètres et cookies, des extensions sans avoir besoin de charger, décharger les cookies, installer et désinstaller des extensions, modifier les paramètres, modifier les connexions via le code, et donc aucun moyen d'avoir la logique de la rupture du programme, etc C'est aussi plus rapide que de tout faire par code.

Eduard Florinescu
la source
4
C'était la meilleure solution pour moi en ce qui concerne les connexions Google. À un moment donné, mon utilisation de développement a été signalée comme une activité suspecte.
Moshe Stauber
2
@ p1g1n a été signalé avant ou après l'utilisation de cette solution
Eduard Florinescu
3
Désolé, il a été signalé avant d'utiliser la solution. Maintenant, je reste connecté, donc il n'y a pas d'activité suspecte.
Moshe Stauber
2
chrome_options = Options()me donne name 'Options' is not defined...?
Dan
4
@Dan vous devez:from selenium.webdriver.chrome.options import Options
Eduard Florinescu le
32

N'oubliez pas que vous ne pouvez ajouter qu'un cookie pour le domaine actuel. Si vous souhaitez ajouter un cookie pour votre compte Google, faites

browser.get('http://google.com')
for cookie in cookies:
    browser.add_cookie(cookie)
Exsonic
la source
1
Cela devrait être dans leur documentation :(
Tjorriemorrie
1
@Tjorriemorrie selenium-python.readthedocs.io/…
Mauricio Cortazar
3
@MauricioCortazar il ne dit rien sur l'exigence de domaine, c'est ce à quoi je faisais référence
Tjorriemorrie
2
@Tjorriemorrie c'est un homme basique, seuls les cookies sont stockés dans le domaine, même les sous-domaines ne sont pas autorisés
Mauricio Cortazar
1
Ce commentaire semble pertinent lorsqu'il s'agit de plusieurs domaines utilisant un cookie d'un domaine racine. Par exemple, google.com peut être le domaine racine et un autre domaine ou sous-domaine appartenant à Google peut utiliser le même cookie. J'aime mieux la solution de @Eduard Florinescu à cause de cela (et d'autres raisons) car elle ne nécessite pas d'utiliser le browser.get avant de charger les cookies, ils sont juste déjà là à partir du répertoire de données. Il semble que le browser.get supplémentaire soit requis ici avant de charger le fichier de cookies (selon ce commentaire), mais ne l'a pas testé.
Roel Van de Paar
12

Basé sur la réponse de @Eduard Florinescu mais avec un code plus récent et une importation manquante ajoutée:

$ 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()
Roel Van de Paar
la source
3
Le truc de cornichon n'a pas fonctionné pour moi. (C'est la deuxième fois que j'essaie de l'utiliser.) J'ai donc utilisé votre méthode qui ne fonctionnait pas non plus pour moi au début. Changements que j'ai dû faire: j'ai dû taper chrome_options.add_argument ('no-sandbox') en raison du problème documenté sur github.com/theintern/intern/issues/878 et j'ai dû faire de user-data-dir un chemin complet dans mon environnement Windows 10.
Eric Klien
Ne fonctionne pas pour mon site Web qui stocke les données d'authentification dans les cookies
Wildhammer
12

Juste une légère modification pour le code écrit par @Roel Van de Paar, car tout le mérite lui revient. J'utilise ceci dans Windows et cela fonctionne parfaitement, à la fois pour la configuration et l'ajout de 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)
Jagadeeswara Reddy P
la source
2
Fonctionne parfaitement! Merci d'avoir publié le code pour Windows! Tu as sauvé ma journée!
Anatol
Merci! Si simple, et cela me rend fou depuis un moment. Votes pour tout le monde! :)
MT
0

c'est le code que j'ai utilisé dans Windows, cela fonctionne.

 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': '/',
                    'httpOnly': False,
                    'HostOnly': False,
                    'Secure': False
                    }
            self.driver_.add_cookie(cookie_dict)
toi
la source
-2

mon système d'exploitation est Windows 10 et la version chrome est 75.0.3770.100. J'ai essayé la solution 'user-data-dir', cela n'a pas fonctionné. essayer la solution de @ Eric Klien échoue aussi. enfin, je fais le réglage chrome comme l'image, ça marche! mais ça n'a pas fonctionné sur Windows Server 2012.

réglage

entrez la description de l'image ici

battlesteed
la source
4
le png semble être dans une langue moins familière que l'anglais. Veuillez vous assurer que vous publiez uniquement en anglais.
amonk le