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

Selenium处理Chrome打印页Shadow Root:选PDF并点击保存

解决Chrome打印预览页Shadow Root元素定位问题(Selenium + Python)

针对你遇到的Chrome打印预览页(recinfoprint.html)中Shadow DOM元素无法定位的问题,以下是可行的解决方案:

核心问题分析

Chrome 123版本的打印预览页面采用多层嵌套的Shadow DOM结构,常规Selenium定位方法无法穿透,必须逐层获取Shadow Root后再定位目标元素。

分步解决方案

1. 切换到打印预览新窗口

点击打印按钮后会打开新标签页,首先需要切换到该窗口:

# 获取所有窗口句柄,切换到最新打开的窗口
windows = driver.window_handles
driver.switch_to.window(windows[-1])

2. 封装Shadow Root获取方法

Selenium无法直接访问Shadow Root,需通过JavaScript执行获取:

def get_shadow_root(element):
    return driver.execute_script('return arguments[0].shadowRoot', element)

3. 逐层定位目标元素

按照打印预览页面的DOM嵌套结构,逐层获取Shadow Root并定位元素:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 等待print-preview-app元素加载完成
print_preview_app = WebDriverWait(driver, 20).until(
    EC.presence_of_element_located((By.TAG_NAME, 'print-preview-app'))
)

# 第一层Shadow Root:print-preview-app的shadow root
shadow_root1 = get_shadow_root(print_preview_app)

# 定位print-preview-sidebar并获取其Shadow Root
print_preview_sidebar = shadow_root1.find_element(By.TAG_NAME, 'print-preview-sidebar')
shadow_root2 = get_shadow_root(print_preview_sidebar)

# 点击下拉框展开选项
md_select = shadow_root2.find_element(By.CLASS_NAME, 'md-select')
md_select.click()

# 选择"Save as PDF"选项
md_option = shadow_root2.find_element(By.CSS_SELECTOR, 'md-option[value="Save as PDF/local/"]')
md_option.click()

# 定位保存按钮所在的print-preview-button-strip并获取其Shadow Root
print_preview_button_strip = shadow_root1.find_element(By.TAG_NAME, 'print-preview-button-strip')
shadow_root3 = get_shadow_root(print_preview_button_strip)

# 点击保存按钮
save_button = shadow_root3.find_element(By.CLASS_NAME, 'action-button')
save_button.click()

4. 优化方案:通过Chrome预设置跳过手动选择

可以在初始化ChromeDriver时配置偏好,默认选择"Save as PDF"并自动保存,避免手动操作Shadow DOM元素:

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_experimental_option('prefs', {
    # 设置默认下载路径
    'download.default_directory': '/your/save/path',
    'download.prompt_for_download': False,
    'download.directory_upgrade': True,
    # 自动保存PDF
    'printing.print_preview_sticky_settings.appState': '{"recentDestinations":[{"id":"Save as PDF","origin":"local","account":""}],"selectedDestinationId":"Save as PDF","version":2}'
})

# 初始化driver时传入配置
driver = webdriver.Chrome(options=chrome_options)

使用此配置后,打印预览会默认选中"Save as PDF",只需定位并点击保存按钮即可。

注意事项

  • 若Chrome版本更新导致DOM结构变化,可通过Chrome开发者工具的Elements面板查看Shadow Root嵌套关系,右键元素选择"Copy JS path"转换为Selenium定位逻辑。
  • 所有元素定位前需使用WebDriverWait等待元素加载,避免因页面未渲染完成导致的定位失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:55:21