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

如何用Selenium点击shadow-root(closed)内的可点击元素?

解决Closed Shadow Root内同意按钮的点击问题

你的代码无法点击按钮的核心原因是:该按钮处于Closed类型的Shadow Root中,Selenium的常规元素查找方法(如find_element_by_css_selector)无法穿透Closed Shadow Root访问内部元素,自然无法定位到按钮执行点击。

修改方案:使用JavaScript执行点击操作

由于Closed Shadow Root的封闭性,我们需要直接在浏览器上下文里通过JavaScript定位并点击按钮。以下是修改后的代码:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Chrome()
driver.implicitly_wait(20)

driver.get("https://www.sreality.cz/hledani/prodej/domy")

# 显式等待按钮加载完成(通过JS检测元素是否存在)
WebDriverWait(driver, 20).until(
    lambda d: d.execute_script("return document.querySelector('button[data-testid=\"button-agree\"]') !== null;")
)

# 通过JS执行点击操作
driver.execute_script("document.querySelector('button[data-testid=\"button-agree\"]').click();")

备选方案(遍历所有按钮匹配)

如果上述代码无法定位到按钮(比如Shadow Root层级较深),可以改用遍历页面所有按钮的方式,匹配目标元素后点击:

# 替换点击部分的代码
driver.execute_script("""
const allButtons = document.getElementsByTagName('button');
for (let btn of allButtons) {
    if (btn.getAttribute('data-testid') === 'button-agree') {
        btn.click();
        break;
    }
}
""")

说明

  1. Closed Shadow Root无法通过Selenium原生的元素定位方法访问,JavaScript执行是最可靠的解决方案——它运行在浏览器的页面上下文,能直接访问Shadow Root内部的元素。
  2. 显式等待的作用是确保按钮完全加载后再执行点击,避免因元素未渲染完成导致的失败。

内容的提问来源于stack exchange,提问作者Mr.Slow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:52:52