无法单击元素:Splinter / Selenium 中的 ElementClickInterceptedException

Posted

技术标签:

【中文标题】无法单击元素:Splinter / Selenium 中的 ElementClickInterceptedException【英文标题】:Can not click on a Element: ElementClickInterceptedException in Splinter / Selenium 【发布时间】: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 您使用什么代码来执行点击?如果您在白框消失后尝试单击,是否还会继续看到同样的异常? 【参考方案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() 时,您需要将WebDriverWait 与WebDriverWaitWebDriverWait 联合用于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);

【讨论】:

以上是关于无法单击元素:Splinter / Selenium 中的 ElementClickInterceptedException的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Splinter 查找元素值?

在 Splinter 中获取 href 值?

seleniu 元素定位与操作

Splinter学习--初探3,两种方式登录QQ邮箱

Python + Splinter:错误 - httplib.BadStatusLine:''

搭建splinter+python环境时遇到的错误