104

I used explicit waits and I have the warning:

org.openqa.selenium.WebDriverException: Element is not clickable at point (36, 72). Other element would receive the click: ... Command duration or timeout: 393 milliseconds

If I use Thread.sleep(2000) I don't receive any warnings.

@Test(dataProvider = "menuData")
public void Main(String btnMenu, String TitleResultPage, String Text) throws InterruptedException {
    WebDriverWait wait = new WebDriverWait(driver, 10);
    driver.findElement(By.id("navigationPageButton")).click();

    try {
       wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(btnMenu)));
    } catch (Exception e) {
        System.out.println("Oh");
    }
    driver.findElement(By.cssSelector(btnMenu)).click();
    Assert.assertEquals(driver.findElement(By.cssSelector(TitleResultPage)).getText(), Text);
}
Bruno Bieri
  • 9,724
  • 11
  • 63
  • 92
Maria
  • 1,057
  • 2
  • 8
  • 7
  • Are you using Chrome version 61+? – demouser123 Jul 04 '17 at 18:28
  • @demouser123 i am using Firefox 47.0.1 and seleniumWebDriver 2.51.0 – Maria Jul 04 '17 at 18:32
  • @Maria On which line are you getting the error? Thanks – undetected Selenium Jul 04 '17 at 19:02
  • @DebanjanB In line: driver.findElement(By.id("navigationPageButton")).click(); – Maria Jul 04 '17 at 19:08
  • That error means, there's another element overlaying the target element (fixed/absolute positioned overlay) or the z-index is too low. This might be caused by hover effects using transitions (slower than the minimum timeout, in this case 393ms). you should wait for `#navigationPageButton` to become visible (or clickable using `elementToBeClickable()` for that element too) or check whether all preconditions are met so that the button is clickable. – try-catch-finally Jul 04 '17 at 20:09
  • The issue can come if you are using Ext-JS or similar to make beautiful UI. I had similar issues and it was solved by sending key on the element to click on it. – Shalvin Abraham Jul 05 '17 at 14:42

9 Answers9

210

WebDriverException: Element is not clickable at point (x, y)

This is a typical org.openqa.selenium.WebDriverException which extends java.lang.RuntimeException.

The fields of this exception are :

  • BASE_SUPPORT_URL : protected static final java.lang.String BASE_SUPPORT_URL
  • DRIVER_INFO : public static final java.lang.String DRIVER_INFO
  • SESSION_ID : public static final java.lang.String SESSION_ID

About your individual usecase, the error tells it all :

WebDriverException: Element is not clickable at point (x, y). Other element would receive the click 

It is clear from your code block that you have defined the wait as WebDriverWait wait = new WebDriverWait(driver, 10); but you are calling the click() method on the element before the ExplicitWait comes into play as in until(ExpectedConditions.elementToBeClickable).

Solution

The error Element is not clickable at point (x, y) can arise from different factors. You can address them by either of the following procedures:

1. Element not getting clicked due to JavaScript or AJAX calls present

Try to use Actions Class:

WebElement element = driver.findElement(By.id("navigationPageButton"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();

2. Element not getting clicked as it is not within Viewport

Try to use JavascriptExecutor to bring the element within the Viewport:

WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement); 

3. The page is getting refreshed before the element gets clickable.

In this case induce ExplicitWait i.e WebDriverWait as mentioned in point 4.

4. Element is present in the DOM but not clickable.

In this case induce ExplicitWait with ExpectedConditions set to elementToBeClickable for the element to be clickable:

WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));

5. Element is present but having temporary Overlay.

In this case, induce ExplicitWait with ExpectedConditions set to invisibilityOfElementLocated for the Overlay to be invisible.

WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));

6. Element is present but having permanent Overlay.

Use JavascriptExecutor to send the click directly on the element.

WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
Moshe Slavin
  • 5,127
  • 5
  • 23
  • 38
undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
  • 1
    To #6/#2 above: The .ExecuteScript method is now accessible from the web driver itself rather than the JavascriptExecutor. Thanks for the well written answer! – Tabrock May 15 '18 at 20:25
  • 8
    You have covered many possibilities in which only 5 and 6 are correct way to handle the mentioned error. The first four throws different error for which the solution you gave won't work. For an example point number 3 is actually a stale element problem that wouldn't work even though how long you wait with elementToBeClickble method. That has to be handled differently. – Rajagopalan Aug 07 '18 at 07:59
  • 6 is not really correct it;s a hack to work around the issue, 5 would be correct if the correct expected condition was being used. 4 looks like the only correct answer. – Ardesco Mar 09 '19 at 19:38
  • 2
    An important thing to note is, when we're emulating user's actions, it may be very undesirable to use javascript to click on element that can't be clicked at all (#6). The end user would never do that, they would just either scroll to the element to bring it into viewport or dismiss any overlay (if allowed by the page) to interact with it. – Praveen Tiwari Feb 24 '20 at 03:55
21

In case you need to use it with Javascript

We can use arguments[0].click() to simulate click operation.

var element = element(by.linkText('webdriverjs'));
browser.executeScript("arguments[0].click()",element);
SirPeople
  • 4,248
  • 26
  • 46
Rester Test
  • 227
  • 2
  • 10
  • Works! I cannot imagine way it works, but otherwise it clicks on overlay layer (waiting of overlay closing by 'invisibilityOfElementLocated' takes about 30sec.). – Fisk Jun 01 '18 at 10:48
  • Can you please write the full explanation since I write in java and it is not familiar war, can you please provide full flow? – Bastian Oct 23 '19 at 09:30
