<p>这是因为按钮和“弹出窗口”本身位于<code>iframe</code>内:</p>
<p><a href="https://i.stack.imgur.com/4yJvj.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/4yJvj.png" alt="frame"/></a></p>
<p>在查找并单击按钮之前,您需要<a href="https://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.switch_to" rel="nofollow noreferrer">switch to it</a>:</p>
<pre><code># switch to frame
frame = browser.find_element_by_css_selector("iframe[id^=sp_message_iframe]")
browser.switch_to.frame(frame)
# click the button
button = browser.find_element_by_css_selector("button.message-button.button-responsive-primary")
button.click()
# switch back to the default context
browser.switch_to.default_content()
</code></pre>
<hr/>
<p>请注意,您可能需要<a href="https://selenium-python.readthedocs.io/waits.html" rel="nofollow noreferrer">explicitly wait</a>才能显示框架,以允许页面时间在框架中加载和显示对话框:</p>
<pre><code>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
browser = webdriver.Firefox(executable_path='./geckodriver')
browser.get("https://www.finanzen.net/")
wait = WebDriverWait(browser, 10)
# switch to frame
frame = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, "iframe[id^=sp_message_iframe]"))
)
browser.switch_to.frame(frame)
# click the button
button = browser.find_element_by_css_selector("button.message-button.button-responsive-primary")
button.click()
# switch back to the default context
browser.switch_to.default_content()
</code></pre>