【问题标题】:Message: element click intercepted: Element <span>...</span> is not clickable at point (657, 594). Other element would receive the click with Selenium消息:元素点击被拦截:元素 <span>...</span> 在点 (657, 594) 处不可点击。其他元素会收到 Selenium 的点击
【发布时间】:2021-04-17 20:38:50
【问题描述】:

我正在制作一个网络爬虫以从https://www.nvidia.com/en-us/shop/geforce/?page=1&limit=9&locale=en-us 获取 gpu 库存以获取 30 系列卡,为此我正在使用带有 bs4 和 selenium 的 python。

我想加载更多的购物项目,网站上有这个load more button。所以我抓住了它的类,让它让硒点击它:

driver.find_element_by_class_name("buy-link").click()

但它表示该元素在不可交互的 HTML 中用于按钮

它给我的确切错误是:

Message: element click intercepted: Element <span class="extra_style buy-link" data-color="#76b900" data-secondary-color="#fff" style="visibility: visible; cursor: pointer;" data-mpn-code="NVGFT070">...</span> is not clickable at point (657, 594). Other element would receive the click: <div class="popBg" id="nv-buy-now-model" style="display: block;">...</div>

我不太懂HTML,怎么实现点击这个按钮

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping webdriverwait


    【解决方案1】:

    LOAD MORE 元素是一个Angular 元素,因此要单击它,您需要为element_to_be_clickable() 诱导WebDriverWait,您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR

      driver.get("https://www.nvidia.com/en-us/shop/geforce/?page=1&limit=9&locale=en-us")
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div#cookiePolicy-btn-close>span"))).click()
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.buy-link.load-more-btn[value='LOAD MORE']"))).click()
      
    • 使用XPATH

      driver.get("https://www.nvidia.com/en-us/shop/geforce/?page=1&limit=9&locale=en-us")
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='cookiePolicy-btn-close']/span"))).click()
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='buy-link load-more-btn' and @value='LOAD MORE']"))).click()
      
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      
    • 浏览器快照:

    【讨论】:

    • Selenium 认为该元素是可点击的,这就是它尝试点击的原因。问题是途中有一个DIV。请参阅 OP 发布的错误消息。
    • 那不行,我不认为是等待时间,我认为元素本身是不可点击的
    • @JeffC 你错了,Selenium 无法思考,它既不是人类也不是人工智能机器人。该元素是一个 Angular 元素。所以底线是首先你必须了解基于角度的网站具体角度元素的行为,然后相应地使用 Selenium。
    • @KrypticCoconut 查看更新的答案并告诉我状态。
    • “Selenium thinks...”是拟人化的一个例子。 Angular 元素没有什么神奇之处……如果元素还没有准备好被点击,它会抛出一个不同的错误。这就是我的观点以及您以相同方式回答的其他答案。等待并不能解决这个问题......正如您现在已经多次看到并修改了您的答案。
    【解决方案2】:

    问题是该页面上有大约 20 个元素与您的第一个定位器 .find_element_by_class_name("buy-link") 匹配。在这种情况下,如果您使定位器更具体,您可以将其隔离为仅“加载更多”输入按钮。

    试试这个

    driver.find_element_by_css_selector("input.buy-link").click()
    

    添加等待通常是一个好习惯,除非您确定永远不需要它。

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 10)
    wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='CLOSE']")).click()
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.buy-link")).click()
    

    有关更多信息和详细信息,请参阅the docs

    【讨论】:

    • 我将课程改为load-more-btn,但没有用,所以我尝试了你的,同样的错误:\selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element &lt;input class="buy-link load-more-btn" type="button" value="LOAD MORE"&gt; is not clickable at point (464, 871). Other element would receive the click: &lt;div class="messageContainer fontSmall"&gt;...&lt;/div&gt;
    • 所以现在的问题是,当 Selenium 向下滚动以单击“加载更多”按钮时,该按钮最终位于 cookie 横幅下方,上面写着“此站点使用 cookie 将信息存储在您的计算机上。请参阅我们的cookie 政策,了解有关如何阻止 cookie 的更多详细信息。”单击横幅上的 CLOSE 后,该按钮应显示并可单击。我已经更新了代码,它在我的机器上成功运行了。
    • @JeffC 再次出现错误。再次阅读错误,&lt;div _ngcontent-c3="" class="filter-button-container"&gt;...&lt;/div&gt; 元素与 cookie 横幅元素不同。你为什么不检查一次网站?
    • @DebanjanB I've updated the code and it successfully runs on my machine. 你应该放慢速度,真正阅读这个问题......这样你就不必多次更新你的答案了。您还应该放慢速度并阅读我的答案,因为他们指出了这一点,但是您像往常一样不经意地解雇了他们。您还应该放慢速度并实际阅读 my 答案和我的答案下方的 cmets,因为如果您愿意,您已经看到我尝试了此代码并且它可以在我的机器上运行。我无法解释其他人的机器设置等。
    • @DebanjanB 另外,我认为您的意思是“假设”,而不是“初始”。 inception definition
    猜你喜欢
    • 2021-10-08
    • 2020-01-04
    • 2016-06-08
    • 2017-04-16
    • 2016-12-19
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2019-09-24
    相关资源
    最近更新 更多