You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium无法点击同意按钮求助:页面元素定位失败

问题:Selenium无法定位sreality.cz的授权同意按钮

我尝试爬取https://www.sreality.cz/网站,页面加载后会弹出同意授权窗口,手动点击「I agree」按钮后就能正常爬取,但用Selenium自动化时找不到这个按钮的元素,求解决。

我的代码

from selenium import webdriver

url = 'https://www.sreality.cz/'
driver = webdriver.Firefox()
driver.get(url)

print(driver.page_source)

页面源码输出

<html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Seznam.cz Consent</title>
    <script src="//h.seznam.cz/js/dot-small.js"></script>
    <script src="//h.seznam.cz/js/cmp2/scmp-consent.js"></script>
    <style>
      body {
        height: 100%;
        margin: 0;
        overflow: hidden;
      }

      div.scmp.scmp_Dialog-wrapper {
        background: none !important;
      }

      div.scmp_dialog-overlay {
        background-color: unset;
      }

      iframe#bg-iframe {
        height: 100vh;
        width: 100vw;
        pointer-events: none;
        -webkit-filter: blur(5px);
        filter: blur(5px);
      }
    </style>
  <style id="scmp-noscroll">.scmp-noscroll { height: 100vh; height: -webkit-fill-available; margin: 0; overflow: hidden; }</style></head>
  <body class="scmp-noscroll">
    <script>
      var backURLName = '$backUrl';

      function getCookie (cName) {
        var name = cName + '=';
        var cookies = decodeURIComponent(document.cookie);
        var allCookies = cookies.split(';');
        var len = allCookies.length;

        for (var i = 0; i < len; i++) {
          var c = allCookies[i];
          while (c.charAt(0) === ' ') {
            c = c.substring(1);
          }
          if (c.indexOf(name) === 0) {
            return c.substring(name.length);
          }
        }
        return null;
      }

      var backURL = getCookie(backURLName);

      if (backURL) {
        var iframe = document.createElement('iframe');

        iframe.setAttribute('src', backURL);
        iframe.setAttribute('id', 'bg-iframe');
        iframe.setAttribute('sandbox', '');
        iframe.setAttribute('frameborder', '0');

        document.body.appendChild(iframe);
      }
    </script>
  

<iframe src="https://h.seznam.cz/html/cmp.html?v=2.292.0" style="border: 0px none; display: none;"></iframe><div class="szn-cmp-dialog-container" style="margin: unset; padding: unset; width: unset; height: 100%;"></div></body></html>

浏览器显示效果

浏览器中的同意窗口


解决方案

问题原因

从页面源码可以看到,这个授权弹窗是嵌入在独立iframe中的(对应代码里的<iframe src="https://h.seznam.cz/html/cmp.html?v=2.292.0">)。Selenium默认只会在主页面的DOM结构中查找元素,直接定位自然找不到iframe内的按钮。

解决步骤

要操作iframe内的元素,必须先切换到该iframe的上下文,完成操作后再切回主页面(如果需要继续操作主站元素):

  1. 等待iframe加载完成,避免因网络延迟导致元素未就绪
  2. 切换到目标iframe
  3. 定位并点击「I agree」按钮
  4. 切回主页面(可选,根据后续操作需求)

修改后的代码

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

url = 'https://www.sreality.cz/'
driver = webdriver.Firefox()
driver.get(url)

try:
    # 等待授权弹窗的iframe加载完成,并切换到该iframe
    consent_iframe = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'iframe[src*="cmp.html"]'))
    )
    driver.switch_to.frame(consent_iframe)

    # 等待「I agree」按钮可点击并执行点击操作
    agree_btn = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//button[contains(text(), "I agree")]'))
    )
    agree_btn.click()

    # 切回主页面(若后续需要操作主站元素则保留)
    driver.switch_to.default_content()

    # 此时可以正常获取页面内容
    print(driver.page_source)
finally:
    # 操作完成后关闭浏览器
    driver.quit()

注意事项

  • 优先使用显式等待(WebDriverWait)而非强制等待(time.sleep()),能更好地适配网络波动情况
  • 如果按钮的文本或选择器发生变化,可以通过浏览器开发者工具查看iframe内的DOM结构,调整定位方式(比如用按钮的class属性定位)

内容的提问来源于stack exchange,提问作者polTo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:47:49