Fix "Element Not Clickable at Point" in Selenium
The Error
org.openqa.selenium.ElementClickInterceptedException:
element click intercepted: Element <button id="submit">...</button>
is not clickable at point (450, 320).
Other element would receive the click: <div class="overlay">...</div>
Read that last line carefully — Selenium is telling you exactly what's in the way. Most people skip it and start adding sleeps.
What It Actually Means
Selenium tries to click at the element's coordinates, not on the element itself. If something else occupies that pixel, the click lands on that other thing instead.
Selenium clicks the top-most element at that point, not the one you asked for. The element exists, is visible, and is enabled — it's just covered.
The 4 Root Causes
1. Another UI component overlaps it ⭐
Sticky headers, banners, ads, popups, loaders/spinners, cookie notices, error messages. Selenium clicks the top-most element at that point — which is the overlay, not your button.
2. The element isn't in the visible area
It's present in the DOM but below the scroll, partially hidden, or outside the viewport.
3. The page hasn't fully loaded
Element positions shift as content renders, something temporarily sits on top, and Selenium clicks too early — before things settle.
4. The locator is wrong
It matched a real element — just not the one you meant. A hidden duplicate, or a wrapper <div> rather than the <button> inside it.
The Fixes, In Order
1. Wait for the element to be clickable ⭐
Not just present — clickable. This alone fixes most cases.
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.elementToBeClickable(By.id("submit"))).click();
elementToBeClickable waits for visible and enabled — unlike presenceOfElementLocated, which only checks the DOM.
2. Scroll it into view
WebElement btn = driver.findElement(By.id("submit"));
((JavascriptExecutor) driver)
.executeScript("arguments[0].scrollIntoView({block:'center'});", btn);
btn.click();
Use {block:'center'} — it centres the element, avoiding the classic trap where scrollIntoView(true) parks your button directly under a sticky header.
3. Handle the overlay first ⭐
If the error names a cookie banner or a modal, dismiss it — don't fight it:
// Wait for the loader to disappear
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.className("loading-spinner")));
// Or close the popup that's in the way
driver.findElement(By.cssSelector(".cookie-banner .close")).click();
Read the error message. It literally names the intercepting element — that's your locator.
4. Use a more specific locator
// ❌ Might match a wrapper div
driver.findElement(By.className("btn-container")).click();
// ✅ Target the actual clickable element
driver.findElement(By.cssSelector(".btn-container > button[type='submit']")).click();
5. Wait for the page and animations to settle
Fade-ins and slide-downs move elements while Selenium is clicking. Wait for the animating element to be stable — or for the loader to vanish — rather than sleeping and hoping.
6. JavaScript click — the escape hatch ⚠️
((JavascriptExecutor) driver)
.executeScript("arguments[0].click();", driver.findElement(By.id("submit")));
This works because it bypasses the overlay entirely — which is exactly why it's dangerous.
A real user couldn't click that button. If a modal is covering it, a JS click makes your test pass while the user-facing bug ships. You've automated around a defect instead of catching it.
Use it only when the overlay is a known, harmless quirk of your app — never as your default fix.
Quick Diagnosis
| The error names… | It's… | Fix |
|---|---|---|
<div class="overlay"> / modal |
A popup covering it | Dismiss it (fix 3) |
<div class="loading"> / spinner |
The page still loading | Wait for invisibility (fix 3) |
<header> / nav |
A sticky header | Scroll with block:'center' (fix 2) |
<div class="cookie"> |
A consent banner | Accept/close it first |
| Coordinates near (0,0) | Element off-screen | Scroll into view (fix 2) |
| Nothing obvious | Timing / wrong locator | Fixes 1 and 4 |
The Interview Answer
"'Element not clickable at point' means Selenium tried to click the coordinates but another element was on top — usually a sticky header, popup, or loader — because Selenium clicks the top-most element at that point. I fix it by waiting for
elementToBeClickable, scrolling into view, or dismissing the overlay first. I avoid defaulting to a JavaScript click, because that bypasses the overlay and can hide a genuine UI bug a real user would hit."
That last sentence is what separates a mid-level answer from a senior one.
Frequently Asked Questions
1. What causes "Element Not Clickable at Point" in Selenium?
The target element is covered by another visible element such as a popup, loading spinner, sticky header, or cookie banner. Selenium clicks the top-most element at the specified coordinates.
2. What is the best way to fix this exception?
Use ExpectedConditions.elementToBeClickable(), scroll the element into view, dismiss any blocking overlays, and verify that your locator identifies the actual clickable element.
3. Should I always use a JavaScript click?
No.
JavaScript clicks bypass Selenium's interaction checks and may allow tests to pass even when real users cannot click the element.
Use them only as a last resort.
4. Why does the exception occur only sometimes?
Timing differences.
On slower systems or CI environments, loaders and animations remain visible longer, increasing the chance that another element blocks the click.
5. How is this different from ElementNotInteractableException?
- ElementClickInterceptedException means another element is blocking the click.
- ElementNotInteractableException means the target element itself is hidden, disabled, or otherwise not ready for interaction.
Related Tutorials
Continue learning with:
- Selenium Waits & Synchronization
- JavaScriptExecutor in Selenium
- Advanced Element Handling
- StaleElementReferenceException
- Complete Selenium Guide