Python Selenium: garantizar la carga de múltiples elementos
Cuando se trata de elementos cargados dinámicamente a través de AJAX, puede resultar complicado confirmar su apariencia. Para manejar este escenario, utilizaremos WebDriverWait de Selenium y sus diversas estrategias para garantizar la presencia de múltiples elementos.
Visibilidad de todos los elementos:
Para verificar la visibilidad de todos los elementos que coinciden con un selector específico, podemos emplear la condición visibilidad_of_all_elements_located():
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
elements = WebDriverWait(driver, 20).until(
EC.visibility_of_all_elements_located(
(By.CSS_SELECTOR, "ul.ltr li[id^='t_b_'] > a[id^='t_a_'][href]")
)
)
Esperando un número específico de elementos:
Si necesita esperar a que se cargue un número específico de elementos, puede usar una función lambda con las Condiciones esperadas clase:
WebDriverWait(driver, 20).until(
lambda driver: len(driver.find_elements_by_xpath(selector)) > int(myLength)
)
XPath para elementos secundarios:
Para esperar elementos secundarios dentro de un elemento principal, en lugar de buscar en todo el DOM, puede utilizar expresiones XPath:
WebDriverWait(driver, 20).until(
EC.presence_of_element_located(
(By.XPATH, "//ul[@class='ltr']//li[starts-with(@id, 't_b_')]/a[starts-with(@id, 't_a_')]")
)
)
Condiciones de espera personalizadas:
Si prefiere crear su propia condición de espera, puede definir una subclase de webdriver.support.ui.ExpectedCondition:
class MoreThanOne(webdriver.support.ui.ExpectedCondition):
def __init__(self, selector):
self.selector = selector
def __call__(self, driver):
elements = driver.find_elements_by_css_selector(self.selector)
return len(elements) > 1
WebDriverWait(driver, 30).until(MoreThanOne('li'))
Prevención de pérdida de elementos en DOM:
Para evitar perder el elemento actual después de una operación de búsqueda, guárdelo en una variable antes de realizar la espera:
element = driver.find_element_by_css_selector('ul')
WebDriverWait(element, 30).until(MoreThanOne('li'))
Conclusión:
Estas técnicas proporcionan una forma flexible y sólida de esperar la carga de múltiples elementos en selenio. Dependiendo de sus requisitos, elija el enfoque que mejor se adapte a su caso de uso.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3