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

Selenium WebDriver脚本修复:点击新闻返回后执行报错问题

修复Selenium依次点击帖子后返回崩溃的问题

问题核心原因

你遇到的崩溃是StaleElementReferenceException导致的:调用browser.back()返回列表页时,页面DOM会重新渲染,之前提前获取的posts列表里的元素引用已经失效,无法再执行点击操作。


方案一:循环中重新定位元素

每次回到列表页后,重新查找所有帖子元素,通过索引定位当前要点击的帖子,避免引用失效:

from selenium import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep

browser = Chrome('/home/mikhail/Desktop/WORK/kursach_2/die_Linke/chromedriver')
url = 'https://www.die-linke.de/start/presse/newsfilter'
browser.get(url)

# 等待帖子元素加载完成,获取总数
wait(browser, 10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'a.readon')))
post_count = len(browser.find_elements(By.CSS_SELECTOR, 'a.readon'))

text = []
for i in range(post_count):
    # 每次循环重新定位所有帖子,确保元素引用有效
    posts = wait(browser, 10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'a.readon')))
    posts[i].click()
    sleep(2)
    
    # 在这里添加提取帖子内容的逻辑,例如:
    # article_content = browser.find_element(By.CSS_SELECTOR, "div.article-content").text
    # text.append(article_content)
    
    browser.back()
    # 等待列表页重新加载完成,再进行下一次循环
    wait(browser, 10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'a.readon')))
    sleep(1)

方案二:直接获取帖子链接,新标签页访问

这种方法无需来回跳转,稳定性和效率更高,同时彻底避免元素失效问题:

from selenium import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep

browser = Chrome('/home/mikhail/Desktop/WORK/kursach_2/die_Linke/chromedriver')
url = 'https://www.die-linke.de/start/presse/newsfilter'
browser.get(url)

# 提前获取所有帖子的链接
wait(browser, 10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'a.readon')))
post_links = [post.get_attribute('href') for post in browser.find_elements(By.CSS_SELECTOR, 'a.readon')]

text = []
for link in post_links:
    # 打开新标签页访问帖子链接
    browser.execute_script(f"window.open('{link}');")
    # 切换到新打开的标签页
    browser.switch_to.window(browser.window_handles[-1])
    sleep(2)
    
    # 添加提取内容的逻辑
    # article_content = browser.find_element(By.CSS_SELECTOR, "div.article-content").text
    # text.append(article_content)
    
    # 关闭当前标签页,切回原列表页
    browser.close()
    browser.switch_to.window(browser.window_handles[0])

关键说明

  • 方案一通过每次循环重新定位元素,解决了DOM刷新后元素引用失效的问题;
  • 方案二更优,直接通过链接访问帖子,避免了页面跳转带来的DOM重构问题,同时可灵活优化为并行处理标签页,进一步提升效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:02:45