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]) # ... 后续逻辑代码保持不变
额外优化建议
- 修复Pandas赋值问题:你最后一行的链式索引
df[df['transaction_id'] == i]['input_addresses_x'] = input_addresses不会真正修改原DataFrame,建议改为:df.loc[df['transaction_id'] == i, 'input_addresses_x'] = input_addresses - 点击后元素等待:点击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') - 滚动稳定性优化:用
ActionChains的move_to_element代替直接滚动,定位元素更稳定:ActionChains(driver).move_to_element(j).perform() j.click()
内容的提问来源于stack exchange,提问作者HUANG Chuanshan
相关产品推荐
相关产品推荐

