使用Python的Selenium处理Loterie.lu网站Cookie弹窗问题
问题背景
爬取站点https://www.loterie.lu/content/portal/fr/playnow/lotto/results.html时,原操作日期选择框的代码:
WebDriverWait(driver, 9).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="queryDateMonth"]'))).click() WebDriverWait(driver, 9).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="queryDateMonth"]'))).send_keys(month)
因网站新增Cookiebot弹窗,频繁出现元素被遮挡的错误。尝试以下方法均无效:
- 点击接受Cookie按钮,提示无法滚动到元素(已最大化窗口):
WebDriverWait(driver, 9).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll"]'))).click() - 尝试处理alert,确认弹窗并非alert:
WebDriverWait(driver, 9).until(EC.alert_is_present()) driver.switch_to.alert.accept() - 尝试切换到iframe(按索引定位),无效果:
WebDriverWait(driver, 9).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, '/html/body/iframe[2]')))
解决思路
1. 强制滚动+JS点击
跳过Selenium自带的滚动判定,手动用JS将元素滚动到视野内,再触发点击:
cookie_btn = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll"))) # 强制滚动到元素位置 driver.execute_script("arguments[0].scrollIntoView(true);", cookie_btn) # 用JS直接触发点击 driver.execute_script("arguments[0].click();", cookie_btn)
2. 精准定位Cookiebot的iframe
Cookiebot弹窗可能嵌套在专属iframe中,避免用索引定位,改用特征选择器:
# 等待并切换到Cookiebot的iframe WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[src*='cookiebot']"))) # 点击接受按钮 WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.ID, "CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll"))).click() # 切回主页面 driver.switch_to.default_content()
3. 浏览器层面屏蔽Cookie弹窗(推荐)
通过ChromeOptions配置,直接阻止Cookiebot脚本加载或自动接受Cookie:
from selenium.webdriver.chrome.options import Options chrome_options = Options() # 阻止Cookiebot域名加载 chrome_options.add_argument("--block-domain=cookiebot.com") # 或自动允许所有Cookie chrome_options.add_experimental_option("prefs", { "profile.default_content_setting_values.cookies": 1, "profile.cookie_controls_mode": 0 }) driver = webdriver.Chrome(options=chrome_options) driver.get("https://www.loterie.lu/content/portal/fr/playnow/lotto/results.html")
4. 延长弹窗等待时间
部分场景下弹窗加载慢于页面,延长等待时长并优先确认元素存在:
# 等待弹窗元素存在 WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.ID, "CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll"))) # 直接JS点击 cookie_btn = driver.find_element(By.ID, "CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll") driver.execute_script("arguments[0].click();", cookie_btn)
内容的提问来源于stack exchange,提问作者mirix
相关产品推荐
相关产品推荐

