Nuestros desarrolladores estrellas agotaron sus reservas de café, por su búsqueda todo el tiempo por la solución, hasta que Ximena halló la contestación en Beanstalk y en este momento la compartimos contigo.
Solución:
Bueno, dado que esta pregunta se votó a favor pero mi marca como pregunta duplicada no fue aceptada, publicaré aquí la misma respuesta exacta que ya publiqué para una pregunta similar:
Puedes usar pickle
para guardar las cookies como archivo de texto y cargarlo después de:
def save_cookie(driver, path):
with open(path, 'wb') as filehandler:
pickle.dump(driver.get_cookies(), filehandler)
def load_cookie(driver, path):
with open(path, 'rb') as cookiesfile:
cookies = pickle.load(cookiesfile)
for cookie in cookies:
driver.add_cookie(cookie)
Con un guión como:
from selenium import webdriver
from afile import save_cookie
driver = webdriver.Chrome()
driver.get('http://website.internets')
foo = input()
save_cookie(driver, '/tmp/cookie')
Lo que puedes hacer es:
- Ejecute este script
- En el navegador (de Selenium), vaya al sitio web, inicie sesión
- Regrese a su terminal, escriba cualquier cosa y presione enter.
- Disfrute de su archivo de cookies en
/tmp/cookie
. Ahora puede copiarlo en su repositorio de código y empaquetarlo en su aplicación si es necesario.
Entonces, ahora, en el código de tu aplicación principal:
from afile import load_cookie
driver = webdriver.Chrome()
load_cookie(driver, 'path/to/cookie')
Y ahora estás conectado.
Esta fue una solicitud de función y se cerró como no factible. Pero es una forma de hacerlo, usar carpetas como perfiles y mantener todos los inicios de sesión persistentes de una sesión a otra usando las opciones de Chrome. user-data-dir
para usar carpetas como perfiles, ejecuto:
chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com")
Puede interactuar manualmente en este paso con la ventana abierta y hacer los inicios de sesión que verifican la interacción humana, verificar recordar contraseña, etc. Hago esto y luego los inicios de sesión, las cookies que necesito ahora cada vez que inicio Webdriver con esa carpeta todo está en allí. También puede instalar manualmente las Extensiones y tenerlas en cada sesión. La segunda vez que ejecuto, con exactamente el mismo código que el anterior, todas las configuraciones, cookies e inicios de sesión están ahí:
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 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.
Tuve exactamente el mismo escenario en el que me gustaría reutilizar sesiones una vez autenticadas/iniciadas. Estoy usando varios navegadores simultáneamente.
Probé muchas soluciones de blogs y respuestas de StackOverflow.
1. Uso de user-data-dir y profile-directory
Estas opciones de Chrome que resuelven el propósito si abre un navegador a la vez, pero si abre varias ventanas arrojará un error que dice user data directory is already in use
.
2. Uso de cookies
Las cookies se pueden compartir entre varios navegadores. El código disponible en las respuestas de SO tiene la mayoría de los bloques importantes sobre cómo usar cookies en Selenium. Aquí estoy extendiendo esas soluciones para completar el flujo.
Código
# selenium-driver.py
import pickle
from selenium import webdriver
class SeleniumDriver(object):
def __init__(
self,
# chromedriver path
driver_path='/Users/username/work/chrome/chromedriver',
# pickle file path to store cookies
cookies_file_path='/Users/username/work/chrome/cookies.pkl',
# list of websites to reuse cookies with
cookies_websites=["https://facebook.com"]
):
self.driver_path = driver_path
self.cookies_file_path = cookies_file_path
self.cookies_websites = cookies_websites
chrome_options = webdriver.ChromeOptions()
self.driver = webdriver.Chrome(
executable_path=self.driver_path,
options=chrome_options
)
try:
# load cookies for given websites
cookies = pickle.load(open(self.cookies_file_path, "rb"))
for website in self.cookies_websites:
self.driver.get(website)
for cookie in cookies:
self.driver.add_cookie(cookie)
self.driver.refresh()
except Exception as e:
# it'll fail for the first time, when cookie file is not present
print(str(e))
print("Error loading cookies")
def save_cookies(self):
# save cookies
cookies = self.driver.get_cookies()
pickle.dump(cookies, open(self.cookies_file_path, "wb"))
def close_all(self):
# close all open tabs
if len(self.driver.window_handles) < 1:
return
for window_handle in self.driver.window_handles[:]:
self.driver.switch_to.window(window_handle)
self.driver.close()
def __del__(self):
self.save_cookies()
self.close_all()
def is_fb_logged_in():
driver.get("https://facebook.com")
if 'Facebook – log in or sign up' in driver.title:
return False
else:
return True
def fb_login(username, password):
username_box = driver.find_element_by_id('email')
username_box.send_keys(username)
password_box = driver.find_element_by_id('pass')
password_box.send_keys(password)
login_box = driver.find_element_by_id('loginbutton')
login_box.click()
if __name__ == '__main__':
"""
Run - 1
First time authentication and save cookies
Run - 2
Reuse cookies and use logged-in session
"""
selenium_object = SeleniumDriver()
driver = selenium_object.driver
username = "fb-username"
password = "fb-password"
if is_fb_logged_in(driver):
print("Already logged in")
else:
print("Not logged in. Login")
fb_login(username, password)
del selenium_object
Ejecución 1: iniciar sesión y guardar cookies
$ python selenium-driver.py
[Errno 2] No such file or directory: '/Users/username/work/chrome/cookies.pkl'
Error loading cookies
Not logged in. Login
Esto abrirá la ventana de inicio de sesión de Facebook e ingresará el nombre de usuario y la contraseña para iniciar sesión. Una vez que haya iniciado sesión, cerrará el navegador y guardará las cookies.
Ejecución 2: reutilizar las cookies para continuar con la sesión de inicio de sesión
$ python selenium-driver.py
Already logged in
Esto abrirá la sesión de inicio de sesión de Facebook usando cookies almacenadas.
Recuerda que puedes comunicar esta crónica si te valió la pena.