40

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 Answers 6

90

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
Sign up to request clarification or add additional context in comments.

Comments

28

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()

4 Comments

Isn't it much worse in terms of performance? I believe it's much easier to find an element by id rather than by xpath.
@SergeRogatch Agreed 100% but that's what OP had in their code so I replicated it. This is also 4 years ago and I like to think I've learned a lot since then and am more apt to bring up points like yours now in addition to "just answering the question".
Note that the methods .find_element{s,}_by_* have been removed, see stackoverflow.com/a/72754667/288875
Yes, this question was answered almost 10 years ago.
14

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

Comments

2

Handling Selenium NoSuchExpressionException

from selenium.common.exceptions import NoSuchElementException
try:
   elem = driver.find_element_by_xpath
   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

Comments

0

I will expand on @alexcharizamhard answer, for a specific situation.

If there is wrapper element of the click target, that aways exist, but not display if empty. Then we can do following:

wrapper_elem = driver.find_element_by_xpath(".//xpath_of_wrapper_elem")
if wrapper_elem.is_displayed():
    elem = wrapper_elem.find_element_by_xpath(".//xpath_of_elem]")
    elem.click()

This is much faster than find_elements_* in some situations. But again, this is applicable only if such wrapper elements always exist.

Comments

-2

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

if elem.is_displayed():
    elem.click()

1 Comment

This will throw if the element is not found.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.