warn support please macosx has for example been python selenium selenium-webdriver phantomjs

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''})