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

Selenium StaleElementReferenceException问题:批量下载谷歌图片失败求助

批量谷歌图片下载脚本的StaleElementReferenceException问题

问题场景

我编写了Python+Selenium脚本用于从file.txt批量读取关键词下载谷歌图片,单个关键词直接写在代码里时脚本正常运行,但批量读取文件执行时,Chrome能打开并完成图片搜索,却在下载阶段崩溃,抛出StaleElementReferenceException错误。

原脚本代码

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=Service(r'C:\Users\Desktop\Temp\images\chromedriver.exe'))
driver.get('https://www.google.it/imghp?hl=it&authuser=0&ogbl')

time.sleep(10)

with open("file.txt") as file:
    for row in file.readlines():
        box = driver.find_element("xpath", '/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input')
        box.send_keys(row)
        box.send_keys(Keys.ENTER)
        time.sleep(3)

        for i in range(1, 3):
            try:
                driver.find_element("xpath", '//*[@id="islrg"]/div[1]/div['+str(i)+']/a[1]/div[1]/img').screenshot(r'C:\Users\Desktop\Temp\images\downloads ('+str(i)+').png')
                time.sleep(3)
            except:
                pass

错误日志

Traceback (most recent call last):
File "C:\Users\Angelo\Desktop\Temp\images\try.py", line 16, in <module> box.send_keys(Keys.ENTER)
File "C:\Python310\lib\site-packages\selenium\webdriver\remote\webelement.py", line 223, in send_keys self._execute(Command.SEND_KEYS_TO_ELEMENT,
File "C:\Python310\lib\site-packages\selenium\webdriver\remote\webelement.py", line 396, in _execute return self._parent.execute(command, params)
File "C:\Python310\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 428, in execute self.error_handler.check_response(response)
File "C:\Python310\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 243, in check_response raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document (Session info: chrome=105.0.5195.102)
Stacktrace:
Backtrace:
Ordinal0 [0x0076DF13+2219795]
Ordinal0 [0x00702841+1779777]
Ordinal0 [0x0061423D+803389]
Ordinal0 [0x00616D04+814340]
Ordinal0 [0x00616BC2+814018]
Ordinal0 [0x00616E50+814672]
Ordinal0 [0x00643A4B+997963]
Ordinal0 [0x00643B21+998177]
Ordinal0 [0x0063C1D4+967124]
Ordinal0 [0x0065E7FC+1107964]
Ordinal0 [0x006394B4+955572]
Ordinal0 [0x0065EA14+1108500]
Ordinal0 [0x0066F192+1175954]
Ordinal0 [0x0065E616+1107478]
Ordinal0 [0x00637F89+950153]
Ordinal0 [0x00638F56+954198]
GetHandleVerifier [0x00A62CB2+3040210]
GetHandleVerifier [0x00A52BB4+2974420]
GetHandleVerifier [0x00806A0A+565546]
GetHandleVerifier [0x00805680+560544]
Ordinal0 [0x00709A5C+1808988]
Ordinal0 [0x0070E3A8+1827752]
Ordinal0 [0x0070E495+1827989]
Ordinal0 [0x007180A4+1867940]
BaseThreadInitThunk [0x772BFA29+25]
RtlGetAppContainerNamedObjectPath [0x778A7A9E+286]
RtlGetAppContainerNamedObjectPath [0x778A7A6E+238]

file.txt示例内容

popo
mumu
fiat
bmw
audi

问题原因

  1. 元素引用失效:第一次搜索后页面跳转刷新,之前定位的搜索框元素已脱离当前页面文档,第二次循环仍操作该失效元素,触发StaleElementReferenceException。
  2. 关键词含换行符:读取文件行时默认包含换行符,导致搜索关键词不准确。
  3. 图片命名重复:所有关键词的图片使用相同文件名,会被互相覆盖。
  4. 固定等待不稳定:time.sleep的固定时长无法适配页面实际加载速度,可能导致元素未就绪就执行操作。

修复后的脚本

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

# 初始化浏览器
driver = webdriver.Chrome(service=Service(r'C:\Users\Desktop\Temp\images\chromedriver.exe'))
driver.get('https://www.google.it/imghp?hl=it&authuser=0&ogbl')
wait = WebDriverWait(driver, 10)

with open("file.txt") as file:
    for row in file.readlines():
        # 处理关键词,去除换行符和空格
        keyword = row.strip()
        if not keyword:
            continue
        
        # 每次循环重新定位搜索框,确保元素有效
        search_box = wait.until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input')))
        # 清空搜索框再输入新关键词
        search_box.clear()
        search_box.send_keys(keyword)
        search_box.send_keys(Keys.ENTER)
        
        # 等待图片列表加载完成
        wait.until(EC.presence_of_element_located((By.ID, 'islrg')))
        time.sleep(2)
        
        # 下载前2张图片,文件名包含关键词避免覆盖
        for i in range(1, 3):
            try:
                img_xpath = f'//*[@id="islrg"]/div[1]/div[{i}]/a[1]/div[1]/img'
                img_element = wait.until(EC.presence_of_element_located((By.XPATH, img_xpath)))
                # 按"关键词_序号"格式保存图片
                img_element.screenshot(rf'C:\Users\Desktop\Temp\images\{keyword}_{i}.png')
                time.sleep(2)
            except Exception as e:
                print(f"下载{keyword}第{i}张图片失败: {str(e)}")
                continue

# 关闭浏览器
driver.quit()

关键改动说明

  • 重新定位元素:每次循环通过显式等待重新获取搜索框,避免页面刷新后元素失效。
  • 清理关键词:用strip()去除换行符和空格,保证搜索关键词准确。
  • 唯一文件名:图片名包含关键词和序号,解决文件覆盖问题。
  • 显式等待替代固定休眠:用WebDriverWait等待元素加载完成,提升脚本稳定性。
  • 清空搜索框:输入新关键词前清空搜索框,防止关键词叠加。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:01:01