Selenium Webdriver - NoSuchElementExceptions
Я использую библиотеку тестирования модуля python (unittest) с помощью selenium webdriver. Я пытаюсь найти элемент по его имени. Примерно в половине случаев тесты вызывают исключение NoSuchElementException, а в другое время он не генерирует исключение.
Мне было интересно, не связано ли это с веб-селенером селена, не дожидаясь достаточно долгого времени, чтобы загрузить страницу.
Ответы
Ответ 1
driver = webdriver.WhatEverBrowser()
driver.implicitly_wait(60) # This line will cause it to search for 60 seconds
его нужно только вставить в свой код один раз (я обычно делаю это сразу после создания объекта webdriver)
например, если ваша страница по какой-то причине занимает 30 секунд для загрузки (покупка нового сервера), и этот элемент является одной из последних вещей, отображаемых на странице, он в значительной степени просто проверяет снова и снова снова, если элемент существует в течение 60 секунд, ТОГДА, если он его не найдет, он выдает исключение.
также убедитесь, что ваша область правильная, т.е. если вы сосредоточены на кадре, а элемент, который вы ищете, НЕ находится в этом фрейме, он НЕ найдет его.
Ответ 2
Я тоже это вижу. Я просто жду его...
вы можете попробовать:
while True:
try:
x = driver.find_by_name('some_name')
break
except NoSuchElementException:
time.sleep(1)
# possibly use driver.get() again if needed
Кроме того, попробуйте обновить селен до последней версии с помощью pip install --update selenium
Ответ 3
Я поставил свои деньги на фрейм, так как раньше у меня была аналогичная проблема:)
Проверьте свой html снова и проверьте, имеете ли вы дело с фреймом. Если это произойдет, то переход к правильному кадру сможет найти элемент.
Python
driver.switch_to_frame("frameName")
Затем найдите элемент.
Если нет, попробуйте поставить время ожидания, как предложили другие.
Ответ 4
Один способ обработки ожидающего появления элемента выглядит следующим образом:
import selenium.webdriver.support.ui as ui
wait = ui.WebDriverWait(driver,10)
wait.until(lambda driver: driver.find_by_name('some_name') )
elem = driver.find_by_name('some_name')
Вы правы, что webdriver не ждет загрузки страницы, нет встроенного ожидания по умолчанию для driver.get()
.
Ответ 5
Чтобы решить этот запрос, вы должны определить явное ожидание. так что до момента загрузки страницы он не будет искать какой-либо WebElement.
ниже url помочь в этом.
http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp
Ответ 6
Вам нужно иметь waitUntil (ваш элемент загружается). Если вы уверены, что ваш элемент в конечном итоге появится на странице, это гарантирует, что все проверки будут выполняться только после загрузки вашего ожидаемого элемента.
Ответ 7
Я чувствую, что это может быть проблема синхронизации (например, скорость webdriver и скорость приложения несовместимы)
Использовать неявное ожидание:
driver.manage.timeouts.implicitlyWait(9000 TIMEUNITS.miliseconds)
Ссылка