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

使用Selenium无法找到Shadow Root?如何点击其内部按钮?

如何点击Shadow Root内的按钮?

我尝试在某网站上找到Shadow Root并点击其中的按钮,使用了以下代码:

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

print(f"Checking Browser driver...")
options = Options()
options.add_argument("start-maximized")
options.add_argument('--log-level=3')  
options.add_experimental_option("prefs", {"profile.default_content_setting_values.notifications": 1})    
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument('--disable-blink-features=AutomationControlled') 
srv=Service()
driver = webdriver.Chrome (service=srv, options=options)     

link = "https://www.arbeitsagentur.de/jobsuche/suche?wo=Berlin&angebotsart=1&was=Gastronomie%20-%20Minijob&umkreis=50"
driver.get (link)   
time.sleep(5)
shadowHost = driver.find_element(By.XPATH,'//bahf-cd-modal[@class="modal-open sc-bahf-cd-modal-h sc-bahf-cd-modal-s hydrated"]')
shadowRoot = shadowHost.shadow_root
shadowRoot.find_element(By.CSS_SELECTOR, "button[data-testid='bahf-cookie-disclaimer-btn-alle']").click()    
input("Press!")

但始终遇到以下错误:

(selenium) C:\DEVNEU\Fiverr2025\TRY\hedifeki>python test.py
Checking Browser driver...
Press
Traceback (most recent call last):
  File "C:\DEVNEU\Fiverr2025\TRY\hedifeki\test.py", line 26, in <module>
    shadowHost = driver.find_element(By.XPATH,'//bahf-cd-modal[@class="modal-open sc-bahf-cd-modal-h sc-bahf-cd-modal-s hydrated"]')
  File "C:\DEVNEU\.venv\selenium\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 770, in find_element
    return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
           ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\DEVNEU\.venv\selenium\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 384, in execute
    self.error_handler.check_response(response)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
  File "C:\DEVNEU\.venv\selenium\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 232, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//bahf-cd-modal[@class="modal-open sc-bahf-cd-modal-h sc-bahf-cd-modal-s hydrated"]"}
  (Session info: chrome=136.0.7103.94); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
Stacktrace:
        GetHandleVerifier [0x00007FF732A4CF65+75717]
        GetHandleVerifier [0x00007FF732A4CFC0+75808]

解决方案

1. 替换固定等待为显式等待

time.sleep(5) 不可靠,页面加载完成时间不确定,改用WebDriverWait等待元素出现,确保元素加载完成后再操作。

2. 简化Shadow Host定位

不要依赖完整的class属性(可能动态变化),直接通过标签名定位,避免因class值更新导致定位失败。

3. 正确在Shadow Root内查找元素

使用Selenium的显式等待时,指定root=shadow_root,让查找范围限定在Shadow Root内部。

修改后的完整代码:

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

print(f"Checking Browser driver...")
options = Options()
options.add_argument("start-maximized")
options.add_argument('--log-level=3')  
options.add_experimental_option("prefs", {"profile.default_content_setting_values.notifications": 1})    
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_experimental_option('useAutomationExtension', False)
options.add_argument('--disable-blink-features=AutomationControlled') 
srv=Service()
driver = webdriver.Chrome(service=srv, options=options)     

link = "https://www.arbeitsagentur.de/jobsuche/suche?wo=Berlin&angebotsart=1&was=Gastronomie%20-%20Minijob&umkreis=50"
driver.get(link)   

# 显式等待Shadow Host出现,超时时间10秒
wait = WebDriverWait(driver, 10)
shadow_host = wait.until(EC.presence_of_element_located((By.TAG_NAME, "bahf-cd-modal")))

# 获取Shadow Root对象
shadow_root = shadow_host.shadow_root

# 在Shadow Root内等待按钮可点击并执行点击
accept_btn = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-testid='bahf-cookie-disclaimer-btn-alle']"), root=shadow_root))
accept_btn.click()

input("Press!")
driver.quit()

关键说明

  • 用By.TAG_NAME定位bahf-cd-modal比依赖完整class更稳定,避免前端动态更新class导致定位失败。
  • 显式等待能适配不同网络环境下的页面加载速度,比固定等待更可靠。
  • 指定root=shadow_root后,Selenium会直接在Shadow Root内部查找元素,无需额外遍历。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:33:20