14

I am using selenium for test script. I am getting following error and this error randomly occur. When I run 10 times, I get this about twice. So it's not really reproducible. Does anyone know why this is happening? the element I am trying to click is definitely visible in the browser and doesn't move around so there is no need to resize or drag element. I am using chrome webdriver and I read other troubleshooting strategies (Debugging "Element is not clickable at point" error) and they don't seem relevant to my issue. I waited enough time as well.

UnknownError: unknown error: Element is not clickable at point (167, 403). Other element would receive the click: <div class="leftMasterBackground"></div>
4
  • Can you give us some information about what Element you want to click? It would also be interesting what elements surround it and what actions are performed before the click. Commented Apr 8, 2015 at 7:30
  • Use explicit wait till element comes visible to click. Commented Apr 8, 2015 at 7:55
  • Have all scripts and styles on the page finished loading when this error occurs? Commented Apr 8, 2015 at 7:56
  • The element gets loaded when the page is loaded so technically, there should be no waiting time required to check existence of the element(checking this element happened after a few tests of others) I checked the screenshot that was taken when the page was loaded, I could visually see the element loaded on the page so there is no reason why selenium could not detect the element. What I am trying to do is to click the element(button). It's very odd and annoying as it happens randomly. Does anyone know where about of the element selenium clicks? Commented Apr 9, 2015 at 0:14

7 Answers 7

7

There are a number of steps you can do in order to improve the stability while clicking on different UI elements:

  • Explicitly wait for it's presence in the DOM
  • Scroll into the element view
  • Check if clickable

Does it helped the stability?

WebDriverWait wait = new WebDriverWait(driver, 3)
JavascriptExecutor js = ((JavascriptExecutor) driver)

//presence in DOM
wait.until(ExpectedConditions.presenceOfElement(By.id("ID")));

//scrolling
WebElement element = driver.findElement(By.id("ID")));  
js.executeScript("arguments[0].scrollIntoView(true);", element);

//clickable
wait.until(ExpectedConditions.elementToBeClickable(By.id("ID")));

Further, if you will decide to override the default Actions interface with more customized one, you can use two type of clicks (for example): click() which will have all those stability steps and fastClick() which will be the default clicking without any varification.

Sign up to request clarification or add additional context in comments.

3 Comments

I only used the //scrolling block with my issue and it worked. Thanks. There's probably a more DRY solution in making this a function to call repeatedly all over your protractor tests. I'm sure there are many places where you need to scroll to a certain spot on the page in order to click.
@JCC in our solution, those native selenium libraries wrapped in additional abstraction level. So we have methods like: element.scrollToElement().click(), element.waitUntilPresence().click() and etc.
fantastic job! The key thing is to SCROLL!
3

I have solved by catching the exception and managing it like this:

WebDriver driver = new ChromeDriver();
WebElement element = driver.findElement(By.id("ID"));
boolean clicked = false;
do{
    try {
        element.click();
    } catch (WebDriverException e) {
        continue;
    } finally {
        clicked = true;
    }
} while (!clicked);

3 Comments

Have a look at ExpectedConditions.isClickable()
I've already seen this functionality, but it doesn't work well with chromedriver. What happen is: the condition return true, but the element isn't effectively clickable.
I had this error, which brought me to this page. Is your element covered by another (transparent) element? Is it animated? Is it possible to inject JS with .executeScript (or your binding's equivalent) to click the element?
2

I was also facing same problem with Chrome. I have solved that putting one line of code before clicking on the element:

scrollToViewElement(driver,xpath);

Comments

2

For best solution, use JavaScript to focus element. Using:

JavascriptExecutor jsnew = (JavascriptExecutor)driver;
WebElement element = driver.findElement(By.xpath(""));
jsnew.executeScript("arguments[0].scrollIntoView({block:\"center\"});", element);

In place of xpath you can use id, css selector: This scrollIntoView will bring the this specific element in middle of page, then driver will be able to hit element.

If it is normal button or link, use jsnew.executeScript("arguments[0].click();", element);

This is consistent solution for click.

Comments

1

Click parent element of the element which you want to click. This can be workaround solution only.

Comments

0

I got the same issue due to one of spinner was hiding the element.

I gave xpath and it resolved the issue. Other people suggested to 1. scroll 2. sleep also worked for them.

1 Comment

you can also solve the following error using wait condition: waitUntilTrueOrTimeout(ExpectedConditions.invisibilityOfElementLocated(elementHidingOtherElement)); protected <V> V waitUntilTrueOrTimeout(final ExpectedCondition<V> isTrue) { return waitUntilTrueOrTimeout(isTrue, waitTimeOutSeconds); } protected <V> V waitUntilTrueOrTimeout(final ExpectedCondition<V> isTrue, final int waitTimeSeconds) { return new WebDriverWait(this.driver, waitTimeSeconds).ignoring(StaleElementReferenceException.class).until(isTrue);
0
  • This happens only on chrome so it works on ie and firefox
  • ChromeDriver always clicks the middle of the element
  • The reason Chrome driver doesn't calculate the correct screen location of link.

Solution:

// Find an element and define it

WebElement elementToClick = driver.findElement(By.xpath("some xpath"));
// Scroll the browser to the element's Y position
((JavascriptExecutor) driver).executeScript("window.scrollTo(0,"+elementToClick.getLocation().y+")");
// Click the element
elementToClick.click();

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.