【问题标题】:Can not click on a Element: ElementClickInterceptedException in Splinter / Selenium无法单击元素:Splinter / Selenium 中的 ElementClickInterceptedException
【发布时间】:2018-07-17 19:31:53
【问题描述】:

我正在尝试抓取页面,但有时我无法点击链接/按钮。

当网页加载时,“loadingWhiteBox”会先出现,几秒后消失(但会保留在HTML代码中),只要该框出现在网站上,我就无法点击链接并收到以下错误消息:

selenium.common.exceptions.ElementClickInterceptedException: Message: 
Element <span class="taLnk ulBlueLinks"> is not clickable at point 
(318.3000030517578,661.7999877929688) because another element <div 
class="loadingWhiteBox"> obscures it

有没有办法解决这个问题?我已经尝试过使用以下命令:

driver.is_element_present_by_css('div[class*="loadingWhiteBox"]')

但该元素即使在不活动时也存在。

【问题讨论】:

  • 你用的是什么浏览器?
  • 火狐和 Tor
  • 您使用什么代码来执行点击?如果您在白框消失后尝试单击,是否还会继续看到同样的异常?

标签: python selenium webdriverwait splinter expected-condition


【解决方案1】:

您可以尝试以下两种点击元素的方法。

element = driver.find_element_by_css('div[class*="loadingWhiteBox"]')
driver.execute_script("arguments[0].click();", element)

element = driver.find_element_by_css('div[class*="loadingWhiteBox"]')
webdriver.ActionChains(driver).move_to_element(element ).click(element ).perform()

希望这会奏效。

【讨论】:

  • Pradeep,您介意解释一下执行脚本的原因吗?它对我有用,但我不知道为什么
  • @toceto 它是通过 javascript 完成的点击,而不是通过 webdriver 元素点击。为什么 webdriver 有时无法“点击”,我不知道,但我认为这与它首先进行的一些验证检查有关,而 javascript 不在乎,它只是点击。
  • 如果您打算使用 CSS 选择器来指定一个类,请以正确的方式进行操作,div.loadingWhiteBox。您拥有它的方式是字符串比较,可能有效也可能无效。例如,如果另一个元素上有一个名为“loadingWhiteBox-abc”的类,你的 CSS 选择器会找到它,因为它正在执行部分文本匹配,而这不是你想要的类。
  • 第二个对我没用,但第一个太棒了,你太棒了
【解决方案2】:

你可以等到元素消失,

WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.className("loadingWhiteBox")));

【讨论】:

    【解决方案3】:

    当我收到此错误时,我通常会尝试不同的方法。 而不是:

    driver.findElement(By.cssSelector("div[class*="loadingWhiteBox"]")).click();
    

    试试这个:

    WebElement webElement = driver.findElement(By.cssSelector("div[class*="loadingWhiteBox"]"));
    ((JavascriptExecutor) driver).executeScript("arguments[0].click();", webElement);
    

    即使有叠加层,这也会点击找到的 webElement。

    如果这不起作用,请确保您尝试单击正确的“可点击”网页元素,并检查您的 css 选择器是否指向不同的网页元素。 “可点击”是指当您单击它时执行操作的 webElement(例如打开新页面)。 Web 驱动程序会单击它,您可能认为它实际上并没有执行单击操作,但它实际上是在错误的 webElement 上执行的。

    【讨论】:

    • 你从哪里得到这个driver.getInnerDriver()?这是您的框架的自定义吗?
    • 抱歉,我更正了代码。我有一个自定义的 firefox 驱动程序实现,只是复制了代码而没有注意到它。
    • 这就是你在 python 中的做法:driver.execute_script("arguments[0].click();", element)。其中 element 是您尝试点击的网络元素。
    【解决方案4】:

    此错误消息...

    selenium.common.exceptions.ElementClickInterceptedException: Message: Element <span class="taLnk ulBlueLinks"> is not clickable at point (318.3000030517578,661.7999877929688) because another element <div class="loadingWhiteBox"> obscures it
    

    ...暗示所需元素不可点击,因为某些其他元素会遮挡它。


    有多种方法可以解决此问题,其中几种方法如下:

    • 当您打算调用click() 时,您需要将WebDriverWaitWebDriverWaitWebDriverWait 联合用于element_to_be_clickable(),并且您可以使用以下任一Locator Strategies

      • 使用CSS_SELECTOR

        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.taLnk.ulBlueLinks"))).click()
        
      • 使用XPATH

        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='taLnk ulBlueLinks']"))).click()
        
    • 如果错误 ...另一个元素掩盖了它... 仍然存在,首先您需要将 WebDriverWaitexpected_conditionsinvisibility_of_element() 结合使用阻塞元素如下:

      • 使用CSS_SELECTOR:

        WebDriverWait(driver, 20).until(EC.invisibility_of_element((By.CSS_SELECTOR, "div.loadingWhiteBox")))
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.taLnk.ulBlueLinks"))).click()
        
      • 使用XPATH

        WebDriverWait(driver, 20).until(EC.invisibility_of_element((By.XPATH, "//div[@class='loadingWhiteBox']")))
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='taLnk ulBlueLinks']"))).click()
        
    • 如果问题仍然存在,您可以使用execute_script() 方法,如下所示:

      • 使用CSS_SELECTOR

        WebDriverWait(driver, 20).until(EC.invisibility_of_element((By.CSS_SELECTOR, "div.loadingWhiteBox")))
        driver.execute_script("arguments[0].click();", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.taLnk.ulBlueLinks"))))
        
      • 使用XPATH

        WebDriverWait(driver, 20).until(EC.invisibility_of_element((By.XPATH, "//div[@class='loadingWhiteBox']")))
        driver.execute_script("arguments[0].click();", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='taLnk ulBlueLinks']"))))
        

    注意

    您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait       
    from selenium.webdriver.common.by import By       
    from selenium.webdriver.support import expected_conditions as EC
    

    【讨论】:

    • 感谢您,您应该将导入并将每个元素定义在顶部。否则一如既往的最佳答案。
    • @Datanovice 完成,添加导入。
    【解决方案5】:

    我遇到了同样的问题,我只是用这个: 榆树 = driver.find_elements_by_css_selector('div[class*="loadingWhiteBox"]') elm.click()

    【讨论】:

      【解决方案6】:

      硒化物

      WebElement element = selenide_element.toWebElement();
      WebDriverRunner.driver().executeJavaScript("arguments[0].click();", element);
      

      【讨论】:

        猜你喜欢
        • 2020-09-09
        • 1970-01-01
        • 2020-10-16
        • 2021-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多