Как правильно использовать find_element_by_link_text (), чтобы не вызывать NoSuchElementException? - PullRequest
17 голосов
/ 04 августа 2011

У меня есть такой 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"}' 

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

Ответы [ 4 ]

13 голосов
/ 06 сентября 2011

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

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 вызывает опрос браузера, пока элемент не появится на странице и не будет виденвзаимодействовать с.

3 голосов
/ 18 мая 2015

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

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

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

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

2 голосов
/ 25 октября 2011

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

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

Редактировать: после написания приведенного выше ответа я внимательно изучил вопрос и обнаружил, что в примере HTML «Home» отображается в виде обычного текста, но его не было видно из-за отсутствия переноса длинных строк. Поэтому я отредактировал ОП для переноса строки для удобства чтения.

Новое наблюдение: я заметил, что элемент Logout имеет атрибут «title», но элементу Home link такого не хватает - попробуйте указать его и использовать.

1 голос
/ 19 мая 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...