Python Selenium : assurer le chargement de plusieurs éléments
Lorsque vous traitez des éléments chargés dynamiquement via AJAX, il peut être difficile de confirmer leur apparence. Pour gérer ce scénario, nous utiliserons WebDriverWait de Selenium et ses différentes stratégies pour assurer la présence de plusieurs éléments.
Visibilité de tous les éléments :
Pour vérifier la visibilité de tous les éléments correspondant à un sélecteur spécifique, nous pouvons utiliser la condition visibilité_of_all_elements_located() :
<code class="python">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]") ) )</code>
En attente d'un nombre spécifique d'éléments :
Si vous devez attendre pour un nombre spécifique d'éléments à charger, vous pouvez utiliser une fonction lambda avec la classe ExpectedConditions :
<code class="python">WebDriverWait(driver, 20).until( lambda driver: len(driver.find_elements_by_xpath(selector)) > int(myLength) )</code>
XPath pour les éléments enfants :
Pour attendre l'enfant éléments au sein d'un élément parent, plutôt que de rechercher dans l'ensemble du DOM, vous pouvez utiliser des expressions XPath :
<code class="python">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_')]") ) )</code>
Conditions d'attente personnalisées :
Si vous préférez créer les vôtres condition d'attente, vous pouvez définir une sous-classe de webdriver.support.ui.ExpectedCondition :
<code class="python">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</code>
<code class="python">WebDriverWait(driver, 30).until(MoreThanOne('li'))</code>
Prévention de la perte d'éléments dans le DOM :
Pour éviter perdant l'élément courant après une opération de recherche, stockez-le dans une variable avant d'effectuer l'attente :
<code class="python">element = driver.find_element_by_css_selector('ul') WebDriverWait(element, 30).until(MoreThanOne('li'))</code>
Conclusion :
Ces techniques offrent une manière flexible et robuste attendre le chargement de plusieurs éléments dans Selenium. En fonction de vos besoins, choisissez l'approche qui convient le mieux à votre cas d'utilisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!