Selenium Webdriver – NoSuchElementExceptions

Estoy usando la biblioteca de pruebas de la unidad de python (unittest) con el controlador de web de selenium. Estoy tratando de encontrar un elemento por su nombre. Aproximadamente la mitad de las veces, las pruebas arrojan una excepción NoSuchElementException y la otra vez no arrojan la excepción.

Me preguntaba si tenía que ver con el controlador web de selenium que no esperaba el tiempo suficiente para que la página se cargara.

driver = webdriver.WhatEverBrowser() driver.implicitly_wait(60) # This line will cause it to search for 60 seconds 

solo se debe insertar en el código una vez (normalmente lo hago justo después de crear el objeto webdriver)

por ejemplo, si por alguna razón su página tarda 30 segundos en cargarse (comprar un nuevo servidor), y el elemento es una de las últimas cosas en aparecer en la página, prácticamente sigue revisando una y otra vez si el el elemento está ahí durante 60 segundos, ENTONCES si no lo encuentra, lanza la excepción.

también asegúrese de que su scope sea correcto, es decir: si está enfocado en un marco y el elemento que está buscando NO está en ese marco, NO lo encontrará.

Yo también veo eso. Lo que hago es simplemente esperar …

tu podrías intentar:

 while True: try: x = driver.find_by_name('some_name') break except NoSuchElementException: time.sleep(1) # possibly use driver.get() again if needed 

Además, intente actualizar su selenium a la versión más reciente con pip install --update selenium

Puse mi dinero en el marco ya que tuve un problema similar antes 🙂

Verifique nuevamente su html y verifique si está tratando con un marco. Si está cambiando al cuadro correcto podrá localizar el elemento.

Pitón

 driver.switch_to_frame("frameName") 

Luego busca el elemento.

Si no, intente poner el tiempo de espera como otros sugirieron

Una forma de manejar la espera de que aparezca un elemento es la siguiente:

 import selenium.webdriver.support.ui as ui wait = ui.WebDriverWait(driver,10) wait.until(lambda driver: driver.find_by_name('some_name') ) elem = driver.find_by_name('some_name') 

Tiene razón en que el controlador web no está esperando a que se cargue la página, no hay una espera predeterminada driver.get() para driver.get() .

Para resolver esta consulta hay que definir espera explícita. de modo que hasta el momento en que la página se está cargando no buscará ningún elemento Web. debajo de url ayuda en esto. http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

Necesitas tener un waitUntil (tu elemento carga). Si está seguro de que su elemento aparecerá en la página, esto asegurará que las validaciones solo ocurrirán después de que se cargue el elemento esperado.

Creo que podría ser un problema de sincronización (es decir, la velocidad del controlador de web y la velocidad de la aplicación no coinciden)

Use espera implícita:

 driver.manage.timeouts.implicitlyWait(9000 TIMEUNITS.miliseconds) 

Referencia