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
相关产品推荐
相关产品推荐

