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

如何通过Selenium在Shadow DOM中修改Chrome本地PDF的页码?

搞定Chrome PDF预览页Shadow DOM下的页码修改问题

嘿,我太懂你这种找不到Shadow DOM里元素的头疼了!Chrome自带的PDF预览组件全靠Shadow DOM封装,常规的Selenium定位方法根本碰不到里面的元素。别慌,我给你一步步拆解怎么穿透这些层级,顺利修改页码:

1. 先拿到最外层的Shadow Root

Chrome打开PDF后,页面核心的预览组件是<pdf-viewer>标签,它就是第一个Shadow DOM的宿主。咱得先获取它的Shadow Root:

# 定位pdf-viewer元素,再用JS获取它的shadow root
pdf_viewer = driver.find_element(By.TAG_NAME, "pdf-viewer")
shadow_root_1 = driver.execute_script("return arguments[0].shadowRoot", pdf_viewer)

2. 再穿透工具栏的Shadow DOM

第一个Shadow Root里的工具栏容器#toolbarContainer,里面的<pdf-toolbar>标签又套了一层Shadow DOM,继续拿下它:

# 先找到toolbar容器里的pdf-toolbar,再取它的shadow root
pdf_toolbar = shadow_root_1.find_element(By.ID, "toolbarContainer").find_element(By.TAG_NAME, "pdf-toolbar")
shadow_root_2 = driver.execute_script("return arguments[0].shadowRoot", pdf_toolbar)

3. 定位页码框并修改内容

到这一步,终于能摸到页码输入框了!它的ID是#pageNumber,直接定位后就能修改数值,记得按回车确认跳转:

page_input = shadow_root_2.find_element(By.ID, "pageNumber")
page_input.clear()
page_input.send_keys("7")  # 换成你要跳的页码
page_input.send_keys(Keys.ENTER)  # 敲回车让页面跳转

完整可运行代码示例

把上面的步骤整合起来,给你一份直接能用的代码(记得替换成你自己的PDF路径):

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

# 初始化ChromeDriver
driver = webdriver.Chrome()
# 打开本地PDF,注意用file://协议,路径要对
driver.get("file:///C:/Users/xxx/Documents/your_file.pdf")

try:
    # 用显式等待确保元素加载完成,比隐式等待靠谱
    pdf_viewer = WebDriverWait(driver, 15).until(
        EC.presence_of_element_located((By.TAG_NAME, "pdf-viewer"))
    )
    shadow_root_1 = driver.execute_script("return arguments[0].shadowRoot", pdf_viewer)

    pdf_toolbar = WebDriverWait(shadow_root_1, 10).until(
        EC.presence_of_element_located((By.TAG_NAME, "pdf-toolbar"))
    )
    shadow_root_2 = driver.execute_script("return arguments[0].shadowRoot", pdf_toolbar)

    page_input = WebDriverWait(shadow_root_2, 10).until(
        EC.element_to_be_clickable((By.ID, "pageNumber"))
    )
    page_input.clear()
    target_page = "12"
    page_input.send_keys(target_page)
    page_input.send_keys(Keys.ENTER)

    print(f"完美!已经跳转到第{target_page}页啦")
except Exception as e:
    print(f"哎呀,出问题了:{str(e)}")
finally:
    # 按需关闭浏览器,调试的时候可以注释掉
    # driver.quit()
    pass

几个要注意的小细节

  • 版本兼容性:不同版本的Chrome可能微调PDF预览的DOM结构,如果定位失败,记得重新用开发者工具检查一下标签名和ID有没有变。
  • 显式等待必用:别依赖隐式等待,用WebDriverWait等待元素出现/可点击,能避免很多页面加载慢导致的报错。
  • 本地路径格式:Windows下的本地文件路径要写成file:///C:/...(三个斜杠),macOS/Linux是file:///home/...。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:32:18