улавливание ошибок в python с помощью try, кроме

#python #selenium #error-handling #try-catch

Вопрос:

У меня есть следующий код:

 from selenium.webdriver import Firefox
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from selenium.common.exceptions import NoSuchElementException
import time

while True:
    try:
        
        url = 'https://finance.yahoo.com/'
        driver_path = 'C:\Users\inder\geckodriver.exe'
        
        browser = Firefox(executable_path = driver_path)
        browser.get(url)
        
        search_field_id = 'yfin-usr-qry'
        
        element_search_field = browser.find_element_by_id(search_field_id)
        element_search_field.clear()
        element_search_field.send_keys('TSLA')
        element_search_field.send_keys(Keys.ENTER)
        time.sleep(5)
        xpath_string = '/html/body/div[1]/div/div/div[1]/div/div[2]/div/div/div[6]/div/div/section/div/ul/li[2]/a/span'
        element = browser.find_element_by_xpath(xpath_string)
        action_chains = ActionChains(browser)
        action_chains.move_to_element(element).click().perform()
        break
    except NoSuchElementException as e:
        print(e)
        pass
    
    
   
 

Этот код работает нормально, я пытаюсь сделать следующее: если по какой-то причине страница загрузилась неправильно, я хотел бы, чтобы весь блок кода был запущен снова.
Для этого я определил поле поиска element_search_field . Если элемент обычно не найден, я получу сообщение об ошибке:

 NoSuchElementException: Unable to locate element: /html/body/div[1]/div/div/div[1]/div/div[2]/div/div/div[6]/div/div/section/div/ul/li[2]/a/span
 

Однако, когда я пытаюсь поймать это исключение с помощью приведенного выше кода, я получаю сообщение об ошибке:

 NameError: name 'NoSuchElementException' is not defined
 

Пожалуйста, посоветуйте, что я могу сделать, чтобы решить эту проблему.

Комментарии:

1. Похоже, вам не хватает какого-то импорта. Вы можете проверить?

2. Это весь мой код. О каком импорте вы говорите?

Ответ №1:

Вы используете pycharm? Если вы используете pycharm,он напомнит вам, что код неверен, вы должны это сделать.

 from selenium.common.exceptions import NoSuchElementException
 

И я не могу найти переменную declare action_chains в вашем коде.Это похоже на ошибку

Комментарии:

1. Есть ли еще какие-то проблемы? Я рекомендую инициализировать в начале, а не в то время как. например, браузер = Firefox(путь к исполняемому файлу = путь к драйверу)… вы просто хотите повторить действие, если оно не удалось. Есть еще один способ сделать это. определение a(): попробуйте: печать (), за исключением исключения как e: печать(e) a()

Ответ №2:

У меня самого этой проблемы не было, но в документации Selenium перечислены распространенные исключения. Так что, может быть, ты сможешь попробовать:

from selenium.common.exceptions import NoSuchElementException

Комментарии:

1. Код не сломался и работает в цикле. Разве она не должна сломаться ?

2. Хм, похоже, вы используете pass ключевое слово в обработчике исключений, что означает, что цикл будет выполняться до тех пор, пока исключение больше не возникнет. Возможно, это означает, что ваш код не может найти нужный ему элемент в блоке try? Какую среду разработки вы используете? Если вы используете spyder, вы можете установить точку останова и выполнить пошаговый код, чтобы узнать, достигнете ли вы когда-нибудь линии останова. Я надеюсь, что это поможет!

3. Спайдер. я даже ввел режим сна, чтобы он загружался. Но все равно он загружает несколько экземпляров, прежде чем окончательно отключится

4. Я думаю, что, возможно, линия: xpath_string = '/html/body/div[1]/div/div/div[1]/div/div[2]/div/div/div[6]/div/div/section/div/ul/li[2]/a/span' работает не так, как вы ожидаете? Попробуйте установить точку останова и выполнить пошаговое выполнение кода. Если он продолжает повторять цикл несколько раз и продолжает вызывать ошибку, то он никогда не сможет найти элемент. Попробуйте этот подход, одновременно визуально ссылаясь на html, который вы просматриваете в консоли разработчика вашего браузера. Если вы можете подтвердить, что нужный вам элемент есть, но эта строка все равно выдает ошибку, вам нужно будет изменить XPath