当implicitly_wait不起作用时,使用find_element_by_link_text的NoSuchElement异常?

时间:2012-10-15 23:57:19

标签: python selenium selenium-webdriver

python和Selenium的新手以及针对此问题的编程。

我正在尝试自动化selenium以达到特定链接。在这种情况下,我希望它能够点击与链接文本“B”相关联的链接:

<li><a href="javascript:__doPostBack(&#39;ctl00$IndexControl1&#39;,&#39;B&#39;)">B</a>

在这个网站上:

http://www.lw.com

我正在使用此代码:

def get_single_link_using_find_elements_by_link_name(url, link_name):
    driver = webdriver.Firefox()
    driver.get(url)
    driver.implicitly_wait(10)
    time.sleep(20)
    element = driver.find_element_by_link_text(link_name)
    element.click()

我添加了一些等待条件,因为我认为问题可能是渲染问题,但它们没有帮助。

我收到以下错误:

Traceback (most recent call last):
  File "C:\Python27\programs\selenium commands.py", line 50, in <module>
    get_single_link_using_find_elements_by_link_name(url, link_name)
  File "C:\Python27\programs\selenium commands.py", line 47, in get_single_link_using_find_elements_by_link_name
    element = driver.find_element_by_link_text(link_name)
  File "C:\Python27\lib\site-packages\selenium-2.25.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 237, in find_element_by_link_text
    return self.find_element(by=By.LINK_TEXT, value=link_text)
  File "C:\Python27\lib\site-packages\selenium-2.25.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 671, in find_element
    {'using': by, 'value': value})['value']
  File "C:\Python27\lib\site-packages\selenium-2.25.0-py2.7.egg\selenium\webdriver\remote\webdriver.py", line 156, in execute
    self.error_handler.check_response(response)
  File "C:\Python27\lib\site-packages\selenium-2.25.0-py2.7.egg\selenium\webdriver\remote\errorhandler.py", line 147, in check_response
    raise exception_class(message, screen, stacktrace)
NoSuchElementException: Message: u'Unable to locate element: {"method":"link text","selector":"B"}'

奇怪的是,相同的代码WORKS在以下url上,它是同一站点的一部分: http://www.lw.com/people?searchIndex=A

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

  1. 当我传递一个包含字母列表索引的页面时,您的代码适用于我。这意味着您将错误的变量传递给函数 - 您传入的页面,没有名为'B'的链接,简单明了。

  2. 您可以通过拨打driver.find_element_by_id("IndexControl1")来检查网页上是否有字母。 IndexControl1是包含字母内容的id的名称。

    alphabet = driver.find_element_by_id("IndexControl1")
    link_b = alphabet.find_element_by_link_text("B")
    
  3. 顺便说一句,需要注意的是,如果您已经在选择了“B”的页面上,例如http://www.lw.com/people?searchIndex=B&esmode=1,字母B没有显示作为链接,在这种情况下,您最终会得到NoSuchElementException

  4. 我认为这几乎涵盖了NoSuchElementException可能弹出的每一种情况。祝你好运。