When things go awry: Exceptions in Selenium
Has it happened to you that you went to a restaurant to have a nice dinner and
when it’s time to pay the bill, you realize that you have forgotten your wallet at
home? This will be called Wallet Not Found exception in real life. Similarly, there
are instances in Selenium when you intend your code to do something, but it does
not do as expected. They are called exceptions.
When an exception occurs, your program flow disrupts, and it can halt your
execution. A programmer should always handle checked exceptions. To handle
exceptions, you should understand what this exception is and how to
handle/resolve it.
I will talk about some common exceptions in WebDriver and will discuss their
resolutions.
StaleElementReferenceException:
When the element that you are trying to perform an operation on is no
longer present on the page or DOM has been refreshed then this exception
is thrown. A real time scenario is when you click on submit button with
invalid username and password. And then again when you click on submit
button with valid username and password then you will get
StaleElementReferenceException.
For example:
WebElement username = driver.findElement(By.id("username"));
WebElement pwd = driver.findElement(By.id("password"));
WebElement submitBtn = driver.findElement(By.id("submit"));
username.sendKeys("invalidUserName");
pwd.sendKeys("invalidPassword");
submitBtn.click();
username.sendKeys("validUserName");
pwd.sendKeys("validPassword");
submitBtn.click();
Resolution: This exception can be resolved by re allocating the element to
reference variable. For example, in order to avoid exception you will have to
reallocate username, password and submit button again before performing
scenario with valid username, password.
"username"));
username = driver.findElement(By.id(
pwd = driver.findElement(By.id("password"));
"submit"));
submitBtn = driver.findElement(By.id(
username.sendKeys("validUserName");
pwd.sendKeys("validPassword");
submitBtn.click();
Another standard way of handling this exception is using Page Factory pattern. If
you use Page Factory pattern in your framework then this exception will not
occur. The reason is Page Factory does lazy initialization of Web Element. It
searches for element every time when you perform an operation on it. So, every
time you want to click or type on an element, it reallocates it.
P.S: Do not use @CacheLookup annotation with your element in Page Factory
pattern because @CacheLookup annotation caches your element and does not
search it again.
NoSuchElementException:
This is also one of the most common exception in WebDriver. This exception
class is the subclass of NotFoundException class. The reason is your element is
no accessible to your code. This occurs because you have given an incorrect
locator, element is inside the frame or the element is not loaded.
Resolution:
● First, check if element is indeed on the page.
● Then check if there is any spelling mistake or syntax error in your
locator.
● If element is inside frame, then you need to switch to frame to access
this element.
● If element is not loaded due to synchronization issue, then you will have
to give some wait time to handle this exception. Refer my article on
waits here.
ElementNotVisibleException:
This exception occurs when an element is present in the DOM but it is not
visible on the web page. This exception class is subclass of
ElementNotInteractableException c lass. It could be that either element is
hidden, or it not properly loaded. So, when WebDriver tries to perform
operation on such element then this exception is thrown.
Resolution:
Try to give some wait time before performing operation on the element so
that it becomes visible on the web page. Use visibilityOf(WebElement
element) method of WebDriverWait class to ensure visibility of the element. If
it is hidden, then with the help of indexing try to find locator that is displayed
on the page.
ElementNotSelectableException:
This exception is subclass of InvalidElementStateException class. This occurs
because an element is present in the DOM but can not be selected on the web
page. This could be because the element is either disabled or already in
selected state.
Resolution:
● Give some wait time to make element selectable.
● Use driver.isEnabled() method to check if element is disabled. If its
disabled do not perform operation to avoid exception.
● Use driver.isSelected() method to check if element is already selected. If
its selected do not perform operation to avoid exception.
Element is not clickable at point (xx, xx). Other element would
receive the click:
I have mentioned this WebDriver exception here because I have faced it in real
time. And you also might have faced it. This occurs when your element is
obfuscated by some other div or images. And due to this it does not receive
click properly.
Resolution:
● Use click from the action class because it clicks in the middle of the
element.
Actions action = new Actions(driver);
action.moveToElement(element).click().perform();
● Use click from JavaScriptExecutor class.
InvalidSelectorException:
This exception is subclass of NoSuchElementException class. This exception
occurs when there is syntax error in your Xpath or CSS Selector. Or when you
have used By.id(), By.name(), By.className() etc but passing Xpath or CSS
Selector.
Resolution:
This is one of the simplest exceptions to resolve. You just need to check your
locator and methods and make sure they are correct.
NoSuchSessionException:
This exception is subclass of WebDriverException class. This occurs when
your browser is crashes, your driver.exe crashes or you execute a piece of
code after driver.quit().
Resolution:
● Always use stable version of browser and driver.exe
● Perform driver.quit() only in after or teardown methods.
Compound class names not permitted:
This is part of WebDriverException. I have mentioned it here
because you might be frequently getting it if you are using class
name as your locator. This occurs when you have spaces in your
class name.
Resolution:
Replace spaces in your class name with . and this exception will go away.
NoAlertPresentException:
This exception is subclass of NotFoundException class. This occurs when you
are trying to accept, dismiss an alert or read text from an alert that is not yet
displayed.
Resolution:
You can use a method to check whether Alert has opened.
oolean isAlertPresent() {
public b
try {
driver.switchTo().alert();
return true;
}catch(NoAlertPresentException e) {
return false;
}
If this method returns true you can accept, dismiss or read text from the alert.
If this method returns false, then you can give a wait time to let alert display.
There are huge number of exceptions in Selenium. You can find a complete list
from official documentation here. I have given an overview of common
😊
exceptions and their resolutions. That’s it for now. I will be back with some
more knowledge sharing articles. Happy reading!