4

I ran into this error while trying to click some element (or its overlay, I didn't care), and the other answers didn't work for me. I fixed it by using the elementFromPoint DOM API to find the element that Selenium wanted me to click on instead:

element_i_care_about = something()
loc = element_i_care_about.location
element_to_click = driver.execute_script(
    "return document.elementFromPoint(arguments[0], arguments[1]);",
    loc['x'],
    loc['y'])
element_to_click.click()

I've also had situations where an element was moving, for example because an element above it on the page was doing an animated expand or collapse. In that case, this Expected Condition class helped. You give it the elements that are animated, not the ones you want to click. This version only works for jQuery animations.

class elements_not_to_be_animated(object):
    def __init__(self, locator):
        self.locator = locator

    def __call__(self, driver):
        try:
            elements = EC._find_elements(driver, self.locator)
            # :animated is an artificial jQuery selector for things that are
            # currently animated by jQuery.
            return driver.execute_script(
                'return !jQuery(arguments[0]).filter(":animated").length;',
                elements)
        except StaleElementReferenceException:
            return False
rescdsk
  • 8,739
  • 4
  • 36
  • 32
2

You can try

WebElement navigationPageButton = (new WebDriverWait(driver, 10))
 .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();
fg78nc
  • 4,774
  • 3
  • 19
  • 32
  • It is not help me. – Maria Jul 04 '17 at 18:53
  • Yes: org.openqa.selenium.WebDriverException: Element is not clickable at point (36, 72). Other element would receive the click:
    Command duration or timeout: 70 milliseconds
    – Maria Jul 04 '17 at 18:57
  • 1
    try the following `WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();` – fg78nc Jul 04 '17 at 18:59
  • It is not help too. I have two Exception and one AssertionError and next some error "Element is not clickable at point " – Maria Jul 04 '17 at 19:03
  • Are you sure page is not refreshing at the time you are trying to click? – fg78nc Jul 04 '17 at 19:04
  • A pop-up menu appears on the page but the page itself is not updated – Maria Jul 04 '17 at 19:09
  • Maybe you now operate on pop-up window instead? – fg78nc Jul 04 '17 at 19:22
  • 1
    If i using Thread.Sleep then all work. But i using Wait all fail. – Maria Jul 04 '17 at 19:24
  • `presenceOfElementLocated()` is not enough, the element has been located. The error message would be different if the element cannot be located. The error says the element is not visible or something overlays that element. – try-catch-finally Jul 04 '17 at 20:12
  • I have the same problem, after a modal dialog is opened, I'm not able to click element inside the dialog. Have already tried all suggestions from this thread, nothing worked. I can identify the overlaying frame, but cannot switch to the frame, getting NoSuchFrameException. – pburgr May 30 '18 at 14:16
  • @pburgr How do you switch to the frame? – fg78nc May 30 '18 at 22:42
  • with this I'm getting NoSuchFrameException: WebElement languageModal = driver.findElement(By.id("languageModal")); driver.switchTo().frame(languageModal); but WebElement languageModal = driver.findElement(By.id("languageModal")); languageModal.click(); is OK, no exception at all. – pburgr May 31 '18 at 07:04
  • @pburgr Are you able to locate frame through id in browser console? – fg78nc May 31 '18 at 13:22
2

Scrolling the page to the near by point mentioned in the exception did the trick for me. Below is code snippet:

$wd_host = 'http://localhost:4444/wd/hub';
$capabilities =
    [
        \WebDriverCapabilityType::BROWSER_NAME => 'chrome',
        \WebDriverCapabilityType::PROXY => [
            'proxyType' => 'manual',
            'httpProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'sslProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'noProxy' =>  PROXY_EXCEPTION // to run locally
        ],
    ];
$webDriver = \RemoteWebDriver::create($wd_host, $capabilities, 250000, 250000);
...........
...........
// Wait for 3 seconds
$webDriver->wait(3);
// Scrolls the page vertically by 70 pixels 
$webDriver->executeScript("window.scrollTo(0, 70);");

NOTE: I use Facebook php webdriver

Sudheesh.M.S
  • 498
  • 1
  • 7
  • 13
1

If element is not clickable and overlay issue is ocuring we use arguments[0].click().

WebElement ele = driver.findElement(By.xpath("//div[@class='input-group-btn']/input"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
AVI
  • 5,516
  • 5
  • 29
  • 38
0

The best solution is to override the click functionality:

public void _click(WebElement element){
    boolean flag = false;
    while(true) {
        try{
            element.click();
            flag=true;
        }
        catch (Exception e){
            flag = false;
        }
        if(flag)
        {
            try{
                element.click();
            }
            catch (Exception e){
                System.out.printf("Element: " +element+ " has beed clicked, Selenium exception triggered: " + e.getMessage());
            }
            break;
        }
    }
}
user2274204
  • 315
  • 3
  • 6
  • 18
0

In C#, I had problem with checking RadioButton, and this worked for me:

driver.ExecuteJavaScript("arguments[0].checked=true", radio);
Ayub
  • 2,345
  • 27
  • 29
0

Can try with below code

 WebDriverWait wait = new WebDriverWait(driver, 30);

Pass other element would receive the click:<a class="navbar-brand" href="#"></a>

    boolean invisiable = wait.until(ExpectedConditions
            .invisibilityOfElementLocated(By.xpath("//div[@class='navbar-brand']")));

Pass clickable button id as shown below

    if (invisiable) {
        WebElement ele = driver.findElement(By.xpath("//div[@id='button']");
        ele.click();
    }