惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
NISL@THU
NISL@THU
E
Exploit-DB.com RSS Feed
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
K
Kaspersky official blog
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
S
Schneier on Security
G
GRAHAM CLULEY
The Hacker News
The Hacker News
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
T
Tor Project blog
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
爱范儿
爱范儿
P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
S
Securelist
G
Google Developers Blog
The Last Watchdog
The Last Watchdog
Google Online Security Blog
Google Online Security Blog
美团技术团队
F
Fortinet All Blogs
小众软件
小众软件
Recorded Future
Recorded Future
V
Visual Studio Blog
B
Blog RSS Feed
H
Help Net Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
Latest news
Latest news
Spread Privacy
Spread Privacy
H
Heimdal Security Blog

博客园 - 小海海宁宁

从0到1:使用Schemathesis搭建API自动化测试框架实战 OpenAPI规范及自动化用例生成 自动化平台质量体系建设(草稿) 【模板】邮件提测模板 研发测试质量规范(草稿) 自动化框架 - Q&A 自动化框架 - 核心模块使用指南 - Kafka 自动化框架 - 核心模块使用指南 - Kibana 自动化框架 - 核心模块使用指南 - Playwright 自动化框架 - 核心模块使用指南 - API 自动化框架 - 核心功能使用指南 - 动态值生成 自动化框架 - 核心功能使用指南 - 数据处理模块 自动化框架 - 核心功能使用指南 - 数据校验模块 自动化框架 - 核心功能使用指南 - 上下文值传递 自动化框架 - 核心功能使用指南 - 用例过滤Tag使用 自动化框架 - 核心功能使用指南 - Excel测试用例编写 自动化框架 - 核心功能使用指南 - 配置文件使用指南 自动化框架使用说明 - 快速开始 Kibana如何添加可视化看板
playwright & selenium对Shadow DOM的处理
小海海宁宁 · 2026-03-09 · via 博客园 - 小海海宁宁

Shadow DOM 的类型

1. open 模式(你遇到的是这种)

const shadow = element.shadowRoot;  

2. closed 模式

const shadow = element.shadowRoot;  

为什么你的 Playwright 代码能工作?

为什么 XPath 不行?

如何识别 Shadow DOM?

在 Chrome 开发者工具中:

  1. 看到 #shadow-root 就表示有 Shadow DOM

<my-component>
    ▼ #shadow-root (open)
        <div class="internal">内容</div>
    <div class="external">外部内容</div>
</my-component>
  1. 元素面板中会有特殊的标记

    • #shadow-root 条目

    • 灰色背景的区域

操作 Shadow DOM 的方法

1. Playwright(最简单)

2. Selenium(需要 JavaScript)

3. JavaScript(原生)

总结

Shadow DOM = 网页组件的小黑盒 🔲

  • ✅ 优点:隔离、封装、可复用

  • ❌ 缺点:外部访问需要特殊方法

  • 🔑 关键:需要工具/框架支持才能方便操作

这就是为什么你的 Playwright 代码能工作,而普通的 XPath 不行——因为 Playwright 内置了打开这个"小黑盒"的能力!

selector="button:has-text('版本') >> nth=0" 能工作?

1. Playwright 的 Selector 引擎穿透 Shadow DOM

Playwright 的 selector 语法内置了对 Shadow DOM 的支持!当你在 Playwright 中使用 CSS 选择器时,它会自动穿透 Shadow DOM 边界。

2. :has-text() 伪类

这是 Playwright 特有的伪类,可以在任何元素上根据文本内容匹配:

  • :has-text('版本') 匹配任何包含"版本"文本的元素

  • 比 XPath 的 contains(text(),'版本') 更强大

3. >> 组合器

Playwright 的 >> 是一个强大的组合器,可以:

  • 穿透 Shadow DOM 边界

  • 组合不同的选择器策略

  • 在 iframe 之间导航

4. nth=0 索引

选择匹配到的第0个(第一个)元素,避免多个匹配的问题。

Playwright Selector 方式

Playwright Selector 的强大特性


为什么 XPath 不行?

XPath 是 DOM 级别的方法,无法自动穿透 Shadow DOM:

Playwright Selector 完整示例

总结

Playwright Selector 能工作的原因是:

  1. 内置 Shadow DOM 穿透 - 不需要手动处理

  2. 丰富的伪类 - :has-text():visible 等

  3. 强大的组合器 - >> 可以链式定位

  4. 自动等待 - Playwright 会自动等待元素出现

这就是为什么简单的 button:has-text('版本') 比复杂的 JavaScript 遍历更有效!

如果是 Selenium,处理 Shadow DOM 就需要一些技巧了。Selenium 不像 Playwright 那样内置 Shadow DOM 穿透功能,需要手动处理。

Selenium 处理 Shadow DOM 的几种方法

方法1:通过 JavaScript 获取 Shadow Root(最常用)

方法2:纯 JavaScript 执行

方法3:封装通用的 Shadow DOM 查找函数

方法4:使用第三方库 shadow-automation

总结

Selenium 处理 Shadow DOM 的要点:

  1. 必须通过 JavaScript 才能访问 shadow root

  2. 不能直接使用 XPath 定位 shadow DOM 内的元素

  3. 需要手动遍历 shadow hosts

  4. 最可靠的方法是执行完整的 JavaScript 脚本

相比之下,Playwright 在这方面确实更强大,内置了 Shadow DOM 支持!