无法单击元素: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()
如果错误 ...另一个元素掩盖了它... 仍然存在,首先您需要将 WebDriverWait 与expected_conditions
的invisibility_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的主要内容,如果未能解决你的问题,请参考以下文章