Skip to main content
 首页 » 编程设计

python之当 implicitly_wait 不起作用时使用 find_element_by_link_text 的 NoSuchElement 异常

2025年05月04日8zhoujg

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"}' 

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

有什么想法吗?

请您参考如下方法:

  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 在这种情况下也是如此。

我认为这几乎涵盖了 NoSuchElementException 可能弹出的所有情况。祝你好运。