Selenium自动化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
相关产品推荐
相关产品推荐

