Webdriver phantomjs ya no sigue el enlace al hacer clic

Utilizo un script phantomjs de webdriver simple para actualizar algunos anuncios en preloved.co.uk. Esta secuencia de comandos funcionó muy bien hasta hace poco, pero luego comenzó a fallar con el error “Haga clic en enviar pero la carga falló” después de hacer clic en el enlace de inicio de sesión. De acuerdo con esto , actualicé mi versión de phantomjs a la última versión estable, 1.9.7 siguiendo la guía aquí . Sin embargo, ahora el clic de inicio de sesión tampoco parece registrarse, y la página no se vuelve a cargar.

El primer paso es simplemente llegar a la página del formulario de inicio de sesión.

from selenium import webdriver br = webdriver.PhantomJS(service_log_path='/path/to/logfile.log') url = "http://www.preloved.co.uk" br.get(url) # Go to login page login_button = br.find_element_by_xpath('//div[@id="header-status-login"]/a') login_button.click() 

Normalmente (y si reemplaza la línea del navegador con br = webdriver.Firefox() por ejemplo), esto genera una recarga en la página de inicio de sesión, y el script continúa desde allí, pero ahora parece que el clic no carga la nueva página. y br.current_url sigue siendo ‘ http://www.preloved.co.uk/ ‘

¿Por qué no funciona esta carga?

Incluso si extraigo el href y hago un GET explícito, no parece seguir y recargar:

 newurl=login_button.get_attribute('href') br.get(newurl) 

br.current_url sigue siendo ‘ http://www.preloved.co.uk/ ‘.

La página de inicio de sesión está protegida a través de https. Recientemente, la vulnerabilidad de POODLE obligó a los sitios web a alejarse de SSLv3 para https, pero como PhantomJS usa SSLv3 por defecto, la página de inicio de sesión no se carga. Véase también esta respuesta .

Esto puede solucionarse pasando --ssl-protocol=tlsv1 o --ssl-protocol=any a PhantomJS o actualizando PhantomJS a al menos la versión 1.9.8. Parece que el argumento service_args podría usarse para eso en los enlaces de python para Selenium.

Parece que en la implementación oficial actual, service_args no se puede pasar de WebDriver al Service en PhantomJS. Puedes subclasificarlo.

 from selenium import webdriver from selenium.webdriver.phantomjs.service import Service from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver class PhantomJSService(webdriver.PhantomJS): def __init__(self, executable_path="phantomjs", port=0, desired_capabilities=DesiredCapabilities.PHANTOMJS, service_args=None, service_log_path=None): self.service = Service(executable_path, port=port, service_args=service_args, log_path=service_log_path) self.service.start() try: RemoteWebDriver.__init__(self, command_executor=self.service.service_url, desired_capabilities=desired_capabilities) except: self.quit() raise 

Parece que esta bifurcación webdriver contiene los argumentos necesarios para establecer esas opciones.