Selenium: intentar iniciar sesión con cookies: “Solo se pueden establecer cookies para el dominio actual”

Lo que estoy tratando de lograr

Estoy intentando iniciar sesión en un sitio web donde las cookies deben estar habilitadas con Selenium headless, estoy usando PhantomJS for driver.

Problema

Primero grabé el procedimiento usando Selenium IDE donde funciona bien usando Firefox (no sin cabeza). Luego exporté el código a Python y ahora no puedo iniciar sesión porque está generando un error que dice “Solo se pueden establecer cookies para el dominio actual”. No sé por qué tengo este problema, ¿no estoy en el dominio correcto?

Código

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import Select import unittest, time, re self.driver = webdriver.PhantomJS() self.driver.implicitly_wait(30) self.base_url = "https://login.example.com" driver = self.driver driver.get(self.base_url) all_cookies = self.driver.get_cookies() # It prints out all cookies and values just fine for cookie in all_cookies print cookie['name'] + " --> " + cookies['value'] # Set cookies to driver for s_cookie in all_cookies: c = { s_cookie['name'] : s_cookie['value']} # This is where it's throwing an error saying "Can only set Cookies for current domain driver.add_cookie(c) ... 

Lo que he intentado

He intentado guardar las cookies en un dict, ir a otro dominio, volver al dominio original y agregar las cookies y luego intentar iniciar sesión pero todavía no funciona (como se sugiere en este hilo )

Cualquier ayuda es apreciada.

Investiga cada uno de los pares de cookies. Me encontré con problemas similares y algunas de las cookies pertenecían a Google. Debe asegurarse de que las cookies se agreguen solo al dominio actual y que pertenezcan al mismo dominio. En ese caso se espera su excepción. Como nota al margen, si lo recuerdo correctamente, no puede usar localhost para agregar las cookies si lo está haciendo. Cambiar a la dirección IP. Además, investigue las cookies que está obteniendo especialmente información de dominio y vencimiento. Mira, si están volviendo null

Editar

Hice esta prueba simple en Gmail para mostrar lo que has hecho mal. A primera vista, no me di cuenta de que está intentando capturar una cookie parcial, un par, y agregarla al dominio. Dado que, la cookie no tiene ninguna información de Dominio, ruta, caducidad, etc., estaba intentando agregar la cookie al dominio actual (127.0.0.1) y arrojó alguna información engañosa que no tenía sentido. Aviso: para ser una cookie válida, debe tener el dominio correcto y la información de caducidad que le faltan.

 import unittest from selenium.webdriver.common.by import By from selenium import webdriver __author__ = 'Saifur' class CookieManagerTest(unittest.TestCase): def setUp(self): self.driver = webdriver.PhantomJS("E:\\working\\selenium.python\\selenium\\resources\\phantomjs.exe") self.driver.get("https://accounts.google.com/ServiceLogin?service=mail&continue=https://mail.google.com/mail/") self.driver.find_element(By.ID, "Email").send_keys("userid") self.driver.find_element(By.ID, "next").click() self.driver.find_element(By.ID, "Passwd").send_keys("supersimplepassword") self.driver.find_element(By.CSS_SELECTOR, "[type='submit'][value='Sign in']").click() self.driver.maximize_window() def test(self): driver = self.driver listcookies = driver.get_cookies() for s_cookie in listcookies: # this is what you are doing c = {s_cookie['name']: s_cookie['value']} print("*****The partial cookie info you are doing*****\n") print(c) # Should be done print("The Full Cookie including domain and expiry info\n") print(s_cookie) # driver.add_cookie(s_cookie) def tearDown(self): self.driver.quit() 

Salida de consola:

D: \ Python34 \ python.exe “D: \ Archivos de progtwig (x86) \ JetBrains \ PyCharm Educational Edition 1.0.1 \ helpers \ pycharm \ utrunner.py” E: \ working \ selenium.python \ selenium \ python \ FirstTest. py :: CookieManagerTest prueba verdadera comenzó a las 9:59 AM …

******* La información parcial de la cookie que está haciendo *******

{‘PREF’: ‘ID = *******: FF = 0: LD = es: TM = *******: LM = *******: GM = 1: S = *******}

La cookie completa incluye información de dominio y vencimiento

{‘httponly’: Falso, ‘nombre’: ‘*******’, ‘valor’: ‘ID = *******: FF = 0: LD = en: TM = **** ***: LM = 1432393656: GM = 1: S = iNakWMI5h_2cqIYi ‘,’ path ‘:’ / ‘,’ expires ‘:’ Mon, 22 May 2017 15:07:36 GMT ‘,’ secure ‘: False’ caducidad ‘: *******,’ dominio ‘:’ .google.com ‘}

Aviso: acabo de reemplazar alguna información con ******* a propósito

