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

Selenium如何获取#shadow-root(open)中注释下方的元素?

解决Selenium定位多层Shadow Root内目标元素的问题

问题原因

你当前的代码虽然能定位到外层容器div,但只拿到注释,大概率是目标元素还未完全渲染,或者链式querySelector的方式没有直接定位到目标节点,导致innerHTML只返回了已加载的注释部分。

解决方案

直接在JavaScript脚本中精准定位目标元素<div class="w3m-card">,同时配合显式等待确保元素已加载完成:

方法1:直接在Shadow Root内定位目标元素

修改execute_script的脚本,直接从w3m-modal的shadow root中查找.w3m-card:

# 直接定位目标元素
target_element = driver.execute_script("""
return document.querySelector('w3m-modal').shadowRoot.querySelector('.w3m-card');
""")

# 打印目标元素的innerHTML
print(target_element.get_attribute('innerHTML'))

方法2:配合显式等待(更可靠)

如果元素是动态加载的,加上显式等待确保元素存在后再获取:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 自定义条件:等待Shadow Root内的目标元素出现
def wait_for_shadow_element(driver, shadow_host_selector, target_selector):
    return WebDriverWait(driver, 10).until(
        lambda d: d.execute_script(f"""
            const host = document.querySelector('{shadow_host_selector}');
            return host && host.shadowRoot.querySelector('{target_selector}');
        """)
    )

# 使用等待函数获取目标元素
w3m_card = wait_for_shadow_element(driver, 'w3m-modal', '.w3m-card')
print(w3m_card.get_attribute('innerHTML'))

说明

  • 直接定位目标元素避免了链式querySelector可能带来的路径误差,同时确保你直接拿到需要的节点。
  • 显式等待解决了动态渲染导致的元素未加载问题,提升代码稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:52:54