Buscar..


Introducción

Uno de los obstáculos más comunes para los usuarios más nuevos de Selenium está esperando hasta que la página esté completamente cargada. Los usuarios humanos pueden saber fácilmente si una página se ha cargado completamente o si todavía se está cargando. El selenio, sin embargo, solo espera un tiempo determinado. Por lo tanto, a menudo es conveniente tener una buena forma de esperar elementos en una página. Si bien es posible hacer esto con un bucle y funciones sleep (), hay muchas formas más limpias ya integradas en Selenium.

Espera explícita en Python

Cuando el navegador navega a una página dinámica (más comúnmente la aplicación web basada en AJAX), los elementos de la página pueden tardar un tiempo diferente en cargarse, y además: algunos elementos solo se cargarán en respuesta a algunas acciones del usuario. En tales casos, la recuperación directa de un elemento puede fallar:

# Don't do this: may fail on dynamic page with ElementNotVisibleException
element = driver.find_element_by_name('q') 

La solución más obvia es introducir la espera antes de recuperar elementos:

# Don't do this: inefficient solution for ElementNotVisibleException 
time.sleep(5) # delays for 5 seconds  
element = driver.find_element_by_name('q') 

Pero tal solución es ineficiente, ya que hace que la prueba espere siempre por 5 segundos, incluso cuando el elemento en la mayoría de los casos aparece después de 1 segundo (y solo a veces requiere hasta 5 segundos). No parece mucho si se trata de un solo lugar, pero generalmente cada prueba se ocupa de varios elementos, y hay varias pruebas, lo que se suma a la duración general de la prueba.

Una solución mejor es esperar a que aparezca el elemento durante 5 segundos, pero volver de la espera tan pronto como se encuentre el elemento. WebDriverWait te permite hacer precisamente eso.

El siguiente ejemplo navega a www.google.com, espera (hasta 5 segundos) a que se cargue la barra de búsqueda, y luego busca "selenio".

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

# Create a new chromedriver instance
driver = webdriver.Chrome()

# Go to www.google.com
driver.get("https://www.google.com")

try:
    # Wait as long as required, or maximum of 5 sec for element to appear
    # If successful, retrieves the element
    element = WebDriverWait(driver,5).until(
         EC.presence_of_element_located((By.NAME, "q")))

    # Type "selenium"
    element.send_keys("selenium")
    
    #Type Enter
    element.send_keys(Keys.ENTER)

except TimeoutException:
    print("Failed to load search bar at www.google.com")
finally:
    driver.quit()

Espera en Java con selenio.

Espera explícita : espere a que ocurra una determinada condición antes de continuar con el código.

WebDriver driver = new FirefoxDriver();
driver.get("http://google.com");
WebElement myElement = (new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(By.id("myElement")));

Espera implícita: espere un cierto tiempo al intentar encontrar un elemento o elementos si no están disponibles de inmediato.

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://google.com");
WebElement myElement = driver.findElement(By.id("myElement"));


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow