Подтвердить что ты не робот

Как правильно использовать find_element_by_link_text(), чтобы не поднимать NoSuchElementException?

У меня есть HTML-код, подобный этому:

<div class="links nopreview"><span><a class="csiAction"
href="/WebAccess/home.html#URL=centric://REFLECTION/INSTANCE/_CS_Data/null">Home</a></span>&nbsp;•&nbsp;<span><span><a class="csiAction"
href="/WebAccess/home.html#URL=centric://SITEADMIN/_CS_Site">Setup</a></span>&nbsp;•&nbsp;</span><span><a
title="Sign Out" class="csiAction csiActionLink">Sign Out</a></span></div>

Я бы хотел нажать ссылку, содержащую текст Главная. Поскольку эта Домашняя ссылка появляется после входа в систему, у меня есть такой код:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import re

browser = webdriver.Firefox() # Get local session of firefox
browser.get("http://myServer/WebAccess/login.html") # Load App page
elem = browser.find_element_by_name("LoginID") # Find the Login box
elem.send_keys("Administrator")
elem = browser.find_element_by_name("Password") # Find the Password box
elem.send_keys("Administrator" + Keys.RETURN)
#try:
elem = browser.find_element_by_link_text("Home")
elem.click()

Часть до входа в систему отлично работает. Однако последняя, ​​но одна строка проблематична.

elem = browser.find_element_by_link_text("Home")

Он вызывает это исключение NoSuchElementException, где ссылка Home находится там, где вы можете видеть из HTML-кода.

raise exception_class(message, screen, stacktrace)
NoSuchElementException: Message: u'Unable to locate element: {"method":"link text","selector":"Home"}' 

Любые указания относительно того, что я делаю неправильно, пожалуйста?

4b9b3361

Ответ 1

Вы пытались добавить неявное ожидание этого, чтобы он быстро ждал, чтобы быстро выполнить.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import re

browser = webdriver.Firefox() # Get local session of firefox

browser.implicitly_wait(10) #wait 10 seconds when doing a find_element before carrying on

browser.get("http://myServer/WebAccess/login.html") # Load App page
elem = browser.find_element_by_name("LoginID") # Find the Login box
elem.send_keys("Administrator")
elem = browser.find_element_by_name("Password") # Find the Password box
elem.send_keys("Administrator" + Keys.RETURN)
#try:
elem = browser.find_element_by_link_text("Home")
elem.click()

Вызов implicitly_wait делает опрос браузера до тех пор, пока элемент не будет на странице и не будет видимым для взаимодействия с.

Ответ 2

Возможно, элемент, который вы ищете, точно не соответствует этой текстовой строке? Я знаю, что это может быть сложно, если это похоже на экран, но иногда есть такие странности, как эта простая разметка " H ome" или "Home", которая делает первый char курсив:

"<i>H</i>ome" is visually identical to "<em>H</em>ome" but does not match text.

Изменить: после написания вышеприведенного ответа я изучил вопрос ближе и обнаружил, что образец HTML показывает "Домой" в виде простого текста, но не был видимым из-за длинных строк, которые не обертываются. Поэтому я отредактировал OP, чтобы обернуть строку для удобства чтения.

Новое наблюдение: я заметил, что элемент "Выход" имеет атрибут "title", но элемент "Главная ссылка" отсутствует, попробуйте дать ему один и использовать его.

Ответ 3

Наиболее распространенные проблемы с NoSuchElementException, пока есть элемент:

Решение может включать:

  • проверьте, используете ли вы правый фрейм/окно: driver.window_handles,
  • написать ожидающую оболочку для ожидания появления элемента,
  • попробуйте XPath вместо: driver.find_element_by_xpath(u'//a[text()="Foo"]').click(),
  • используйте pdb, чтобы более эффективно диагностировать вашу проблему.

См. также: Как найти_element_by_link_text при наличии: Исключение NoSuchElement?

Ответ 4

Попробуйте добавить неявное ожидание этого, чтобы ждать, а не работать слишком быстро. Или иначе вы можете import time и использовать time.sleep(25)