如何正确使用find_element_by_link_text()不引发NoSuchElementException?

时间:2011-08-04 04:23:32

标签: python selenium selenium-webdriver

我有这样的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 个答案:

答案 0 :(得分:13)

您是否尝试过向此添加隐式等待,以便等待而不是快速运行。

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调用会使浏览器进行投票,直到该项目在页面上并且可以与其进行交互。

答案 1 :(得分:3)

元素存在时NoSuchElementException最常见的问题是:

解决方案可能包括:

  • 检查您是否使用了正确的框架/窗口:driver.window_handles
  • 编写等待包装器以等待元素出现,
  • 尝试使用XPath,例如:driver.find_element_by_xpath(u'//a[text()="Foo"]').click()
  • 使用pdb更有效地诊断您的问题。

另请参阅:How to find_element_by_link_text while having: NoSuchElement Exception?

答案 2 :(得分:2)

也许您要查找的元素与该文本字符串不完全匹配? 我知道如果它看起来像在屏幕上,它可能会很棘手,但有时会像这个简单的标记“ H ome”或“ H ome”那样嵌入奇怪的东西制作第一个字符斜体:

"<i>H</i>ome" is visually identical to "<em>H</em>ome" but does not match text.
编辑:在写完上面的答案之后,我更仔细地研究了这个问题并发现HTML样本确实以纯文本显示“Home”,但由于长行没有包装而不可见。因此,我编辑了OP以包含该行以便于阅读。

新观察:我注意到Logout元素有一个“title”属性,但Home链接元素缺少这样的属性 - 尝试给它一个并使用它。

答案 3 :(得分:1)

尝试添加隐式等待以便等待,而不是运行得太快。 要么 否则你可以import time并使用time.sleep(25)