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

Selenium如何切换到新打开标签页实现截图或打印为PDF

问题解决核心逻辑

Selenium所有页面操作默认只作用于当前激活的标签页,点击链接打开新标签页后驱动不会自动切换上下文,必须通过窗口句柄完成新标签页的导航,操作流程如下:

  • 打开初始页面时先保存当前标签页的窗口句柄,作为原页面标识
  • 点击链接触发新标签页打开
  • 等待新标签页创建完成,获取当前浏览器所有窗口的句柄列表
  • 从句柄列表中排除原页面句柄,切换到新标签页对应的句柄
  • 切换完成后即可正常执行截图、导出PDF等操作,操作结束后可按需切回原标签页
完整实现代码
from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = Options()
# options.headless = True  # 无头模式可按需开启
with Firefox(options=options) as driver:
    driver.get('替换为你的目标站点地址')
    # 保存初始标签页句柄
    original_window = driver.current_window_handle
    
    # 定位会打开新标签页的链接并点击,替换为你实际的元素定位逻辑
    new_tab_link = driver.find_element(By.CSS_SELECTOR, 'a[target="_blank"]')
    new_tab_link.click()

    # 等待新标签页打开,确认窗口总数变为2
    WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
    
    # 遍历所有窗口句柄,切换到新打开的标签页
    for win_handle in driver.window_handles:
        if win_handle != original_window:
            driver.switch_to.window(win_handle)
            break
    
    # 等待新页面DOM加载完成
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'html')))

    # 新标签页整页截图
    page_root = driver.find_element(By.TAG_NAME, 'html')
    page_root.screenshot('new_tab_fullpage.png')
    # 也可直接调用火狐驱动自带的整页截图接口:driver.save_full_page_screenshot('new_tab_fullpage.png')

    # 新标签页导出为PDF
    pdf_data = driver.print_page()
    with open('new_tab_print.pdf', 'wb') as pdf_file:
        pdf_file.write(pdf_data)

    # 如需切回原标签页,执行下行代码即可
    # driver.switch_to.window(original_window)
注意事项
  • 尽量避免使用固定时长的time.sleep()做硬等待,优先使用显式等待判断窗口数量、元素加载状态,防止页面加载速度波动导致脚本报错
  • 如果单次点击会触发多个新标签页打开,只需要按顺序记录已处理的窗口句柄,遍历句柄列表时排除所有已记录的句柄,即可逐个导航到每个新标签页
  • print_page()是GeckoDriver(火狐驱动)、ChromeDriver原生支持的接口,默认输出A4规格的PDF二进制数据,不需要额外配置浏览器打印参数
  • Selenium 4已正式废弃find_element_by_tag_name这类旧版定位接口,统一使用find_element(By.定位方式, 定位表达式)的写法,兼容性更好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:31:03