Iba a agregar un comentario en la parte inferior de lo que @Saifur dijo anteriormente, pero pensé que tenía suficiente contenido nuevo para justificar un comentario completo.

La revelación para mí, teniendo exactamente el mismo error, fue que usar Selenium funciona exactamente igual que si estuvieras abriendo tu navegador y haciendo clic y escribiendo cosas físicamente. Teniendo esto en cuenta, si ingresa el usuario / pasa a Selenium y presiona click() , su controlador de Selenium, una vez que el usuario tenga éxito, tendrá la cookie automáticamente. De este modo, se niega cualquier necesidad de destruir mi cookie guardada (probablemente caducará pronto). Me sentí un poco tonta al darme cuenta de esto. Hizo todo mucho más simple.

Utilizando el código de @ Saifur anterior como plantilla, hice algunos ajustes y eliminé lo que creo que es un poco excesivo de toda una clase adicional para la ejecución en este ejemplo.

 url = 'http://domainname.com' url2 = 'http://domainname.com/page' USER = 'superAwesomeRobot' PASS = 'superSecretRobot' # initiates your browser driver = webdriver.PhantomJS() # browses to your desired URL driver.get(url) # searches for the user or email field on the page, and inputs USER driver.find_element_by_id("email").send_keys(USER) # searches for the password field on the page, and inputs PASS driver.find_element_by_id("pass").send_keys(PASS) # finds the login button and click you're in driver.find_element_by_id("loginbutton").click() 

Desde aquí puede navegar a la página que desea direccionar.

 driver.get(url2) 

nota: si tiene un sitio moderno que se carga automáticamente cuando se desplaza hacia abajo, puede ser útil usar esto:

 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 

También me gustaría señalar, @simeg, que se supone que Selenium espera automáticamente hasta que la página haya regresado que está cargada (y sí, he tenido el problema de AJAX al que se hace referencia, por lo que a veces es necesario esperar Pocos segundos, ¡¿qué página tarda más de 30 segundos en cargarse ?!). La forma en que está ejecutando su comando de espera es simplemente esperar a que PhantomJS se cargue, no la página en sí, por lo que no me sirve de nada considerando la función incorporada:

El método driver.get navegará a una página dada por la URL. WebDriver esperará hasta que la página se haya cargado por completo (es decir, se haya activado el evento “onload”) antes de devolver el control a su prueba o script. Vale la pena señalar que si su página utiliza una gran cantidad de AJAX en la carga, WebDriver puede no saber cuándo se ha cargado completamente.

fuente: http://selenium-python.readthedocs.io/getting-started.html#example-explained

Espero que esto ayude a alguien!

Algunas páginas web utilizan demasiadas claves en las cookies que no son compatibles con webdriver, luego aparece un “mensaje de error”: “Solo se pueden establecer cookies para el dominio actual”, aunque está 100% seguro de que está configurando cookies para el dominio actual. Un ejemplo de dicha página web es ” https://stackoverflow.com/ “. En este caso, debe asegurarse de que solo se agreguen las claves requeridas a las cookies, como se mencionó en algunas publicaciones anteriores.

 driver.add_cookie({k: cookie[k] for k in ('name', 'value', 'domain', 'path', 'expiry') if k in cookie}) 

En contraposición, algunas páginas web utilizan muy pocas claves en las cookies, que son requeridas por el controlador web, luego aparece un “mensaje de error”: “Solo se pueden establecer cookies para el dominio actual”, después de solucionar el primer problema. Un ejemplo de dicha página web es ” https://github.com/ “. Debe agregar la clave ‘caducidad’ a las cookies de esta página web.

  for k in ('name', 'value', 'domain', 'path', 'expiry'): if k not in list(cookie.keys()): if k == 'expiry': cookie[k] = 1475825481 

Poniéndolos todos juntos, el código completo es el siguiente:

 # uncommented one of the following three URLs to test #targetURL = "http://pythonscraping.com" targetURL = "https://stackoverflow.com/" #targetURL = "https://github.com/" from selenium import webdriver driver = webdriver.PhantomJS() driver.get(targetURL) driver.implicitly_wait(1) #print(driver.get_cookies()) savedCookies = driver.get_cookies() driver2 = webdriver.PhantomJS() driver2.get(targetURL) driver2.implicitly_wait(1) driver2.delete_all_cookies() for cookie in savedCookies: # fix the 2nd problem for k in ('name', 'value', 'domain', 'path', 'expiry'): if k not in list(cookie.keys()): if k == 'expiry': cookie[k] = 1475825481 # fix the 1st problem driver2.add_cookie({k: cookie[k] for k in ('name', 'value', 'domain', 'path', 'expiry') if k in cookie}) print(cookie) driver2.get(targetURL) driver2.implicitly_wait(1)