#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