Python Selenium:确保多个元素加载
通过 AJAX 处理动态加载的元素时,确认其外观可能很困难。为了处理这种情况,我们将利用 Selenium 的 WebDriverWait 及其各种策略来确保多个元素的存在。
所有元素的可见性:
验证所有与特定选择器匹配的元素,我们可以使用visibility_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>
等待特定数量的元素:
如果需要等待对于要加载的特定数量的元素,您可以将 lambda 函数与 ExpectedConditions 类结合使用:
<code class="python">WebDriverWait(driver, 20).until( lambda driver: len(driver.find_elements_by_xpath(selector)) > int(myLength) )</code>
子元素的 XPath:
等待子元素父元素中的元素,而不是搜索整个 DOM,您可以使用 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>
自定义等待条件:
如果您更喜欢创建自己的等待条件等待条件,可以定义 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>
防止 DOM 中元素丢失:
来避免在查找操作后丢失当前元素,在执行等待之前将其存储在变量中:
<code class="python">element = driver.find_element_by_css_selector('ul') WebDriverWait(element, 30).until(MoreThanOne('li'))</code>
结论:
这些技术提供了一种灵活且健壮的方法等待 Selenium 中多个元素的加载。根据您的要求,选择最适合您的用例的方法。
以上是如何确保 Python Selenium 中加载多个元素?的详细内容。更多信息请关注PHP中文网其他相关文章!