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

使用Selenium WebDriver点击博世官网Cookie同意按钮失败求助

解决Selenium定位博世保加利亚官网Cookie按钮失败的问题

问题详情

使用Python Selenium访问博世保加利亚官网(https://www.bosch-professional.com/bg/bg/)时,尝试点击“Приемане На Всички”(接受全部)Cookie按钮,触发NoSuchElementException,无法定位目标元素。

原代码

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

### Site options
options = Options()
options.add_argument("start-maximized")
options.add_experimental_option("detach", True)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
driver.get("https://www.bosch-professional.com/bg/bg/")
time.sleep(5)

### Click Accept Cookies
driver.find_element(By.XPATH, "/html/body/dock-privacy-settings//div/modal-view/bbg-dialog/div/bbg-box/div/div/div/div[5]/span/span/p[3]/bbg-button/button/div").click()

错误信息

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/dock-privacy-settings//div/modal-view/bbg-dialog/div/bbg-box/div/div/div/div[5]/span/span/p[3]/bbg-button/button/div"}

问题原因

  1. 绝对XPATH稳定性极差:使用从页面根节点出发的绝对路径,页面结构只要有微小变动(比如节点层级调整、新增元素),定位就会失效,完全依赖固定页面结构,不具备鲁棒性。
  2. 等待逻辑不合理:time.sleep(5)是固定时长等待,网络波动或页面渲染延迟可能导致弹窗还未加载完成就执行定位,或者元素已加载但未处于可点击状态。
  3. 元素可能在Shadow DOM中:页面的dock-privacy-settings是自定义Web组件,这类组件通常用Shadow DOM封装内部元素,常规Selenium定位方法无法直接访问Shadow DOM内的元素。

解决方案

方案1:相对定位+显式等待(优先尝试)

放弃绝对XPATH,改用基于按钮文本的相对定位,同时用Selenium显式等待确保元素加载完成且可点击:

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

options = Options()
options.add_argument("start-maximized")
options.add_experimental_option("detach", True)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
driver.get("https://www.bosch-professional.com/bg/bg/")

# 显式等待Cookie按钮可点击,最长等待10秒
wait = WebDriverWait(driver, 10)
accept_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Приемане На Всички')]")))
accept_btn.click()

方案2:处理Shadow DOM(方案1无效时使用)

如果Cookie弹窗元素在Shadow DOM内,需要先获取Shadow Root再定位元素:

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

options = Options()
options.add_argument("start-maximized")
options.add_experimental_option("detach", True)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
driver.get("https://www.bosch-professional.com/bg/bg/")

wait = WebDriverWait(driver, 10)
# 定位包含Shadow DOM的自定义元素
privacy_element = wait.until(EC.presence_of_element_located((By.TAG_NAME, "dock-privacy-settings")))
# 获取Shadow Root
shadow_root = driver.execute_script("return arguments[0].shadowRoot", privacy_element)

# 在Shadow Root内定位并点击按钮
accept_btn = shadow_root.find_element(By.XPATH, "//button[contains(text(), 'Приемане На Всички')]")
accept_btn.click()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 23:42:43