By nix86


2017-06-23 14:42:37 8 Comments

I am trying to make some tests using selenium based Katalon Studio. In one of my tests I have to write inside a textarea. The problem is that I get the following error:

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

In fact my element is place inside some other diva that might hide it but how can I make the click event hit my textarea?

2 comments

@ulrayk 2018-01-03 19:01:47

I assume, you've checked already that there is no any other component overlapping here (transparent advertisement-iframes or some other component of the DOM => seen quite often such things in input/textfield elements) and, when manually (slowly) stepping your code, it's working smoothly, then ajax calls might cause this behaviour.

To avoid thread.sleep, try sticking with EventFiringWebDriver and register a handle to it. (Depending on your application's techstack you may work it for Angular, JQuery or wicket in the handler, thus requiring different implementations) (Btw: This approach also got me rid of "StaleElementException" stuff lots of times)

see: org.openqa.selenium.support.events.EventFiringWebDriver org.openqa.selenium.support.events.WebDriverEventListener

driveme = new ChromeDriver();
driver = new EventFiringWebDriver(driveme);
ActivityCapture handle=new ActivityCapture();
driver.register(handle);

=> ActivityCapture implements WebDriverEventListener e.g. javascriptExecutor to deal with Ajax calls in a wicket/dojo techstack

    @Override
public void beforeClickOn(WebElement arg0, WebDriver event1) {
    try {
        System.out.println("After click "+arg0.toString());
        //System.out.println("Start afterClickOn - timestamp: System.currentTimeMillis(): " + System.currentTimeMillis());
        JavascriptExecutor executor = (JavascriptExecutor) event1;
        StringBuffer javaScript = new StringBuffer();
        javaScript.append("for (var c in Wicket.channelManager.channels) {");
        javaScript.append(" if (Wicket.channelManager.channels[c].busy) {");
        javaScript.append(" return true;");
        javaScript.append(" }");
        ;
        ;
        ;
        javaScript.append("}");
        javaScript.append("return false;");
        //Boolean result = (Boolean) executor.executeScript(javaScript.toString());
        WebDriverWait wait = new WebDriverWait(event1, 20);
        wait.until(new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver driver) {
                return !(Boolean) executor.executeScript(javaScript.toString());
            }
        });
        //System.out.println("End afterClickOn - timestamp: System.currentTimeMillis(): " + System.currentTimeMillis());
    } catch (Exception ex) {
        //ex.printStackTrace();
    }
}

@New contributor 2017-06-23 15:08:13

Element ... is not clickable at point (x, y). Other element would receive the click" can be caused for 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("id1"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
  1. Element not getting clicked as it is not within Viewport

Try to use JavascriptExecutor to bring the element within Viewport:

JavascriptExecutor jse1 = (JavascriptExecutor)driver;
jse1.executeScript("scroll(250, 0)"); // if the element is on top.
jse1.executeScript("scroll(0, 250)"); // if the element is at bottom.

Or

WebElement myelement = driver.findElement(By.id("id1"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement); 
  1. The page is getting refreshed before the element gets clickable.

In this case induce some wait.

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

In this case add some ExplicitWait for the element to be clickable.

WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("id1")));
  1. 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")));
  1. 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);

@nix86 2017-06-23 15:11:10

But I'm not using javascript. I use katalon that uses java.

@nix86 2017-06-23 15:22:58

I have partially solved the problem by putting a Thread.sleep before the click.

@New contributor 2017-06-23 15:28:38

@nix86 Thread.sleep() degrades your Test performance. So avoid Thread.sleep(). ImplicitlyWait may be discontinued anytime. So try out ExplicitWait as I mentioned in my Answer.

@nix86 2017-06-26 07:23:25

But how is the driver variable defined?

@New contributor 2017-06-26 07:40:21

@nix86 Can you consider showing us your work please along with the relevant HTML DOM so that we can guide you properly? Thanks

Related Questions

Sponsored Content

42 Answered Questions

[SOLVED] Debugging "Element is not clickable at point" error

1 Answered Questions

[SOLVED] Error: Element is not clickable. Other element would receive the click

1 Answered Questions

2 Answered Questions

WebDriverException: Element is not clickable at point

2 Answered Questions

2 Answered Questions

1 Answered Questions

1 Answered Questions

Sponsored Content