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

使用Selenium点击链接后返回失败,寻求技术帮助

Selenium点击链接返回后失效的解决方法

你的问题主要出在三个核心点:

  • 页面跳转返回后,原先获取的project_profiles元素集合会失效(DOM重新渲染导致元素引用过期)
  • 用By.LINK_TEXT查找元素容易出错,比如建筑名称包含换行、多余空格,或者链接文本和显示文本不完全匹配
  • 固定时长的time.sleep稳定性差,可能页面未加载完成就执行下一步操作

下面是两种可行的修正方案:

方案一:提前保存所有链接地址

先把列表页的所有项目链接和名称存下来,再逐个访问,彻底避免返回后元素失效的问题:

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

driver = webdriver.Chrome()
driver.get("https://www.usgbc.org/projects/?Country=%5B%22United+States%22%5D&Rating+System=%5B%22New+Construction%22%5D&Rating+Version=%5B%22v2009%22%5D&Certification=%5B%22Platinum%22%5D&State=%5B%22Texas%22%5D")

buildings = []

try:
    # 等待列表页元素加载完成
    project_profiles = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CLASS_NAME, "grid-item--title"))
    )
    
    # 提前保存所有项目的名称和链接地址
    project_list = []
    for profile in project_profiles:
        building_name = profile.text.strip()
        buildings.append(building_name)
        link_href = profile.get_attribute("href")
        project_list.append((building_name, link_href))
    
    # 遍历保存的链接,逐个访问详情页
    for name, href in project_list:
        print(name)
        driver.get(href)
        # 这里添加你需要在详情页执行的操作,比如提取信息
        
        # 等待详情页加载完成(示例:等待标题元素出现)
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.TAG_NAME, "h1"))
        )
        
        # 返回列表页
        driver.back()
        # 等待列表页重新加载完成
        WebDriverWait(driver, 10).until(
            EC.presence_of_all_elements_located((By.CLASS_NAME, "grid-item--title"))
        )
        
finally:
    driver.quit()

方案二:打开新窗口访问详情页

通过打开新窗口的方式,不用返回原页面,从根源上避免元素失效问题:

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

driver = webdriver.Chrome()
driver.get("https://www.usgbc.org/projects/?Country=%5B%22United+States%22%5D&Rating+System=%5B%22New+Construction%22%5D&Rating+Version=%5B%22v2009%22%5D&Certification=%5B%22Platinum%22%5D&State=%5B%22Texas%22%5D")

buildings = []

try:
    project_profiles = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CLASS_NAME, "grid-item--title"))
    )
    
    for profile in project_profiles:
        building_name = profile.text.strip()
        buildings.append(building_name)
        print(building_name)
        
        # 点击链接打开新窗口
        profile.click()
        # 切换到新打开的窗口
        driver.switch_to.window(driver.window_handles[-1])
        
        # 处理详情页操作(示例:等待标题元素出现)
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.TAG_NAME, "h1"))
        )
        
        # 关闭当前详情页窗口
        driver.close()
        # 切回原列表页窗口
        driver.switch_to.window(driver.window_handles[0])
        
finally:
    driver.quit()

关键改进点

  1. 用显式等待(WebDriverWait)代替固定的time.sleep,根据页面实际加载状态执行下一步,稳定性大幅提升
  2. 提前保存链接地址或用新窗口访问,彻底避免页面跳转后原元素引用失效的问题
  3. 通过get_attribute("href")直接获取链接,比By.LINK_TEXT更可靠,不会受文本格式、空格等因素影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:30:36