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

