我如何接受来自模态的基本cookie,这些cookie放置在使用selenium和firefox的网站上的shadow-root中?

问题描述 投票:0回答:1

我正在尝试在 Firefox 中使用 Selenium,以便它打开一个新窗口,然后单击“接受基本 cookies”按钮。使用检查模式,我得到以下属性: 内部 html:Nur erforderliche Cookies zulassen 外部 html:Nur erforderliche Cookies zulassen CSS 选择器:button.btn:nth-child(1) CSS-Pfad:div#consent-layer.consent-layer div.consent-layer__btn-container button.btn.btn--secondary.js-accept-essential-cookies XPATH:/div/div[2]/button[1]

到目前为止我所有的尝试都没有成功。这是一个例子:

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

# Initialize the WebDriver using GeckoDriver
driver = webdriver.Firefox()

url = 'https://www.bahn.de/reisen/view/verbindung/muenchen/hof.shtml'

# Navigate to the webpage
driver.get(url)

# Wait for the button to be clickable
button_xpath = "//button[@class='btn btn--secondary js-accept-essential-cookies']"
button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, button_xpath))
)

# Click the button
button.click()

# Close the browser
driver.quit()

我还查看了相关主题的其他解决方案,但它们对我不起作用。

python user-interface selenium-webdriver firefox cookies
1个回答
0
投票

你的按钮放在

shadow-root
里面,要获取内部影子根结构,你应该先获取它的主机,然后获取
shadowRoot
属性。

当前示例中的影子主机是带有标签

div

 的第一个元素。 (好像没有什么独特的属性)

get_shadow_root

函数使用JS执行器从主机获取影子根。

有关 Shadow DOM 的更多信息

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 driver = webdriver.Chrome() timeout = 10 wait = WebDriverWait(driver, timeout) def get_shadow_root(element): return driver.execute_script('return arguments[0].shadowRoot', element) driver.get("https://www.bahn.de/reisen/view/verbindung/muenchen/hof.shtml") driver.maximize_window() shadow_host = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'div'))) shadow_container = get_shadow_root(shadow_host) accept = WebDriverWait(shadow_container, timeout).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'button.js-accept-all-cookies'))) accept.click() wait.until(EC.invisibility_of_element(accept))
    
© www.soinside.com 2019 - 2024. All rights reserved.