Can not click on a Element: ElementClickInterceptedException in Splinter / Selenium
PythonSeleniumWebdriverwaitSplinterExpected ConditionPython Problem Overview
I'm trying to scrape a page, but I sometimes have trouble clicking a link/button.
When the web page loads, then the "loadingWhiteBox" will appear first and then disappear after a few seconds (but it will remain in the HTML code) as long as the box is appears on the website, I can not click on the link and get following error message:
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
Is there any way to work around this? I've already tried working with the following command:
driver.is_element_present_by_css('div[class*="loadingWhiteBox"]')
But the element is present even when it's not active.
Python Solutions
Solution 1 - Python
You can try the below 2 methods to click on element.
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()
hope this will work.
Solution 2 - Python
This error message...
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
...implies that the desired element wasn't clickable as some other element obscures it.
There are multiple approaches to address this issue and a couple of them are as follows:
-
As you intent to invoke
click()
you need to induce WebDriverWait inconjunction with the WebDriverWaitWebDriverWait for theelement_to_be_clickable()
and you can use either of the following Locator Strategies:-
Using
CSS_SELECTOR
:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.taLnk.ulBlueLinks"))).click()
-
Using
XPATH
:WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='taLnk ulBlueLinks']"))).click()
-
-
Incase the error ...another element
obscures it... still persists first you need to induce WebDriverWait inconjunction with theexpected_conditions
for theinvisibility_of_element()
of the blocking element as follows:-
Using
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()
-
Using
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()
-
-
If the issue still persists you can use the
execute_script()
method as follows:-
Using
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"))))
-
Using
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']"))))
-
Note
You have to add the following imports :
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Solution 3 - Python
You can wait until the element
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.className("loadingWhiteBox")));
Solution 4 - Python
for Selenide
WebElement element = selenide_element.toWebElement();
WebDriverRunner.driver().executeJavaScript("arguments[0].click();", element);
Solution 5 - Python
When I get this error I usually try a different approach. Instead of:
driver.findElement(By.cssSelector("div[class*="loadingWhiteBox"]")).click();
Try this:
WebElement webElement = driver.findElement(By.cssSelector("div[class*="loadingWhiteBox"]"));
((JavascriptExecutor) driver).executeScript("arguments[0].click();", webElement);
This will click the found webElement even when there are overlays.
If this is not working then be sure that you are trying to click the correct 'clickable' web element and check that your css selector is not pointing to a different webElement. By 'clickable' I mean a webElement that performs an action when you click it (for example opening a new page). The web driver will click it and you may think it didn't actually performed the click action, but it actually performed it on the wrong webElement.
Solution 6 - Python
I faced the same problem and I just used this : elm = driver.find_elements_by_css_selector('div[class*="loadingWhiteBox"]') elm.click()