Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check for a stale element using selenium 2?

Using selenium 2, is there a way to test if an element is stale?

Suppose I initiate a transition from one page to another (A -> B). I then select element X and test it. Suppose element X exists on both A and B.

Intermittently, X is selected from A before the page transition happens and not tested until after going to B, raising a StaleElementReferenceException. It's easy to check for this condition:

try:
  visit_B()
  element = driver.find_element_by_id('X')  # Whoops, we're still on A
  element.click() 
except StaleElementReferenceException:
  element = driver.find_element_by_id('X')  # Now we're on B
  element.click()

But I'd rather do:

element = driver.find_element_by_id('X') # Get the elment on A
visit_B()
WebDriverWait(element, 2).until(lambda element: is_stale(element))
element = driver.find_element_by_id('X') # Get element on B
like image 621
Michael Mata Avatar asked Nov 14 '22 12:11

Michael Mata


1 Answers

I don't know what language you are using there but the basic idea you need in order to solve this is:

boolean found = false
set implicit wait to 5 seconds
loop while not found 
try
  element.click()
  found = true
catch StaleElementReferenceException
  print message
  found = false
  wait a few seconds
end loop
set implicit wait back to default

NOTE: Of course, most people don't do it this way. Most of the time people use the ExpectedConditions class but, in cases where the exceptions need to be handled better this method ( I state above) might work better.

like image 64
djangofan Avatar answered Jan 02 '23 14:01

djangofan