python - ¿Cómo hacer que Selenium no espere hasta que se cargue la página completa, que tiene un script lento?
google-chrome selenium-chromedriver (2)
Selenium
driver.get (url)
espere hasta que se cargue la página completa.
Pero una página de raspado intenta cargar un script JS muerto.
Entonces mi script Python lo espera y no funciona unos minutos.
Este problema puede estar en todas las páginas de un sitio.
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(''https://www.cortinadecor.com/productos/17/estores-enrollables-screen/estores-screen-corti-3000'')
# It try load: https://www.cetelem.es/eCommerceCalculadora/resources/js/eCalculadoraCetelemCombo.js
driver.find_element_by_name(''ANCHO'').send_keys("100")
¿Cómo limitar el tiempo de espera, bloquear la carga AJAX de un archivo, o es de otra manera?
También
webdriver.Chrome()
mi script en
webdriver.Chrome()
, pero usaré PhantomJS (), o probablemente Firefox ().
Entonces, si algún método usa un cambio en la configuración del navegador, entonces debe ser universal.
Selenium Webdriver proporciona dos tipos de esperas: implícitas y explícitas. Una espera explícita hace que WebDriver espere a que se produzca una determinada condición antes de continuar con la ejecución.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
Esto espera hasta 10 segundos antes de lanzar una
TimeoutExceptionmenos que encuentre que el elemento regrese en 10 segundos.
Entonces, una solución podría ser establecer un tiempo de espera y si el elemento no queda atrapado en ese período fijo, tome la excepción y registre el evento o nada y finalmente continúe. El código de muestra ha sido tomado de here
Cuando Selenium carga una página / url de manera predeterminada, sigue una configuración predeterminada con
pageLoadStrategy
establecido en
normal
.
Para que Selenium no espere la carga completa de la página, podemos configurar
pageLoadStrategy
.
pageLoadStrategy
admite 3 valores diferentes de la siguiente manera:
-
normal(carga de página completa) -
eager(interactivo) -
none
Aquí está el bloque de código para configurar el
pageLoadStrategy
:
-
Firefox
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities caps = DesiredCapabilities().FIREFOX caps["pageLoadStrategy"] = "normal" # complete #caps["pageLoadStrategy"] = "eager" # interactive #caps["pageLoadStrategy"] = "none" driver = webdriver.Firefox(desired_capabilities=caps, executable_path=r''C:/path/to/geckodriver.exe'') driver.get("http://google.com") -
Cromo :
from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities caps = DesiredCapabilities().CHROME caps["pageLoadStrategy"] = "normal" # complete #caps["pageLoadStrategy"] = "eager" # interactive #caps["pageLoadStrategy"] = "none" driver = webdriver.Chrome(desired_capabilities=caps, executable_path=r''C:/path/to/chromedriver.exe'') driver.get("http://google.com")
Nota : los valores de
pageLoadStrategysonnormal,eagerynonees un requisito según el borrador del editor de WebDriver W3C, pero el valor depageLoadStrategycomoeagersigue siendo un WIP (Work In Progress) dentro de la implementación de ChromeDriver . Puede encontrar una discusión detallada en la solución de estrategia de carga de página "Eager" para Chromedriver Selenium en Python