Skip to content
Selenium WebDriver · error message

Selenium: ElementClickInterceptedException: element click intercepted

RetryableClicking & interacting

Last verified

The exact message
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <button id="submit">...</button> is not clickable at point (412, 638). Other element would receive the click: <div class="overlay">...</div>; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#elementclickinterceptedexception

What it means

Selenium found the element and it is displayed, but when the driver checked the exact point it was about to click, a different element was on top. A real user clicking there would hit that other element, so the driver refuses. The message names both: the element you wanted, the coordinates, and the element that would receive the click.

That last part is the key to the fix. It is usually an overlay: a cookie banner, a modal backdrop, a loading spinner, a sticky header or footer, or a chat widget. Sometimes it is a child or label of your target positioned over it, which is common with custom-styled checkboxes and radio buttons.

What is not wrong: the locator and the element's visibility. If the element were missing or hidden you would see NoSuchElementException or ElementNotInteractableException instead.

What it looks like

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, ".loading-overlay")))
button = wait.until(EC.element_to_be_clickable((By.ID, "submit")))
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", button)
button.click()

Why it happens

  • A cookie consent banner, modal or newsletter popup covers the element.
  • A loading overlay or spinner has not disappeared yet.
  • A sticky header or footer overlaps the element after it is scrolled into view.
  • A styled label or span sits on top of a hidden checkbox or radio input.
  • An animation is still moving the element when the click happens.

How to fix it

  1. Read the 'Other element would receive the click' part and inspect that element.
  2. Close or accept the overlay first, or wait for it to disappear: wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, '.overlay'))).
  3. Wait for the target to be clickable: wait.until(EC.element_to_be_clickable((By.ID, 'submit'))).
  4. Scroll the element away from sticky headers: ActionChains(driver).scroll_to_element(el).perform(), or scrollIntoView({block: 'center'}) via execute_script.
  5. For styled checkboxes, click the associated label instead of the hidden input.
  6. A JavaScript click (driver.execute_script('arguments[0].click()', el)) bypasses the check, but only use it once you know the overlay is cosmetic.

How to stop it recurring

Handle consent banners once at the start of every session. After each action that triggers a request, wait for the app's loading indicator to vanish before the next click. Use a consistent window size so layouts, and therefore overlaps, are reproducible between local and CI runs.

Official documentation: www.selenium.dev/documentation/webdriver/troubleshooting/errors/#elementclickinterceptedexception. See all Selenium error messages.

Related errors

Definitions

Quick answers

What does "ElementClickInterceptedException: element click intercepted" mean in Selenium?

Selenium found the element and it is displayed, but when the driver checked the exact point it was about to click, a different element was on top. A real user clicking there would hit that other element, so the driver refuses. The message names both: the element you wanted, the coordinates, and the element that would receive the click . That last part is the key to the fix.

How do I fix "ElementClickInterceptedException: element click intercepted"?

1. Read the 'Other element would receive the click' part and inspect that element. 2. Close or accept the overlay first, or wait for it to disappear: wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, '.overlay'))). 3. Wait for the target to be clickable: wait.until(EC.element_to_be_clickable((By.ID, 'submit'))). 4. Scroll the element away from sticky headers: ActionChains(driver).scroll_to_element(el).perform(), or scrollIntoView({block: 'center'}) via execute_script. 5. For styled checkboxes, click the associated label instead of the hidden input. 6. A JavaScript click…

Run browser automation you can watch and take over

Autonoly runs each job in a real cloud Chromium browser driven by Playwright. Timeouts and detached elements still happen; the difference is that you can watch the run live, see the step that failed, and take control of the browser to finish it.

Also see Live browser control.