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

Bha*_*nan 18 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>
Run Code Online (Sandbox Code Playgroud)

我想点击包含文字Home的链接.由于登录后出现此主页链接,我有一个这样的代码:

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()
Run Code Online (Sandbox Code Playgroud)

登录之前的部分效果很好.然而,最后一行是有问题的

elem = browser.find_element_by_link_text("Home")
Run Code Online (Sandbox Code Playgroud)

它会引发此NoSuchElementException,其中Home链接就在那里,您可以从HTML代码中看到.

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

关于我做错了什么指导,拜托?

Aut*_*ter 14

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

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()
Run Code Online (Sandbox Code Playgroud)

implicitly_wait调用使浏览器轮询,直到该项目在页面上并且可见以进行交互.

  • 不, time.sleep 和 browser.implicitely_wait 做完全不同的事情。time.sleep 只是等待 10 秒。implicitly_wait 在 find 命令上触发,然后为其设置 10 秒超时。 (2认同)

ken*_*orb 5

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

解决方案可能包括:

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

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