【问题标题】:How to use find_element_by_link_text() properly to not raise NoSuchElementException?如何正确使用 find_element_by_link_text() 不引发 NoSuchElementException?
【发布时间】:2011-10-19 15:39:28
【问题描述】:

我有一个这样的 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>

我想点击带有文本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()

登录之前的部分效果很好。但是最后一行是有问题的

elem = browser.find_element_by_link_text("Home")

从 HTML 代码中可以看到,它会在 Home 链接所在的位置引发此 NoSuchElementException。

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

请指导我做错了什么?

【问题讨论】:

    标签: python selenium selenium-webdriver


    【解决方案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 调用使浏览器轮询,直到项目在页面上并且可见以进行交互。

    【讨论】:

    • 你也可以使用 time.sleep(sleep_time_in_seconds) 代替 browser.implicitly_wait(sleep_time_in_seconds)。
    • 不,time.sleep 和 browser.implicitly_wait 做的事情完全不同。 time.sleep 只等待 10 秒。 implicitely_wait 在 find 命令上触发,然后对其设置 10 秒超时。
    【解决方案2】:

    当元素存在时,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?

    【讨论】:

      【解决方案3】:

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

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

      编辑:在写完上述答案后,我仔细研究了这个问题,发现 HTML 示例确实以纯文本显示“Home”,但由于长行不换行而看不到。所以我编辑了 OP 以换行以提高可读性。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 显然这应该只是最后的手段。
        猜你喜欢
        • 2016-07-04
        • 2019-08-16
        • 2012-10-15
        • 2020-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 2021-03-06
        相关资源
        最近更新 更多