Python Selenium: Ensuring Multiple Elements Load
When dealing with dynamically loaded elements via AJAX, it can be challenging to confirm their appearance. To handle this scenario, we will utilize Selenium's WebDriverWait and its various strategies to ensure the presence of multiple elements.
Visibility of All Elements:
To verify the visibility of all elements matching a specific selector, we can employ the visibility_of_all_elements_located() condition:
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]")
)
)
Waiting for a Specific Number of Elements:
If you need to wait for a specific number of elements to load, you can use a lambda function with the ExpectedConditions class:
WebDriverWait(driver, 20).until(
lambda driver: len(driver.find_elements_by_xpath(selector)) > int(myLength)
)
XPath for Child Elements:
To wait for child elements within a parent element, rather than searching the entire DOM, you can utilize XPath expressions:
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_')]")
)
)
Custom Waiting Conditions:
If you prefer creating your own waiting condition, you can define a subclass of 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'))
Prevention of Element Loss in DOM:
To avoid losing the current element after a find operation, store it in a variable before performing the wait:
element = driver.find_element_by_css_selector('ul')
WebDriverWait(element, 30).until(MoreThanOne('li'))
Conclusion:
These techniques provide a flexible and robust way to wait for the loading of multiple elements in Selenium. Depending on your requirements, choose the approach that best suits your use case.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3