Agregar Selenium Web Driver Esperar en Python
- Espera del controlador web Python Selenium
- Espera implícita en Selenium Web Driver
- Espera explícita en Selenium Web Driver
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:
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:
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 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