You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium如何等待指定选择器的全部元素加载完成?

解决方案

1. 自定义等待条件,等待元素数量达标

presence_of_all_elements_located的逻辑是只要页面中存在至少一个匹配的元素就会立即返回,不会等待所有预期元素加载完成。你可以自定义等待条件,明确等待元素数量达到预期值:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

# 等待元素数量达到12个
el = WebDriverWait(browser, 20).until(
    lambda driver: len(driver.find_elements(By.CSS_SELECTOR, "till-cap")) == 12
)

如果元素数量存在波动,也可以设置等待数量稳定(连续两次检查数量不变),避免因加载延迟误判:

def wait_for_elements_stable(driver, locator, timeout=20, poll_frequency=0.5):
    wait = WebDriverWait(driver, timeout, poll_frequency)
    return wait.until(
        lambda d: len(d.find_elements(*locator)) == len(d.find_elements(*locator))
    )

# 使用示例
el = wait_for_elements_stable(browser, (By.CSS_SELECTOR, "till-cap"))

2. 处理动态加载场景

如果这些元素是通过滚动加载、点击"加载更多"或异步请求逐步加载的,仅等待数量可能不够,需要先触发所有元素的加载:

场景A:滚动加载

若元素需滚动到视图内才加载,可循环滚动页面底部直到元素数量达标:

from selenium.webdriver.common.keys import Keys

current_count = 0
while True:
    # 滚动到页面底部
    browser.find_element(By.TAG_NAME, 'body').send_keys(Keys.END)
    # 等待元素数量增加
    WebDriverWait(browser, 1).until(lambda d: len(d.find_elements(By.CSS_SELECTOR, "till-cap")) > current_count)
    current_count = len(browser.find_elements(By.CSS_SELECTOR, "till-cap"))
    # 达到预期数量则停止
    if current_count == 12:
        break

# 最终获取所有元素
el = browser.find_elements(By.CSS_SELECTOR, "till-cap")

场景B:存在"加载更多"按钮

若页面有加载更多按钮,需点击直到按钮消失或元素数量达标:

from selenium.webdriver.support import expected_conditions as EC

current_count = 0
while True:
    try:
        # 查找并点击加载更多按钮(替换为实际选择器)
        load_more_btn = WebDriverWait(browser, 5).until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, "button.load-more"))
        )
        load_more_btn.click()
        # 等待元素数量增加
        WebDriverWait(browser, 5).until(lambda d: len(d.find_elements(By.CSS_SELECTOR, "till-cap")) > current_count)
        current_count = len(browser.find_elements(By.CSS_SELECTOR, "till-cap"))
    except:
        # 按钮不存在则退出循环
        break

el = browser.find_elements(By.CSS_SELECTOR, "till-cap")

3. 改用visibility_of_all_elements_located(可选)

如果元素存在但未完全渲染(不可见),可以尝试用visibility_of_all_elements_located,它会等待所有匹配元素可见后返回:

from selenium.webdriver.support import expected_conditions as EC

el = WebDriverWait(browser, 20).until(
    EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "till-cap"))
)

注意:该方法要求所有元素都可见,若页面存在默认隐藏的目标元素则不适用。


内容的提问来源于stack exchange,提问作者habibnuhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:42:20