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

