使用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
相关产品推荐
相关产品推荐

