Python使用Selenium点击跳转同标签页新页面后如何获取新页面源码
问题原因
出现该问题核心是两个常见使用误区:
- 依赖
time.sleep()做固定时长等待,无法保证点击后页面/DOM已经完成更新,很多时候设定的等待时长到了页面还没加载完,此时取page_source自然拿到的是旧内容。 - 没有判断点击后的页面行为:部分“下一页”按钮默认会触发新标签页打开,driver不会自动切换到新标签上下文,始终停留在旧页面;还有部分页面是AJAX局部刷新,不会触发整页重载,等待整页加载的逻辑完全无效。
另外你代码里用的find_element_by_xpath是Selenium旧版本的废弃API,高版本运行会直接报错,建议替换为find_element(By.XPATH, 路径)的标准写法。
正确获取新页面源码的方案
按以下步骤排查实现,稳定性远高于固定时长等待:
- 先判断是否打开了新标签页
点击后先检查窗口句柄数量,如果存在新标签,手动切换到最新标签页再做后续操作:
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])
- 用显式等待替代固定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
- 针对AJAX局部刷新场景
如果点击下一页后浏览器地址栏没有变化,只是列表区域局部刷新,不需要判断页面跳转,直接等新的列表内容元素加载完成,再取page_source即可。
调试小技巧:取源码前可以先打印
browser.current_url确认当前driver所在的页面地址是否符合预期,快速定位上下文没切换、跳转失败类问题。
内容的提问来源于stack exchange,提问作者Lisen
相关产品推荐
相关产品推荐

