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

Python Selenium穿透shadow root实现文件上传失败问题求解

Selenium 穿透Shadow DOM实现文件上传方案

问题背景

使用Selenium搭配chromedriver实现网站文件上传时,常规通过id、XPath定位fileInput元素的逻辑失效,调用send_keys传入文件路径无响应,核心原因是目标文件上传输入框位于Shadow DOM内部,常规DOM定位方法无法穿透Shadow DOM边界。
相关页面元素审查参考:
元素审查截图
初始失效代码:

input=browser.find_element_by_id('fileInput')
input.send_keys('C:\\picture\\run.gif')

提示:Selenium 4及以上版本已废弃find_element_by_id这类旧定位语法,建议使用find_element(By.ID, 'id值')的新写法,使用前需导入from selenium.webdriver.common.by import By。

实现步骤

Shadow DOM是独立于主文档的封闭DOM树,需要先获取Shadow根节点,再在根节点范围内定位目标元素:

  • 定位Shadow Root对应的宿主元素(即包裹上传组件的自定义标签元素,可根据实际页面DOM结构调整定位规则)
  • 获取宿主元素下的Shadow根节点
  • 在Shadow根节点范围内定位id为fileInput的上传输入框
  • 对输入框调用send_keys,传入本地文件的绝对路径完成上传

可运行参考代码

Selenium 4+ 原生写法

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
# 替换为实际目标页面地址
browser.get("目标页面URL")

# 定位Shadow DOM宿主元素,根据实际页面标签替换CSS选择器
shadow_host = browser.find_element(By.CSS_SELECTOR, "自定义上传组件标签名")
# 获取Shadow根节点
shadow_root = shadow_host.shadow_root
# 在Shadow DOM内定位文件上传输入框
file_input = shadow_root.find_element(By.ID, "fileInput")
# 传入文件绝对路径完成上传
file_input.send_keys("C:\\picture\\run.gif")

低版本Selenium兼容写法(<4.0)

低版本Selenium无原生shadow_root属性,可通过执行JS脚本获取Shadow根节点:

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get("目标页面URL")

shadow_host = browser.find_element(By.CSS_SELECTOR, "自定义上传组件标签名")
# 通过JS获取Shadow根节点
shadow_root = browser.execute_script("return arguments[0].shadowRoot", shadow_host)
file_input = shadow_root.find_element(By.ID, "fileInput")
file_input.send_keys("C:\\picture\\run.gif")

注意事项

  • 若存在多层嵌套Shadow DOM,需要逐层执行获取shadow_root的逻辑,直到定位到最内层的fileInput元素
  • 传入的文件路径必须为本地绝对路径,尽量避免路径中包含中文、特殊空格,防止转义失败
  • 不要尝试模拟点击上传按钮选择系统文件的交互,直接对type为file的input元素传入路径是Selenium上传文件的最稳定方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:36:29