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)

Ссылка