What is StaleElementReferenceException in Selenium Webdriver

Stale means old, decayed, no longer fresh. Stale Element means an old element or no 
longer available element. Assume there is an element that is found on a web page referenced
as a WebElement in WebDriver. If the DOM changes then the WebElement goes stale. If we try 
to interact with an element which is staled then the StaleElementReferenceException is thrown.
  
  
What are the Causes of StaleElement Exception
We face this stale element reference exception when the element we are interacting with is destroyed 
and then recreated again. When this happens the reference of the element in the DOM becomes stale. 
Hence we are not able to get the reference to the element.
  
  
Cause 1: The referenced web element has been deleted completely. 
Cause 2: The referenced element is no longer attached to the DOM
  

How To Overcome Stale Element Reference Exception in Selenium:
  
Solution 1: Refreshing the web page
driver.navigate().refersh();
driver.findElement(By.xpath("xpath here")).click();
  
Solution 2: Using Try Catch Block
  for(int i=0; i<=2;i++){
  try{
     driver.findElement(By.xpath("xpath here")).click();
     break;
  }
  catch(Exception e){
     Sysout(e.getMessage());
  }
}
                         
Solution 3: Using ExpectedConditions.refreshed                         
  
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("table")));
                         
Solution 4: Using POM
We could avoid StaleElementException using POM. In POM, we use initElements() method which
loads the element but it won’t initialize elements. initElements() 
takes latest address. It initializes during run time when we try to 
perform any action on an element. This process is also known as Lazy Initialization.