【免费下载链接】ruyipage下一代Python的web自动化过检测框架AI自我调试运行trace日志可分析一切网页链路通过一切网站检测的Firefox指纹浏览器。RuyiPage is a Python-based Firefox automation framework built on the next-generation WebDriver BiDi protocol.项目地址https://gitcode.com/gh_mirrors/ru/ruyipage点击查看免费下载ruyiPage 是一个基于 Firefox WebDriver BiDi 的 Python 网页自动化框架它最大的差异化能力之一就是可以直接获取 closed shadow root 节点——标准 JS 的el.shadowRoot只能拿到 open 的 Shadow DOM而闭掉的 closed shadow root 一直是爬虫和自动化的深水区。本文带你用 3 种方式拿到 closed shadow root并覆盖 iframe 嵌套场景的完整用法。为什么 closed shadow root 这么难拿模式el.shadowRoot常规手段能访问吗open✅ 返回 ShadowRoot能closed❌ 返回null基本不能传统绕法通常要在页面里注入脚本、设置全局变量、探测页面桥接函数——这些行为本身就是自动化检测点在高风控站点很容易被识别。ruyiPage 走的是另一条路利用Firefox BiDi 的 privileged 序列化能力让浏览器内核在特权限层直接把元素连同一个 closed shadow root 一起序列化出来不向页面注入任何脚本不设置页面全局变量不探测页面桥接函数对应实现在 ruyipage/_elements/firefox_element.py 的closed_shadow_root属性中拿到返回结构里mode closed的shadowRoot节点后直接包装成一个可继续查找的子元素的FirefoxElement。获取 closed shadow root 的 3 种方式方式一with_shadow(closed)上下文管理器最推荐写法最简洁退出with块自动回到主页面上下文host page.ele(#host-closed-shadow) with host.with_shadow(closed) as closed_root: text closed_root.ele(#host-closed-text).textwith_shadow同时支持modeopen和modeclosed找不到时抛出明确异常。方式二closed_shadow_root属性需要判断“是否存在”时用属性更自然——元素没有 closed shadow root、或浏览器不支持时返回None而不是抛异常root page.ele(#host).closed_shadow_root if root is not None: print(root.ele(#inner-btn).text)方式三page.shadow_roots()批量扫描整个页面含 iframe不知道 closed shadow root 藏在哪时一次性扫出当前页面和所有子 frame 里的全部 shadow rootroots page.shadow_roots(modeall) # all / open / closed for root in roots: print(root._node_info.get(mode))两个实用参数modeclosed只要闭的过滤 openinclude_framesFalse只扫当前 browsing context不递归 iframe批量扫描的递归实现在 ruyipage/_pages/firefox_base.py它会对每个上下文做includeShadowTree: all的整树序列化并递归进入get_frames()返回的每一层 frame所以嵌套 iframe 里的 closed shadow root 也能被捞出来。iframe 中的 closed shadow root 怎么取先切进 iframe再取 shadow root两件事组合即可。with_frame用上下文管理器切换 frame退出后自动回到主页面无需手动管理上下文with page.with_frame(#outer-iframe) as frame: inner_host frame.ele(#inner-closed-host) with inner_host.with_shadow(closed) as closed_root: print(closed_root.ele(#inner-closed-text).text)with_frame支持三种定位方式CSS 选择器、index从 0 开始的序号、context_id见 ruyipage/_pages/firefox_base.py。 一个典型的真实场景Cloudflare Turnstile 验证的点击按钮就藏在 CF iframe 的 closed shadow root 里page.handle_cloudflare_challenge()就是靠“BiDi 查找 CF iframe 绕过 closed shadow root 限制触发点击”实现的见 ruyipage/_pages/firefox_base.py。实战示例打开官方复杂测试页项目自带一套“主机页 open/closed shadow 嵌套 iframe open/closed shadow”的测试页直接运行示例即可看到完整链路python examples/14_shadow_dom.py示例脚本examples/14_shadow_dom.py主测试页host open/closed shadow 外层 iframeexamples/test_pages/complex_shadow_iframe.html内层 iframe 测试页examples/test_pages/complex_inner_iframe.html示例覆盖 4 个关键点主页面 open shadow、主页面 closed shadowprivileged 通道、进 iframe 后的 open shadow、进 iframe 后的 closed shadow最后验证退出with_frame后主页面仍可正常访问。对应的行为验证可以阅读两个单元测试tests/features/test_closed_shadow_root.py验证走的是原生 privileged 序列化且函数声明中不含任何__ruyiGetClosedShadowRoot桥接函数tests/features/test_shadow_roots.py验证批量扫描会递归嵌套 frame、支持模式过滤、序列化不支持时优雅返回空列表不想手写访问链用 XPath Picker 一键生成不知道 closed shadow root 在哪、访问链怎么拼开启 XPath Picker点击页面任意元素浮窗会自动显示 XPath 并为 iframe、嵌套 iframe、open/closed shadow root 场景自动拼好访问链一键复制 ruyiPage 代码page launch(xpath_pickerTrue)推荐直接跑这个综合展示页覆盖普通元素、同源/嵌套 iframe、open/closed shadow root、复杂文本与 SVG 节点python examples/42_xpath_picker_complex_showcase.py常见问题 FAQQ1closed_shadow_root返回None是报错吗不是。三种情况会返回None元素根本没有 closed shadow root、元素只有 open root、当前 Firefox 不支持该序列化能力。这是设计好的降级行为不是异常。Q2异步版async/await怎么用安装pip install ruyiPage[async]后属性变成方法await ele.get_closed_shadow_root()/await ele.get_shadow_root()页面级批量扫描同样是await page.shadow_roots(modeall)见 ruyipage/_async/_generated.py。Q3会留下自动化痕迹吗不会。整个流程只有 BiDi 协议层的script.callFunction带serializationOptions页面内零注入、零全局变量这正是 ruyiPage 主打“无自动化检测点”的核心原因之一。相关文档与源码官方说明README.md元素级 APIruyipage/_elements/firefox_element.py页面级批量扫描ruyipage/_pages/firefox_base.py完整示例examples/14_shadow_dom.py掌握with_shadow(closed)、closed_shadow_root、shadow_roots()三件套配合with_frame切 iframeruyiPage 帮你把 Shadow DOM 深水区变成明水区 赞分享【免费下载链接】ruyipage下一代Python的web自动化过检测框架AI自我调试运行trace日志可分析一切网页链路通过一切网站检测的Firefox指纹浏览器。RuyiPage is a Python-based Firefox automation framework built on the next-generation WebDriver BiDi protocol.项目地址https://gitcode.com/gh_mirrors/ru/ruyipage点击查看免费下载相关推荐Puppeteer 如何用文本、ARIA、XPath 选择器与 Shadow DOM 组合定位元素Puppeteer 如何用文本、ARIA、XPath 选择器与 Shadow DOM 组合定位元素 写 Puppeteer 自动化脚本时经常会碰到 CSS 选浏览器控制测试网页爬虫开发工具Vimium Web组件自定义元素与Shadow DOM的应用Vimium Web组件自定义元素与Shadow DOM的应用 Vimium作为一款强大的浏览器扩展工具通过Web组件技术为用户提供了极致的键盘导航体验。本开发工具Shadow DOM终极指南如何实现完美的DOM封装与样式隔离Shadow DOM终极指南如何实现完美的DOM封装与样式隔离 在当今复杂的前端开发中样式冲突和DOM污染是开发者经常面临的挑战。 Shadow DOM文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考