Check if element is clickable in Selenium Java
Solution 1
elementToBeClickable
is used for checking an element is visible and enabled such that you can click it.
ExpectedConditions.elementToBeClickable
returns WebElement
if expected condition is true otherwise it will throw TimeoutException
, It never returns null
.
So if your using ExpectedConditions.elementToBeClickable
to find an element which will always gives you the clickable element, so no need to check for null
condition, you should try as below :-
WebDriverWait wait = new WebDriverWait(Scenario1Test.driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]")));
element.click();
As you are saying element.click()
passes both on link
and label
that's doesn't mean element is not clickable, it means returned element clicked
but may be there is no event performs on element by click action.
Note:- I'm suggesting you always try first to find elements by id
, name
, className
and other locator. if you faced some difficulty to find then use cssSelector
and always give last priority to xpath
locator because it is slower than other locator to locate an element.
Hope it helps you..:)
Solution 2
There are instances when element.isDisplayed() && element.isEnabled()
will return true
but still element will not be clickable, because it is hidden/overlapped by some other element.
In such case, Exception
caught is:
org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (781, 704). Other element would receive the click:
<div class="footer">...</div>
Use this code instead:
WebElement element=driver.findElement(By.xpath"");
JavascriptExecutor ex=(JavascriptExecutor)driver;
ex.executeScript("arguments[0].click()", element);
It will work.
Solution 3
wait.until(ExpectedConditions)
won't return null, it will either meet the condition or throw TimeoutException
.
You can check if the element is displayed and enabled
WebElement element = driver.findElement(By.xpath);
if (element.isDisplayed() && element.isEnabled()) {
element.click();
}
Solution 4
There are certain things you have to take care:
- WebDriverWait inconjunction with ExpectedConditions as elementToBeClickable() returns the WebElement once it is located and clickable i.e. visible and enabled.
- In this process, WebDriverWait will ignore instances of
NotFoundException
that are encountered by default in theuntil
condition. - Once the duration of the wait expires on the desired element not being located and clickable, will throw a timeout exception.
- The different approach to address this issue are:
-
To invoke
click()
as soon as the element is returned, you can use:new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]"))).click();
-
To simply validate if the element is located and clickable, wrap up the WebDriverWait in a
try-catch{}
block as follows:try { new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]"))); System.out.println("Element is clickable"); } catch(TimeoutException e) { System.out.println("Element isn't clickable"); }
-
If WebDriverWait returns the located and clickable element but the element is still not clickable, you need to invoke
executeScript()
method as follows:WebElement element = new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]"))); ((JavascriptExecutor)driver).executeScript("arguments[0].click();", element);
-
Solution 5
the class attribute contains disabled
when the element is not clickable.
WebElement webElement = driver.findElement(By.id("elementId"));
if(!webElement.getAttribute("class").contains("disabled")){
webElement.click();
}
Related videos on Youtube
Sandeep Krishnappa
Updated on July 09, 2022Comments
-
Sandeep Krishnappa almost 2 years
I'm new to
Selenium
and need to check if element is clickable inSelenium
Java
, sinceelement.click()
passes both onlink
andlabel
.I tried using below code but not working:
WebDriverWait wait = new WebDriverWait(Scenario1Test.driver, 10); if(wait.until(ExpectedConditions.elementToBeClickable(By.xpath("(//div[@id='brandSlider']/div[1]/div/div/div/img)[50]")))==null)
-
Sandeep Krishnappa almost 8 yearsSo should I use listeners? to check any event on the label
-
Saurabh Gaur almost 8 years@SandeepKrishnappa No need, You should try to perform click first on browser console at label using javascript..and verify it receives any click event or not...if receives then definitely it will click by selenium..
-
Om Sao over 6 yearsThere are instances when
element.isDisplayed() && element.isEnabled()
will returntrue
but still element will not be clickable, because Element is hidden/overlapped by some other element. In such case, Exception caught is:org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (781, 704). Other element would receive the click: <div class="footer">...</div>
-
Rajagopalan over 5 yearsThis is exactly true, most of the people are not aware of this fact!
-
cruisepandey over 5 years@Rajagopalan : Exactly , your element should be visible in UI and there should not be any overlay.
-
Rajagopalan over 5 years@cruisepandey visible and enable is not enough to know whether element is clickable, that's why elementToBeClickable fails in our last question we discussed, here this user explains the same in his answer.
-
Rajagopalan over 5 years@cruisepandey Read his answer more clearly he explains that
element.isDisplayed() && element.isEnabled() will return true but still element will not be clickable
-
dǝɥɔS ʇoıןןƎ almost 5 yearsI'm trying to recreate this with another library, but I'm not sure I understand how it works. Can you explain your solution a little?
-
Lukas K about 4 yearsThis is true and probably works in most cases but it is not the proper way of handling the problems. First - click by javascript is not the same as click by mouse - there might be some differences causing unreliable test results. Second - if the element is overlapped and not clickable - it means user cannot click it either - therefor it is correct when the test fails with an exception, as the user could not do the action either.
-
armani about 4 years@SaurabhGaur - I have a similar question. I was wondering if you could answer it for me? thank you. stackoverflow.com/questions/60762906/…
-
armani about 4 yearsDebanjanB - I have a similar question here. Could you please answer it for me? Thank you. stackoverflow.com/questions/60762906/…