python - macosx - selenium support for phantomjs has been deprecated, please use headless
Establecer el tiempo de espera en Selenium webdriver.PhantomJS (2)
La situación
Tengo un script de python simple para obtener el código fuente HTML para una URL determinada:
browser = webdriver.PhantomJS()
browser.get(url)
content = browser.page_source
Ocasionalmente, la url apunta a una página con recursos externos de carga lenta (por ejemplo, archivos de video o contenido publicitario realmente lento).
Webdriver esperará hasta que se carguen esos recursos antes de completar la .get(url)
.
Nota: por razones extrañas, tengo que hacer esto con PhantomJS en lugar de requests
o urllib2
La pregunta
Me gustaría establecer un tiempo de espera en la carga de recursos de PhantomJS, de modo que si el recurso tarda demasiado en cargarse, el navegador asume que no existe o lo que sea.
Esto me permitiría realizar la siguiente consulta de .pagesource
función de lo que haya cargado el navegador.
Documentación en webdriver.PhantomJS es muy delgada, y no he encontrado una pregunta similar en SO.
¡gracias por adelantado!
Explicación larga a continuación, por lo que TLDR :
La versión actual de Ghostdriver de Selenium (en PhantomJS 1.9.8) ignora la opción resourceTimeout, utiliza implícitamente_wait (), set_page_load_timeout () de webdriver y los envuelve en el bloque try-except.
#Python
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
browser = webdriver.PhantomJS()
browser.implicitly_wait(3)
browser.set_page_load_timeout(3)
try:
browser.get("http://url_here")
except TimeoutException as e:
#Handle your exception here
print(e)
finally:
browser.quit()
Explicación
Para proporcionar configuraciones de página de PhantomJS a Selenium, se pueden usar las Capacidades deseadas de un webdriver como, por ejemplo:
#Python
from selenium import webdriver
cap = webdriver.DesiredCapabilities.PHANTOMJS
cap["phantomjs.page.settings.resourceTimeout"] = 1000
cap["phantomjs.page.settings.loadImages"] = False
cap["phantomjs.page.settings.userAgent"] = "faking it"
browser = webdriver.PhantomJS(desired_capabilities=cap)
//Java
DesiredCapabilities capabilities = DesiredCapabilities.phantomjs();
capabilities.setCapability("phantomjs.page.settings.resourceTimeout", 1000);
capabilities.setCapability("phantomjs.page.settings.loadImages", false);
capabilities.setCapability("phantomjs.page.settings.userAgent", "faking it");
WebDriver webdriver = new PhantomJSDriver(capabilities);
Pero, aquí está el truco: al igual que en el día de hoy (2014 / diciembre / 11) con PhantomJS 1.9.8 y su Ghostdriver incrustado, resourceTimeout no será aplicado por Ghostdriver ( Ver el problema Ghostdriver # 380 en Github ).
Para una solución alternativa, simplemente use las funciones / métodos de tiempo de espera de Selenium y ajuste el método get de webdriver en un bloque try-except / try-catch, p. Ej.
#Python
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
browser = webdriver.PhantomJS()
browser.implicitly_wait(3)
browser.set_page_load_timeout(3)
try:
browser.get("http://url_here")
except TimeoutException as e:
#Handle your exception here
print(e)
finally:
browser.quit()
//Java
WebDriver webdriver = new PhantomJSDriver();
webdriver.manage().timeouts()
.pageLoadTimeout(3, TimeUnit.SECONDS)
.implicitlyWait(3, TimeUnit.SECONDS);
try {
webdriver.get("http://url_here");
} catch (org.openqa.selenium.TimeoutException e) {
//Handle your exception here
System.out.println(e.getMessage());
} finally {
webdriver.quit();
}
PhantomJS ha proporcionado resourceTimeout
, que puede adaptarse a sus necesidades. Cito de la documentación aquí
(en milisegundos) define el tiempo de espera después del cual cualquier recurso solicitado dejará de intentar y continuará con otras partes de la página. La devolución de llamada onResourceTimeout se ejecutará en tiempo de espera.
En Ruby, puedes hacer algo como
require ''selenium-webdriver''
capabilities = Selenium::WebDriver::Remote::Capabilities.phantomjs("phantomjs.page.settings.resourceTimeout" => "5000")
driver = Selenium::WebDriver.for :phantomjs, :desired_capabilities => capabilities
Creo en Python, es algo así como (no probado, solo proporciona la lógica, tú eres el desarrollador de Python, con suerte lo descubrirás)
driver = webdriver.PhantomJS(desired_capabilities={''phantomjs.page.settings.resourceTimeout'': ''5000''})