Хобрук: Ваш путь к мастерству в программировании

Исключение NoSuchElement с использованием find_element_by_link_text, когда неявное_ожидание не работает?

Новичок в Python, Selenium и программировании, если уж на то пошло.

Я пытаюсь автоматизировать селен, чтобы перейти по определенной ссылке. В этом случае я хочу, чтобы он попал по ссылке, связанной с текстом ссылки «B»:

<li><a href="javascript:__doPostBack(&#39;ctl00$IndexControl1&#39;,&#39;B&#39;)">B</a>

на этом сайте:

http://www.lw.com

Я использую этот код:

def get_single_link_using_find_elements_by_link_name(url, link_name):
    driver = webdriver.Firefox()
    driver.get(url)
    driver.implicitly_wait(10)
    time.sleep(20)
    element = driver.find_element_by_link_text(link_name)
    element.click()

Я добавил несколько условий ожидания, так как думал, что проблема могла быть в рендеринге, но они не помогли.

Я получаю следующую ошибку:

Traceback (most recent call last):
  File "C:\Python27\programs\selenium commands.py", line 50, in <module>
    get_single_link_using_find_elements_by_link_name(url, link_name)
  File "C:\Python27\programs\selenium commands.py", line 47, in get_single_link_using_find_elements_by_link_name
    element = driver.find_element_by_link_text(link_name)
  File "C:\Python27\lib\site-packages\selenium-2.25.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 237, in find_element_by_link_text
    return self.find_element(by=By.LINK_TEXT, value=link_text)
  File "C:\Python27\lib\site-packages\selenium-2.25.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 671, in find_element
    {'using': by, 'value': value})['value']
  File "C:\Python27\lib\site-packages\selenium-2.25.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 156, in execute
    self.error_handler.check_response(response)
  File "C:\Python27\lib\site-packages\selenium-2.25.0-py2.7.egg\selenium\webdriver\remote\errorhandler.py", line 147, in check_response
    raise exception_class(message, screen, stacktrace)
NoSuchElementException: Message: u'Unable to locate element: {"method":"link text","selector":"B"}'

Как ни странно, тот же код РАБОТАЕТ на следующем URL-адресе, который является частью того же сайта: http://www.lw.com/people?searchIndex=A

Любые идеи?


Ответы:


1
  1. Ваш код работает для меня, когда я передаю ему страницу с алфавитным индексом. Это означает, что вы передаете функции неправильные переменные — на странице, которую вы передаете, нет ссылки с именем 'B', это просто и понятно.

  2. Вы можете проверить, есть ли на странице буквенное обозначение, позвонив по номеру driver.find_element_by_id("IndexControl1"). IndexControl1 — это имя id, в котором содержится буквенная вещь.

    alphabet = driver.find_element_by_id("IndexControl1")
    link_b = alphabet.find_element_by_link_text("B")
    
  3. Кстати, еще кое-что, на что следует обратить внимание, это то, что если вы уже находитесь на странице с выбранным «B», например. http://www.lw.com/people?searchIndex=B&esmode=1, буква B не отображается как ссылка, и в этом случае вы также получите NoSuchElementException.

Я думаю, что это охватывает практически все случаи, когда может появиться NoSuchElementException. Удачи.

16.10.2012
  • Спасибо за помощь. Проблема, с которой я столкнулся, заключается в том, что я знаю, что ссылка B находится на lw.com, потому что я вижу ее, когда Подтягиваю исходный код. Тем не менее, когда я запускаю свой код на lw.com, я получаю указанную выше ошибку. 16.10.2012
  • Это не работает на lw.com, потому что find_element_by_link_text и .click() указывают видимые объекты. find_element_by_link_text ничего не вернет, если текст не отображается в браузере. Просто потому, что он находится в источнике, он не отображается в браузере. Ссылка B, о которой вы говорите, является частью кнопки «Поиск людей» с включенным javascript в верхней части экрана. Вам нужно использовать driver.find_element_by_id("PeopleFinderLink") и ЗАТЕМ driver.find_element_by_link_text("B").click(), чтобы перейти по нужной ссылке. 16.10.2012
  • @NeilAggarwal считается вежливым либо проголосовать, либо «принять» ответ, когда он полезен. :) Добро пожаловать в stackoverflow. 16.10.2012
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..