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

Python Selenium返回页面后无法定位已存在的CSS选择器

问题背景
  • 爬取目标:seetickets.us站点数据
  • 爬取流程:依次点击主办方条目进入对应活动列表页,再逐个点击活动进入详情页抓取指定字段
  • 现有正常能力:单个活动详情页的字段提取逻辑可正常运行
  • 异常表现:从活动详情页调用back()方法返回活动列表页后,WebDriver无法定位目标CSS选择器,无法继续点击后续活动
  • 已尝试无效方案:显式等待、time.sleep()强制等待页面加载
问题相关代码
# 遍历活动、抓取详情、返回列表的核心逻辑
def get_all_events_in_each_event(self):
     inner_events  = self.get_all_inner_events()
     print(len(inner_events))
     for event in inner_events:

         self.click_inner_event(event)
         self.get_event_loc()
         self.get_talent()
         self.get_facebook()
         self.get_date()
         self.get_showtime_city()
         self.get_ticket_doors()
         self.back()
         try:
             WebDriverWait(self, 10).until(
                 EC.element_to_be_clickable((By.CLASS_NAME, "event-images-box")))
         except Exception as e:
             print("Wait Timed out")
             print(e) 

# 点击单个活动条目的逻辑
def click_inner_event(self , inner_event):
     link = inner_event.find_element_by_css_selector('div[class="event-info"]')
     link.click()
问题根因

核心原因是陈旧元素引用(Stale Element Reference):
你在循环外一次性获取的inner_events列表,存储的是第一次进入活动列表页时DOM节点的引用。当你点击活动进入详情页、再调用back()返回列表页时,浏览器会重新渲染列表页DOM,之前存储的所有WebElement引用会全部失效,指向已经不存在的旧DOM节点。
你现有的等待逻辑只校验了event-images-box容器是否可点击,没有重新获取新DOM下的活动元素,循环里使用的event变量始终是失效的旧节点引用,自然无法完成定位和点击操作。

修复方案
  • 禁止在循环外一次性缓存所有活动的WebElement引用,每次返回活动列表页后,重新拉取最新DOM下的活动元素列表
  • 按索引遍历活动,每轮循环都用最新拉取的元素列表中对应索引的节点做点击操作
  • 调整等待逻辑,等待所有活动条目节点渲染完成后再进入下一轮操作,不要只等待外层容器

修复后的参考代码:

def get_all_events_in_each_event(self):
    # 仅获取活动总数量,不缓存元素引用
    event_total = len(self.get_all_inner_events())
    print(event_total)
    for idx in range(event_total):
        # 每轮循环重新获取当前页最新的活动元素列表,解决引用失效问题
        current_event_list = self.get_all_inner_events()
        # 点击当前索引对应的活动
        self.click_inner_event(current_event_list[idx])
        # 原有详情页字段抓取逻辑
        self.get_event_loc()
        self.get_talent()
        self.get_facebook()
        self.get_date()
        self.get_showtime_city()
        self.get_ticket_doors()
        self.back()
        # 等待列表页所有活动条目加载完成,再进入下一轮
        WebDriverWait(self, 10).until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.event-info"))
        )

如果返回列表页后存在元素不在视口无法点击的问题,可以在点击前加滚动到目标元素的逻辑:self.execute_script("arguments[0].scrollIntoView();", current_event_list[idx])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:00:53