Hello Folks,
In this post, we will learn how to handle “ElementNotVisibleException ” and “Element is not clickable exceptions”.
While running Selenium scripts, sometimes we face below exceptions:
“org.openqa.selenium.
“org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with Command duration or timeout”
Note: Coordinates are just for reference.
What is ElementNotVisibleException?
When webdriver is able to locate web element on current webpage but it is not visible on screen.
What is Element is not clickable exception:
When webdriver is able to locate web element and also visible in screen but overlapping by another web element.
I hope above one line explanation helped you in understanding difference between both the exceptions.
Why selenium webdriver throws above exception and how to resolve?
You are very good in writing locators and when you run scripts, you get above exception. You are confused why is it so?
Reason No 01: Not locating correctly
- When locator is incorrect, selenium webdriver throws “NoSuchElementException”. Above exception says, webdriver is able to locate element, but not able to click on desired element or element is not visible.
- But your locator might be wrong as well in case of nested web element. A web element inside web element is called as nested web element. For example: A button inside a div and that Div is inside a span. If you want to click on button, you must need to locate that specific button tag. If you locate span or div, it might throw above exceptions.
- Another example: An input box is inside a span. If you locate span and want to type something, it will throw some exceptions because span is not an input type.
Solution:
Locate correct and specific element.
Reason No 02: Desired element is overlapped by another web element
- Now a days many application uses toaster messages. A toaster notification is way to provide short and meaningfull message. Generally a toaster message stays on screen for 3 seconds. See example below:
- Consider below scenario:
- You have a social media application similar to Facebook.
- You need to sign up. When you signup you are navigated to home page and a toaster message appears stating signup is successful.
- You need to click on logout. Logout button is present in right top corner where toaster message also appears.
- When we do above flow, when we want to click on Logout button, you might get above exception as Logout button is overlapped by toaster message. Webdriver will not be able to click on Logout button and throws a perfect exception stating other element would receive the click.
Solution:
- You need to wait till toaster message disappears. And we know how to wait in selenium.
- To solve above issue, You must use wait provided by selenium. Now you will ask which wait we should use?
- Thread.sleep(value): It is not advisable. You never know how much time you need to make webdriver sleep. It might increase your test execution time drastically and would not serve purpose always.
- Implicit wait: This will not work always. Implicit wait will make webdriver wait till it does not find it. Here issue is that webdriver finds web element but could not click on it or element i snot visible. Implicit wait can not stop webdriver once web element is found. This wait does not bother if element is displayed or not.
- Explicit wait: This is called dynamic wait and we should use it. ExpectedConditions class provides so many condition till you want to wait. We have condition which we can use to wait till element is displayed. It will make webdriver wait till element is displayed on UI not till the time element is found.
Sample code:
WebDriverWait wait= new WebDriverWait(driver,15);
wait.until(ExpectedConditions.visibilityOf(element));
4. Fluent wait: This is the best wait I feel. It provides you flexibility to create your own condition to wait for.
Note: If you want to learn more about waits in selenium , refer below links:
Part 5: Waits In Selenium: What Happens When We Mix Sleep With Other Types Of Waits ?
Are You Mixing Waits In Selenium WebDriver? – A Bad Practise
Reason No 03: Ajax calls
- AJAX stands for Asynchronous JavaScript And XML and allows web pages to be updated asynchronously by exchanging data with a web server behind the scenes. This means that it is possible to update parts of a web page, without reloading the whole page.
- Selenium can recognize and wait when whole page is loading but can not recognize loading through AJAX calls.
- When AJAX calls are in progress and you want to perform some action on a web element which is still loading because of AJAX calls. In this case, you can get NoSuchElementException or Element is not clickable(If action is click) or Element is not visible exceptions.
Solution:
- Solution is same as I explained in Reason No 02.
Reason No 04: Webdriver is unable to auto scroll to desired element
- Consider a web page which has vertical scroll bar. You need to perform an action on web element which shows up in visible area when user scroll down.
- Webdriver generally auto scrolls to element and perform desired operations.
- Sometimes, webdriver is not able to do so. In this case, you might get element not visible or element is not clickable(if action is click).
Solution:
- You need to scroll to element using javascript or Actions class so that element is perfectly visible on screen.
- By using explicit wait and fluent wait as mentioned above.
Sample code:
Javascript ways to scroll to element:
JavascriptExecutor je = (JavascriptExecutor) driver;
je.executeScript("arguments[0].scrollIntoView(true);", element);
Actions class:
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();
There might be more reasons behind these exceptions which I will add here if I get to know. If you are aware, Share through comment because sharing knowledge is always a good thing.
If you have any doubt, feel free to ask here.
If you like my posts, please like, comment, share and subscribe.
#ThanksForReading
#HappySelenium
Amod You are God of Selenium like Naveen. Even I had attended his online batch, he had not told so many things. I am learning a lot from your blog. God bless you dear.
This was informative! thanks for sharing 🙂
Was looking something in detail regarding Selenium exceptions and more importantly how to resolve them.
Thanks for this great explanation.
explanation of every scenario and their solution is perfect.. thanks for sharing your knowledge
Thanks Diksha.
Great Explation .very Useful
Thanks Swethana