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

Selenium代码循环内无法定位元素,单独执行正常求助

问题原因及解决方案

核心原因

循环执行时,driver.get()跳转页面后,页面还没完成渲染就立刻执行元素定位代码,此时目标svg[width="5"]元素还没加载出来,所以find_elements返回空列表。而单独运行时,浏览器有足够的时间完成页面加载,所以能正常找到元素。

解决方案:添加显式等待

用Selenium的WebDriverWait配合expected_conditions,等待目标元素加载完成后再进行操作,这是处理动态页面爬虫的标准做法。

修改后的循环核心代码示例:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# ... 保留原有导入和初始化代码

for i in missing:
    driver.get("https://explorer.iota.org/mainnet/message/%s" % i)
    
    # 等待目标svg元素加载完成,最多等待10秒
    WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'svg[width="5"]'))
    )
    l = driver.find_elements(By.CSS_SELECTOR, 'svg[width="5"]')
    print(l)
    
    # 同样给card--header元素添加等待,避免后续索引报错
    WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div.card--header'))
    )
    card_headers = driver.find_elements(By.CSS_SELECTOR, 'div.card--header')
    print(card_headers)
    from_counter = int(card_headers[0].text[-1])

    # ... 后续逻辑代码保持不变

额外优化建议

  1. 修复Pandas赋值问题:你最后一行的链式索引df[df['transaction_id'] == i]['input_addresses_x'] = input_addresses不会真正修改原DataFrame,建议改为:
    df.loc[df['transaction_id'] == i, 'input_addresses_x'] = input_addresses
    
  2. 点击后元素等待:点击SVG弹出按钮后,也可以给button.margin-r-t添加显式等待,避免因元素未加载导致空列表:
    WebDriverWait(driver, 5).until(
        EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'button.margin-r-t'))
    )
    tmp = driver.find_elements(By.CSS_SELECTOR, 'button.margin-r-t')
    
  3. 滚动稳定性优化:用ActionChains的move_to_element代替直接滚动,定位元素更稳定:
    ActionChains(driver).move_to_element(j).perform()
    j.click()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:27:31