【问题标题】:How can I use xpath to find element with optional sub element?如何使用 xpath 查找带有可选子元素的元素?
【发布时间】:2016-09-07 20:33:13
【问题描述】:

我使用 Selenium 和 xpath 来获取某些元素。我有一个包含以下元素的 html 页面:

<td>A</td>
<td><em>B</em></td>

我尝试使用以下 xpath 表达式来查找 td 元素:

//td[contains(text(), 'A')] 
//td[contains(text(), 'B')]

表达式找到&lt;td&gt;A&lt;/td&gt;,但没有找到&lt;td&gt;&lt;em&gt;B&lt;/em&gt;&lt;/td&gt;

如何编写一个 xpath 表达式来查找既没有子元素又没有一个或多个子元素的 td 标签?

【问题讨论】:

    标签: selenium xpath


    【解决方案1】:

    试试这个

    //td[contains(., 'A')]
    //td[contains(., 'B')]
    

    这将返回 td 标签。和...之间的不同 。和 text() 你可以在这里参考 - XPath: difference between dot and text()

    【讨论】:

    • 请注意,此处使用 contains() 也将匹配 &lt;td&gt;AA&lt;/td&gt;&lt;td&gt;A monkey&lt;/td&gt; 等。这可能是可取的,也可能不是可取的。
    【解决方案2】:

    你需要understandTesting text() nodes vs string values in XPath的区别。

    这里要测试td的字符串值:

    //td[. = 'B']
    

    这样,两个

    <td>B</td>
    

    <td><em>B</em></td>
    

    无论em如何,都会被选中。

    【讨论】:

    • 谢谢,但我想要包含,而不是等于。
    【解决方案3】:

    你可以使用ancestor获取第一个&lt;td&gt;标签

    //*[contains(text(), 'A')]/ancestor::td[1]
    //*[contains(text(), 'B')]/ancestor::td[1]
    

    一般使用

    String text = "A";
    driver.findElement(By.xpath("//*[contains(text(), '" + text + "')]/ancestor::td[1]"));
    

    【讨论】:

    • 使用此选择器,它将返回最里面的标签,即 em 但人们正在寻找 td 标签。
    • 谢谢,但我只想要文本匹配的 td 元素。
    猜你喜欢
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多