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
TimeoutException
menos 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
pageLoadStrategy
sonnormal
,eager
ynone
es un requisito según el borrador del editor de WebDriver W3C, pero el valor depageLoadStrategy
comoeager
sigue 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