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

Python使用Selenium点击跳转同标签页新页面后如何获取新页面源码

问题原因

出现该问题核心是两个常见使用误区:

  • 依赖time.sleep()做固定时长等待,无法保证点击后页面/DOM已经完成更新,很多时候设定的等待时长到了页面还没加载完,此时取page_source自然拿到的是旧内容。
  • 没有判断点击后的页面行为:部分“下一页”按钮默认会触发新标签页打开,driver不会自动切换到新标签上下文,始终停留在旧页面;还有部分页面是AJAX局部刷新,不会触发整页重载,等待整页加载的逻辑完全无效。
    另外你代码里用的find_element_by_xpath是Selenium旧版本的废弃API,高版本运行会直接报错,建议替换为find_element(By.XPATH, 路径)的标准写法。
正确获取新页面源码的方案

按以下步骤排查实现,稳定性远高于固定时长等待:

  1. 先判断是否打开了新标签页
    点击后先检查窗口句柄数量,如果存在新标签,手动切换到最新标签页再做后续操作:
from selenium.webdriver.common.by import By

# 点击下一页按钮
browser.find_element(By.XPATH, btn_xpath).click()
# 检查窗口句柄,存在新标签就切换到最新打开的标签
if len(browser.window_handles) > 1:
    browser.switch_to.window(browser.window_handles[-1])
  1. 用显式等待替代固定sleep,等页面状态符合预期再取源码
    不要靠猜测设置等待时长,用Selenium内置的WebDriverWait做轮询判断:先确认已经离开旧页面,再确认新页面的标志性元素加载完成,此时DOM已经更新完毕,取到的page_source就是新页面内容:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser.get(origin_page_url)
# 提前定义旧页面独有的定位标识、新页面独有的定位标识,比如当前页码元素
old_page_locator = (By.XPATH, '//span[@class="page-num" and text()="1"]')
new_page_locator = (By.XPATH, '//span[@class="page-num" and text()="2"]')

browser.find_element(By.XPATH, btn_xpath).click()

# 最多等10秒,直到旧页面的标识元素消失,确认已离开原页面
WebDriverWait(browser, 10).until_not(EC.presence_of_element_located(old_page_locator))
# 最多等10秒,直到新页面的标识元素出现,确认新页DOM加载完成
WebDriverWait(browser, 10).until(EC.presence_of_element_located(new_page_locator))

# 此时获取的就是跳转后的新页面源码
new_source = browser.page_source
  1. 针对AJAX局部刷新场景
    如果点击下一页后浏览器地址栏没有变化,只是列表区域局部刷新,不需要判断页面跳转,直接等新的列表内容元素加载完成,再取page_source即可。

调试小技巧:取源码前可以先打印browser.current_url确认当前driver所在的页面地址是否符合预期,快速定位上下文没切换、跳转失败类问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:39:38