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

Selenium自动化immobilienscout24网站时Cookie弹窗点击超时问题求助

如何关闭immobilienscout24网站的Cookie弹窗?

问题描述

尝试自动化immobilienscout24 Atlas网站时,原代码无法定位并点击Cookie弹窗的"接受全部"按钮,触发Selenium的TimeoutException。

原代码如下:

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
import os
from webdriver_manager.chrome import ChromeDriverManager

if __name__ == '__main__':    
  print(f"Checking Browser driver...")
  os.environ['WDM_LOG'] = '0' 
  options = Options()
  options.add_argument("start-maximized")
  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(ChromeDriverManager().install())
  driver = webdriver.Chrome (service=srv, options=options)    
  waitWD = WebDriverWait (driver, 10)         
  
  link = f"https://atlas.immobilienscout24.de/" 
  driver.get (link)   
  driver.execute_script("arguments[0].click();", waitWD.until(EC.element_to_be_clickable((By.XPATH, '//button[@data-testid="uc-accept-all-button"]'))))          
  input("Press!")

触发的错误信息:

$ python test.py
Checking Browser driver...
Traceback (most recent call last):
  File "G:\DEV\Fiverr\TRY\mapesix\test.py", line 26, in <module>
    driver.execute_script("arguments[0].click();", waitWD.until(EC.element_to_be_clickable((By.XPATH, '//button[@data-testid="uc-accept-all-button"]'))))
  File "G:\DEV\.venv\selenium\lib\site-packages\selenium\webdriver\support\wait.py", line 90, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:
Stacktrace:
Backtrace:
        (No symbol) [0x00DB37D3]
        (No symbol) [0x00D48B81]
        (No symbol) [0x00C4B36D]
        (No symbol) [0x00C7D382]
        (No symbol) [0x00C7D4BB]
        (No symbol) [0x00CB3302]
        (No symbol) [0x00C9B464]
        (No symbol) [0x00CB1215]
        (No symbol) [0x00C9B216]
        (No symbol) [0x00C70D97]
        (No symbol) [0x00C7253D]
        GetHandleVerifier [0x0102ABF2+2510930]
        GetHandleVerifier [0x01058EC1+2700065]
        GetHandleVerifier [0x0105C86C+2714828]
        GetHandleVerifier [0x00E63480+645344]
        (No symbol) [0x00D50FD2]
        (No symbol) [0x00D56C68]
        (No symbol) [0x00D56D4B]
        (No symbol) [0x00D60D6B]
        BaseThreadInitThunk [0x766500F9+25]
        RtlGetAppContainerNamedObjectPath [0x77C27BBE+286]
        RtlGetAppContainerNamedObjectPath [0x77C27B8E+238]

解决方案

1. 修正元素定位器

网站的Cookie按钮data-testid可能已变更,可通过德语按钮文本或aria-label属性定位:

  • 按文本定位XPATH://button[contains(text(), "Alle akzeptieren")]
  • 按aria-label定位XPATH://button[@aria-label="Alle akzeptieren"]

2. 调整等待条件

将等待从"可点击"改为"元素可见",确保弹窗完全加载:

accept_btn = waitWD.until(EC.visibility_of_element_located((By.XPATH, '//button[contains(text(), "Alle akzeptieren")]')))
accept_btn.click()

3. 处理iframe包裹的弹窗

部分网站会将Cookie弹窗放在iframe中,需先切换到iframe再操作:

# 等待并切换到Cookie弹窗所在iframe
iframe = waitWD.until(EC.presence_of_element_located((By.XPATH, '//iframe[contains(@title, "Cookie")]')))
driver.switch_to.frame(iframe)

# 点击接受按钮
accept_btn = waitWD.until(EC.element_to_be_clickable((By.XPATH, '//button[contains(text(), "Alle akzeptieren")]')))
accept_btn.click()

# 切回主页面
driver.switch_to.default_content()

4. 提前设置Cookie绕过弹窗

直接添加网站认可的Cookie值,避免弹窗出现:

driver.get("https://atlas.immobilienscout24.de/")
# 添加Cookie示例,需根据实际值调整
driver.add_cookie({"name": "CookieConsent", "value": "true", "domain": ".immobilienscout24.de"})
driver.refresh()

修改后的完整代码示例

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
import os
from webdriver_manager.chrome import ChromeDriverManager

if __name__ == '__main__':    
  print(f"Checking Browser driver...")
  os.environ['WDM_LOG'] = '0' 
  options = Options()
  options.add_argument("start-maximized")
  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(ChromeDriverManager().install())
  driver = webdriver.Chrome(service=srv, options=options)    
  waitWD = WebDriverWait(driver, 15) # 延长等待时间至15秒
         
  link = "https://atlas.immobilienscout24.de/" 
  driver.get(link)   

  try:
      # 尝试直接定位按钮
      accept_btn = waitWD.until(EC.visibility_of_element_located((By.XPATH, '//button[contains(text(), "Alle akzeptieren")]')))
      accept_btn.click()
  except:
      # 定位失败则检查iframe
      try:
          iframe = waitWD.until(EC.presence_of_element_located((By.XPATH, '//iframe[contains(@title, "Cookie")]')))
          driver.switch_to.frame(iframe)
          accept_btn = waitWD.until(EC.element_to_be_clickable((By.XPATH, '//button[contains(text(), "Alle akzeptieren")]')))
          accept_btn.click()
          driver.switch_to.default_content()
      except Exception as e:
          print(f"处理Cookie弹窗失败: {e}")

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:34:59