使用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()
关键改进点
- 用显式等待(
WebDriverWait)代替固定的time.sleep,根据页面实际加载状态执行下一步,稳定性大幅提升 - 提前保存链接地址或用新窗口访问,彻底避免页面跳转后原元素引用失效的问题
- 通过
get_attribute("href")直接获取链接,比By.LINK_TEXT更可靠,不会受文本格式、空格等因素影响
内容的提问来源于stack exchange,提问作者hrocj2n
相关产品推荐
相关产品推荐

