XPath V1.0包含()不够具体

时间:2017-12-24 19:33:55

标签: xpath

我有一个应用程序需要我为元素找到XPath选择器,然后查看是否可以简化该XPath。

所以,如果我有

<a class="abc def gh">

我可以确定XPath

a[contains(@class, "abc") 

足够具体。问题是,它还选择了带有&#34; abcxyz&#34;,

的项目

有没有办法选择只有课程&#34; abc&#34;?

的项目

即。我觉得它很清楚,但我想找到一类具有&#34; abc&#34;或&#34; abc def&#34;但不是&#34; abcxyz&#34;。

这是一个更具体的例子,因为我认为到目前为止这两个答案都不起作用:

<div>
    <span id="x" class="btnSalePriceLabel">Sale:</span> 
    <span id="y" class="btnSalePrice highlight">$20.40</span>
</div>

我希望XPath选择器选择第二个跨度而不是第一个跨度。

如果我尝试

//span[@class and contains(concat(' ', normalize-space(@class), ' '), ' btnSalesPrice ')]

我没有选择任何东西。与

一样
//span[contains(concat(' ', normalize-space(@class), ' '), ' btnSalesPrice ')]

2 个答案:

答案 0 :(得分:1)

由于class属性是多值属性,您必须account for these spaces between the values with concat()

//a[contains(concat(' ', normalize-space(@class), ' '), ' abc ')]

请注意, CSS选择器具有匹配内置特定类值的能力:

a.abc

我认为你可以看到更简洁和可读的内容。

答案 1 :(得分:1)

最好使用css进行此完全匹配,特别是class属性,在这种情况下,它会是:

a.abc

您可以在多种语言上使用不同的css-to-xpath转换器(请查看this one for example on javascript),其转换将是:

descendant-or-self::a[@class and contains(concat(' ', normalize-space(@class), ' '), ' abc ')]