Agregar Selenium Web Driver Esperar en Python

Rana Hasnain Khan 15 febrero 2024
  1. Espera del controlador web Python Selenium
  2. Espera implícita en Selenium Web Driver
  3. Espera explícita en Selenium Web Driver
Agregar Selenium Web Driver Esperar en Python

Este artículo presentará ejemplos de cómo agregar una espera en el controlador web de Selenium en Python.

Espera del controlador web Python Selenium

La mayoría de las aplicaciones web utilizan técnicas AJAX. Debido a esto, los diferentes elementos presentes en una página web toman diferentes intervalos de tiempo para cargarse por completo, ya que Selenium no puede encontrar ningún texto hasta que esté presente en la página web.

Es posible que encontremos que un texto en particular no está presente en una página web de alguna aplicación antes de que se cargue. Esto crea errores al probar una aplicación.

Este problema se puede resolver involucrando esperas. Estas esperas ofrecen flexibilidad en la búsqueda de un elemento o cualquier otra operación en una página web.

El controlador web de Selenium proporciona dos tipos de esperas. El primero es una espera implícita y el segundo es una espera explícita.

El detalle de estos dos tipos de esperas se discute en este artículo.

Espera implícita en Selenium Web Driver

Debido a la lentitud de Internet o la respuesta lenta de un sitio web, puede haber situaciones en las que tengamos que esperar unos segundos para obtener todos los resultados. Para este caso, la espera implícita funciona mejor.

Una espera implícita le dice al controlador web que sondee el DOM durante un tiempo específico mientras busca elementos para que todos los elementos estén disponibles cuando nuestro controlador web obtenga el elemento. La configuración por defecto del proceso es 0.

Una vez que hayamos establecido la espera implícita, será durante la vida útil del objeto del controlador web.

Será por la misma cantidad siempre que ejecutemos el mismo controlador web sin cerrar o reiniciar y cambiar el valor de espera.

Veamos un ejemplo en el que iremos a un sitio web y esperaremos 10 segundos, y luego haremos clic en el enlace de la página Acerca de nosotros, como se muestra a continuación.

Código de ejemplo:

# python
from selenium import webdriver

ChromeDriver = webdriver.Chrome()

ChromeDriver.implicitly_wait(10)

ChromeDriver.get("https://www.inventicosolutions.com/")

getElemByLink = ChromeDriver.find_element_by_link_text("About Us")

getElemByLink.click()

Producción:

Ejemplo de espera del controlador web Selenium en Python

Como puede ver en el ejemplo anterior, espera exactamente 10 segundos después de cargar la página antes de ir a la página Acerca de nosotros.

Espera explícita en Selenium Web Driver

Una espera explícita es un tipo de código definido para esperar a que ocurra una condición específica y continuar en el código. El caso extremo de espera explícita es time.sleep().

Esto establece la condición, para la espera, en un período de tiempo exacto.

Algunos métodos apropiados nos ayudan a escribir un código explícito. Las esperas explícitas se logran utilizando la clase de espera del controlador web y se combinan con condiciones_esperadas.

Como se muestra a continuación, veamos un ejemplo en el que usaremos una espera explícita en lugar de una espera implícita.

Código de ejemplo:

# python
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ExpectedCond

chromeDriver = webdriver.Chrome()

chromeDriver.get("https://inventicosolutions.com")

getElembyLinkText = WebDriverWait(chromeDriver, 10).until(
    ExpectedCond.presence_of_element_located((By.LINK_TEXT, "About Us"))
)

getElembyLinkText.click()

Producción:

Selenium Web Driver Ejemplo de espera explícita en Python

El valor de tiempo de espera es de 10 segundos para el código escrito anteriormente. El controlador web esperará 10 segundos antes de lanzar una Excepción de tiempo de espera.

La dirección de la página web de la aplicación (URL) y el elemento de texto se pueden escribir en el código dado según el requisito.

La espera del controlador web (una de las herramientas que se utiliza en las esperas explícitas) tiene esta cualidad incorporada para verificar la Condición esperada después de cada 500 milisegundos hasta que el texto se encuentre correctamente.

Condiciones esperadas para esperar en Python

Estas condiciones se utilizan con mayor frecuencia al automatizar el navegador web y están predefinidas en el controlador web. Estas condiciones incluyen:

  • title_is
  • title_contains
  • presence_of_element_located
  • visibility_of_element_located
  • visibility_of
  • presence_of_all_elements_located
  • text_to_be_present_in_element
  • text_to_be_present_in_element_value
  • frame_to_be_available_and_switch_to_it
  • invisibility_of_element_located
  • element_to_be_clickable
  • staleness_of
  • element_to_be_selected
  • element_located_to_be_selected
  • element_selection_state_to_be
  • element_located_selection_state_to_be
  • alert_is_present

Podemos incluir estas condiciones esperadas en nuestro código importando las siguientes bibliotecas.

# python
from selenium.webdriver.support import expected_conditions as ExpectedCond

Condiciones de espera personalizadas en Python

Se pueden crear condiciones de espera personalizadas cuando ninguno de los métodos anteriores cumple con los requisitos de un usuario. Se crea una condición personalizada usando una clase con el método call().

Como se muestra a continuación, veamos un ejemplo en el que crearemos una condición personalizada e intentaremos que nuestro programa espere unos segundos.

Código de ejemplo:

# python
class ElementWithClass(object):
    def __init__(self, location, className):
        self.location = location

        self.className = className

    def __call__(self, ChromeDriver):
        findElem = ChromeDriver.find_element(*self.location)

        if self.className in findElem.get_attribute("class"):
            return findElem
        else:
            return False

        wait = WebDriverWait(ChromeDriver, 10)
        findElem = wait.until(element_has_css_class((By.ID, "myId"), "myClass"))

Este código le dará al usuario un true si se encuentra el elemento y devuelve un false en caso contrario.

Así que hemos discutido diferentes métodos para agregar esperas en Python con algunos ejemplos. Esperamos que haya disfrutado este tema y aprendido algo de él.

Rana Hasnain Khan avatar Rana Hasnain Khan avatar

Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.

LinkedIn

Artículo relacionado - Python Selenium