【问题标题】:Finding an element with multiple   (Selenium webdriver Python 3) [duplicate]查找具有多个的元素(Selenium webdriver Python 3)[重复]
【发布时间】:2019-01-07 20:02:36
【问题描述】:

我正在使用 Selenium (Chrome) Webdriver (Python 3) 在名为“收件箱”的页面上找到一个按钮(然后单击它),但我反复收到“NoSuchElementException:消息:没有这样的元素:无法找到元素。”

这很可能是由于 html 中有许多不间断的空格 (&nbsp)(见下文):

         <tr>
            <td class="MENUCHOICE">
               "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                       " == $0
               <a href="main.do?action=inbox">Inbox</a>
            </td>

我尝试了几种方法来解决非破坏性空间,但尚未找到解决方案:

1)driver.find_element_by_link_text(' Inbox')(链接文字前加五个空格)

2)driver.find_element_by_xpath("//a[.='\u00A0\u00A0\u00A0\u00A0\u00A0Inbox']")

任何关于如何使用 Python 代码查找元素的建议将不胜感激。

更新:我应该提一下,完整的 HTML 代码中没有 iframe,我的代码中已经有一个 time.sleep(40) 以留出足够的时间让链接变为可点击.我只专注于不间断的空间,因为我已经尝试在不包括它们的情况下找到元素;以下是我尝试的一些示例(不考虑 &nbsp):

find_element_by_xpath('//td[@class=’MENUCHOICE’]//a[@href="main.do?action=inbox"]')
find_element_by_xpath('/html/body/table/tbody/tr[6]/td/a')
find_element_by_link_text('Inbox')
find_element_by_partial_link_text('Inb')
find_element_by_css_selector('body > table > tbody > tr:nth-child(6) > td > a')
find_element_by_css_selector("td.MENUCHOICE a[href='main.do?action=inbox']")

【问题讨论】:

  • 使用类名来查找你的元素怎么样?

标签: python selenium selenium-webdriver xpath css-selectors


【解决方案1】:

那些不间断的空格字符不是链接文本的一部分,所以你不需要将它们包含在锚选择器中......试试

driver.find_element_by_link_text('Inbox')  #  or driver.find_element_by_link_text('INBOX')

driver.find_element_by_xpath('//a[.="Inbox"]')

您可能还需要等待链接变为可点击:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//a[.="Inbox"]')))

【讨论】:

  • 我只关注不间断的空格字符,因为我已经尝试在不包括它们的情况下找到元素(您提到的方式)。我的完整代码中有一个 time.sleep(40),以便有足够的时间让链接变为可点击。
  • @Neuro_Prog ,如果它不是私有的,你能分享页面 URL 吗?
  • 不幸的是,该页面是 VPN 的一部分。但是,我确实在上一个问题中提供了页面的完整 HTML 代码以及我自己的代码:stackoverflow.com/q/52618687/7348723
  • @Neuro_Prog ,考虑到提供的 HTML driver.find_element_by_link_text('Inbox') 应该可以正常工作。我不知道您是如何使用 time.sleep(40) 的,所以很难判断出了什么问题。从我的回答中用WebDriverWait 试试那行,然后告诉我结果
  • 感谢您的帮助。不幸的是,我在运行实现时得到了 TimeoutException。我运行了'WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Inbox')))'。我之前在此页面上尝试显式等待时发生过这种情况。我也很难说出这里出了什么问题,因为我在当前设置的许多其他网站/页面上成功使用了 selenium
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2021-09-28
  • 2014-11-09
相关资源
最近更新 更多