【问题标题】:Extract Text from TD/B HTML tag ,xpath="//table[@class='table']/tbody/tr[1]/td从 TD/B HTML 标签中提取文本 ,xpath="//table[@class='table']/tbody/tr[1]/td
【发布时间】:2018-09-06 21:58:00
【问题描述】:

我正在尝试提取文本“2000”并将其存储在 HTML 下方的字符串中:

<table class="table" _ngcontent-c13="">
    <tbody _ngcontent-c13="">
        <tr _ngcontent-c13="">
            <th _ngcontent-c13="" scope="row">Amount</th>
            <td class="" _ngcontent-c13="">
                <b _ngcontent-c13="">$2000</b>
            </td>  <!-- Added by edit -->
        </tr>      <!-- Added by edit -->
    </tbody>       <!-- Added by edit -->
</table>           <!-- Added by edit -->

我在 XPath 下尝试,但它返回 null:

String text= driver.findelement(by.xpath("xpath="//table[@class='table']/tbody/tr[1]/td")).getAttribute("value")

【问题讨论】:

  • 该代码不会返回 null,它甚至不会编译。请花一点时间用您正在使用的实际代码更新您的问题。

标签: java selenium-webdriver xpath


【解决方案1】:

首先你需要getText(),而不是属性。 其次,您需要&lt;b 元素的文本,而不是&lt;td。 你也不需要 xpath 中的xpath= 最后,XPath 可以改进:

  • 消除了您不关心的元素(例如tbody
  • 不要使用像tr[1] 这样的索引,它们会使xpath 容易被破坏。而是使用一些有意义的定位器。在这种特殊情况下,您似乎想找到&lt;td,其&lt;th 表示Amount

所以是这样的:

String text= driver
    .findElement(
        By.xpath("//table[@class='table']//th[text()='Amount']/../td/b"))
    .getText();

【讨论】:

    【解决方案2】:

    要仅匹配文本“$2000”,您可以使用此 XPath 表达式:

    //table[@class='table']/tbody/tr[1]/td/b
    

    要删除“$”或第一个字符,请使用以下 XPath 表达式:

    substring(//table[@class='table']/tbody/tr[1]/td/b,2)
    

    要获取这些值,请不要使用.getAttribute("value"),因为这些值没有属性。请改用.getText()。 (我还删除了ByfindElement的错字):

    String text= driver.findElement(By.xpath("substring(//table[@class='table']/tbody/tr[1]/td/b,2)")).getText();
    

    【讨论】:

      【解决方案3】:

      您是否尝试将&lt;b&gt; 元素添加到xpath?此外,getAttribute() 获取 HTML 标签中的属性,而不是标签内的值。您需要 getText() 函数。参考本帖:Difference b/w getText() and getAttribute() in Selenium WebDriver?

      TL;DR:试试这个:

      String text = driver.findelement(by.xpath("xpath="//table[@class='table']/tbody/tr[1]/td/b")).getText()

      这应该返回$2000,并且您可以轻松剥离$。

      【讨论】: