Python使用Selenium定位fischer.cz网站Cookie同意按钮失败如何解决
问题解决方案
核心原因
你遇到的定位失败是因为该网站的Cookie同意弹窗被封装在*Shadow DOM(影子DOM)*中,普通的Selenium元素定位方式无法直接穿透Shadow DOM访问内部节点,和你提到的flex标签无关。你之前尝试的Shadow DOM方案报错,是因为使用了前端框架动态生成的随机类名作为定位依据,这类类名每次网站部署都会变更,稳定性极差。
可运行代码
以下代码经过实测可正常定位并点击「全部接受」按钮:
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 # 初始化浏览器驱动,这里以Chrome为例 driver = webdriver.Chrome() driver.maximize_window() driver.get("https://fischer.cz") # 显式等待Shadow DOM的宿主元素加载完成 wait = WebDriverWait(driver, 15) shadow_host = wait.until(EC.presence_of_element_located((By.ID, "usercentrics-root"))) # 获取Shadow Root对象,Selenium 4.0+支持直接.shadow_root属性 # 如果是Selenium 3.x版本,替换为下面注释的代码 # shadow_root = driver.execute_script('return arguments[0].shadowRoot', shadow_host) shadow_root = shadow_host.shadow_root # 在Shadow Root内部用固定属性data-testid定位,稳定性远高于动态类名 accept_all_btn = shadow_root.find_element(By.CSS_SELECTOR, 'button[data-testid="uc-accept-all-button"]') accept_all_btn.click()
注意事项
- 不要使用
sc-gtsrHT ctrzIr这类随机生成的class名作为定位依据,避免网站更新后定位失效 - 该弹窗不属于浏览器原生alert,也没有嵌入iframe,不需要使用
switch_to.alert或switch_to.frame相关方法 - 推荐优先使用显式等待替换固定的
time.sleep,可大幅提升脚本执行效率和稳定性
内容的提问来源于stack exchange,提问作者KDK
相关产品推荐
相关产品推荐

