21
votes

I am writing automation test in Selenium using Python. One element may or may not be present. I am trying to handle it with below code, it works when element is present. But script fails when element is not present, I want to continue to next statement if element is not present.

try:
       elem = driver.find_element_by_xpath(".//*[@id='SORM_TB_ACTION0']")
       elem.click()
except nosuchelementexception:
       pass

Error -

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element:{"method":"xpath","selector":".//*[@id='SORM_TB_ACTION0']"}
6

6 Answers

61
votes

Are you not importing the exception?

from selenium.common.exceptions import NoSuchElementException

try:
    elem = driver.find_element_by_xpath(".//*[@id='SORM_TB_ACTION0']")
    elem.click()
except NoSuchElementException:  #spelling error making this code not work as expected
    pass
18
votes

You can see if the element exists and then click it if it does. No need for exceptions. Note the plural "s" in .find_elements_*.

elem = driver.find_elements_by_xpath(".//*[@id='SORM_TB_ACTION0']")
if len(elem) > 0
    elem[0].click()
13
votes

the way you are doing it is fine.. you are just trying to catch the wrong exception. It is named NoSuchElementException not nosuchelementexception

0
votes

Handling Selenium NoSuchExpressionException

from selenium.common.exceptions import NoSuchElementException
try:
   candidate_Name = j.find_element_by_xpath('.//span[@aria-hidden="true"]').text
except NoSuchElementException:
       try:
          candidate_Name = j.find_element_by_xpath('.//a[@class="app-aware link"]').text
       except NoSuchElementException:
              candidate_Name = "NAN"
              pass
-1
votes

Why not simplify and use logic like this? No exceptions needed.

if elem.is_displayed():
    elem.click()
-1
votes

from selenium.common.exceptions import NoSuchElementException worked pretty well to me, solved the problem