【问题标题】:Selenium Python : find element whose href attribute has required keywordSelenium Python:查找其href属性具有必需关键字的元素
【发布时间】:2014-08-16 03:57:06
【问题描述】:

我正在处理的页面位于 this link

这是该页面的相关部分:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
  <head>...</head>
  <body>
    ...
    <div id="searchResults">
      <div class="box-related">...</div>
      <a href='downloadDataServlet?category=true&amp;type=epar' onclick=""><img src="/ema/images/icon_download_spread.gif" />Download results to spreadsheet</a>
      <div class="table-holder">
        <table class="table-epar eparResults" border="1" cellpadding="0" cellspacing="0" summary="Search results for EPARs ordered alphabetically">
          <caption>EPAR Search results</caption>
          <thead> ... </thead>
          <tbody>
            <tr>
              <th scope="row" class="key-detail name word-wrap">
                <a href="index.jsp?curl=pages/medicines/human/medicines/000471/human_med_000619.jsp&amp;mid=WC0b01ac058001d124">Abilify</a>
              </th>
              ...
            </tr>
            <tr>...</tr>
          </tbody>
        </table>
      </div>
    </div>
  </body>
</html>

这是我希望选择的元素的 XPath 位置:

//*[@id="searchResults"]/div[2]/table/tbody/tr[1]/th/a

但是搜索页面上可能有很多结果,所以我想点击 URL 中包含我正在搜索的产品编号的链接(在本例中为 000471)。我想在href 属性中选择包含该字符串的&lt;a&gt; 元素。

这是我尝试过的:

inp = driver.find_element_by_xpath("//*[@id='searchResults']/div[2]/table/tbody/tr[1]/th/a[contains(@href,'"+str3+"')]")
inp.click()

在这种情况下,str3 的值为 000471。但我不断收到NoSuchElementException

任何帮助将不胜感激!

【问题讨论】:

  • 您链接的页面中没有字符串“searchResults”,因此使用它的 XPath 表达式永远不会找到任何东西。
  • 我忘记添加我实际搜索的页面:ema.europa.eu/ema/…

标签: python selenium xpath


【解决方案1】:

该问题可能是由在重建表时插入源代码查看器或检查器的元素引起的。 tbody 标签通常在实际源代码中不存在时插入代码中。

如果您仍然可以获得想要选择的数据的唯一位置路径,则可以消除 XPath 中不必要的步骤。这可能就足够了:

//*[@id='searchResults']//a[contains(@href,'000471')]

如果其他步骤仍然需要,您可以尝试没有tbody

更新我还注意到您的搜索页面声明了一个命名空间:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    ...

默认命名空间的自动注册取决于实现。 XPath 要求所有选择器都使用命名空间进行限定。如果您的 selenium 实现不这样做,您需要注册命名空间/前缀映射,并为命名空间中的所有元素添加前缀(例如://h:table/h:tr/h:td)或 ignore 命名空间,使用通配符和比较谓词中的本地名称。

如果命名空间阻止你选择节点,你可以用这个表达式忽略它:

//*[@id='searchResults']//*[local-name() = 'a'][contains(@href,'000471')]

【讨论】:

  • 我尝试了使用@helderdarocha 提供的XPath 以及修剪后的//a[contains(@href,'000471')] 的页面,并且两者都有效!必须有其他事情发生 - 发布更多您的代码。
猜你喜欢
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 2020-10-30
  • 2021-06-12
  • 2018-12-24
  • 1970-01-01
相关资源
最近更新 更多