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
问题原因
- 元素引用失效:第一次搜索后页面跳转刷新,之前定位的搜索框元素已脱离当前页面文档,第二次循环仍操作该失效元素,触发
StaleElementReferenceException。 - 关键词含换行符:读取文件行时默认包含换行符,导致搜索关键词不准确。
- 图片命名重复:所有关键词的图片使用相同文件名,会被互相覆盖。
- 固定等待不稳定:
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
相关产品推荐
相关产品推荐

