使用显式等待在 Python 中使用 Selenium 弹出“接受 Cookie”
Posted
技术标签:
【中文标题】使用显式等待在 Python 中使用 Selenium 弹出“接受 Cookie”【英文标题】:"Accept Cookies" popup with Selenium in Python using explicit wait 【发布时间】:2022-01-09 18:03:16 【问题描述】:我一直在尝试使用 Python 中的 Selenium 从网站上抓取一些信息。我加载了网页,但我不能接受 cookie,这是继续所必需的。我曾尝试使用显式等待,因为我怀疑问题是在“接受”底部变得可点击之前加载了网页。
我的代码是:
import os
import until as until
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
os.environ['PATH'] += r"C:\Users\BackUp HDL\AppData\Local\Programs"
driver = webdriver.Chrome()
driver.get("https://watchmedier.dk/latest/filtered? sitesFilter=policywatch.dk&sitesFilter=shippingwatch.dk&sitesFilter=mobilitywatch.dk&sitesFilter=energiwatch.dk&sitesFilter=finanswatch.dk&sitesFilter=ejendomswatch.dk&sitesFilter=mediawatch.dk&sitesFilter=agriwatch.dk&sitesFilter=fodevarewatch.dk&sitesFilter=medwatch.dk&sitesFilter=kapwatch.dk&sitesFilter=itwatch.dk&sitesFilter=ctwatch.dk&sitesFilter=watchmedier.dk&sitesFilter=advokatwatch.dk")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="notice"]/div[3]/button[2]')))
driver.find_element_by_xpath('//*[@id="notice"]/div[3]/button[2]').click()
每当我尝试运行代码时,都会出现错误。有人可以帮帮我吗?
【问题讨论】:
【参考方案1】:元素 Accepter 在 <iframe>
内,因此您必须:
诱导WebDriverWait 使所需的帧可用并切换到它。
诱导WebDriverWait 使所需的元素可点击。
您可以使用以下任一Locator Strategies:
使用CSS_SELECTOR:
driver.get("https://watchmedier.dk/latest/filtered? sitesFilter=policywatch.dk&sitesFilter=shippingwatch.dk&sitesFilter=mobilitywatch.dk&sitesFilter=energiwatch.dk&sitesFilter=finanswatch.dk&sitesFilter=ejendomswatch.dk&sitesFilter=mediawatch.dk&sitesFilter=agriwatch.dk&sitesFilter=fodevarewatch.dk&sitesFilter=medwatch.dk&sitesFilter=kapwatch.dk&sitesFilter=itwatch.dk&sitesFilter=ctwatch.dk&sitesFilter=watchmedier.dk&sitesFilter=advokatwatch.dk")
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[title='SP Consent Message']")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[title='Accepter']"))).click()
使用XPATH:
driver.get("https://watchmedier.dk/latest/filtered? sitesFilter=policywatch.dk&sitesFilter=shippingwatch.dk&sitesFilter=mobilitywatch.dk&sitesFilter=energiwatch.dk&sitesFilter=finanswatch.dk&sitesFilter=ejendomswatch.dk&sitesFilter=mediawatch.dk&sitesFilter=agriwatch.dk&sitesFilter=fodevarewatch.dk&sitesFilter=medwatch.dk&sitesFilter=kapwatch.dk&sitesFilter=itwatch.dk&sitesFilter=ctwatch.dk&sitesFilter=watchmedier.dk&sitesFilter=advokatwatch.dk")
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@title='SP Consent Message']")))
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@title='Accepter']"))).click()
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
浏览器快照:
参考
您可以在以下位置找到一些相关讨论:
Ways to deal with #document under iframe Switch to an iframe through Selenium and python selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element while trying to click Next button with selenium selenium in python : NoSuchElementException: Message: no such element: Unable to locate element【讨论】:
非常感谢您的帮助。代码有效。现在我遇到了一个新问题,因为我对使用 Python 和 Selenium 完全陌生。我想,我的技术水平根本不足以以这种方式提取数据。你现在是否可以联系我寻求更多帮助的人,因为我需要我的主人的数据? 粗略的,欢迎在Selenium房间与我详细讨论。以上是关于使用显式等待在 Python 中使用 Selenium 弹出“接受 Cookie”的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中使用 Selenium 设置动态显式等待?
selenium-python显式等待和隐式等待的使用和区别
selenium.common.exceptions.ElementNotVisibleException:消息:元素不可交互,显式等待不能使用Selenium和Python
何时在 Selenium Webdriver 中使用显式等待与隐式等待?