我正在尝试在 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()
我还查看了相关主题的其他解决方案,但它们对我不起作用。
你的按钮放在
shadow-root
里面,要获取内部影子根结构,你应该先获取它的主机,然后获取shadowRoot
属性。
当前示例中的影子主机是带有标签 div
的第一个元素。 (好像没有什么独特的属性)
get_shadow_root
函数使用JS执行器从主机获取影子根。
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))