如何使用 Python 和 Selenium 通过 cookie 协议页面?

问题描述

我对 selenium 和 python 很陌生。我正在尝试浏览网页 (https://www.heise.de/download/),但无法通过 cookiewall(cookie 协议页面)。 好像是 webdriver 找不到要点击的按钮。

HTML 代码

<button type="button" backgroundcolor="[object Object]" data-testid="uc-accept-all-button" fullwidth="true" class="sc-bdnylx fmRkNf">Alles akzeptieren</button>

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import webdriverwait
from selenium.webdriver.support import expected_conditions as EC

# Using Firefox to access web
driver = webdriver.Firefox(executable_path=r'C:\Users\aphro\Anaconda3\geckodriver.exe')

# Open the website
driver.get('https://www.heise.de/download/')
sleep(5)
if driver.find_element_by_xpath('//*[@id="usercentrics-root"]'):
    print("found popup window")

# find button class
wait = webdriverwait(driver,10)
element = wait.until(EC.element_to_be_clickable((By.XPATH,'//div[@class="sc-bdnylx fmRkNf"]')))
element.click()

错误信息:

Traceback (most recent call last):
  File "<input>",line 1,in <module>
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2020.1.1\plugins\python-ce\helpers\pydev\_pydev_bundle\pydev_umd.py",line 197,in runfile
    pydev_imports.execfile(filename,global_vars,local_vars)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2020.1.1\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py",line 18,in execfile
    exec(compile(contents+"\n",file,'exec'),glob,loc)
  File "C:/Users/aphro/PycharmProjects/SoftwareProject/SoftwareProject/webControl.py",in <module>
    x = webdriverwait(driver,10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"div[data-testid='uc-accept-all-button'][role='button']"))).click()
  File "C:\Users\aphro\AppData\Roaming\Python\python38\site-packages\selenium\webdriver\support\wait.py",line 80,in until
    raise TimeoutException(message,screen,stacktrace)
selenium.common.exceptions.TimeoutException: Message: 


我尝试了不同的方法包括 CSS Selector 和 XPATH。 我使用 Python 3.8 和 Selenium 3.141。

谁能为我指出如何绕过此 cookiewall(人为“单击”按钮)并转到实际网页的正确方向?

解决方法

元素 Alles akzeptieren#shadow-root (open) 内。

Alles


解决方案

要点击Alles akzeptieren,您必须使用shadowRoot.querySelector(),您可以使用以下Locator Strategy

  • 代码块:

    driver.get("https://www.heise.de/download/")
    time.sleep(5)
    element = driver.execute_script("""return document.querySelector('#usercentrics-root').shadowRoot.querySelector('footer div div div button[data-testid="uc-accept-all-button"]')""")
    element.click()
    
  • 浏览器快照:

heise


参考文献

您可以在以下位置找到一些相关讨论: