【问题标题】:XPath V1.0 contains() not specific enoughXPath V1.0 contains() 不够具体
【发布时间】:2017-12-24 19:33:54
【问题描述】:

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

如果我有

<a class="abc def gh">

我可以确定 XPath

a[contains(@class, "abc") 

足够具体。问题是,它还选择了“abcxyz”类的项目,

有没有办法选择只有“abc”类的项目?

即我认为这很清楚,但我想找到具有“abc”或“abc def”但不具有“abcxyz”类的项目。

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

<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 ')]

【问题讨论】:

  • 澄清一下,如果可以的话,我会使用 css 选择器,但我只能使用 xpath

标签: xpath


【解决方案1】:

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

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

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

a.abc

我认为您可以看到更简洁易读的内容。

【讨论】:

  • 这似乎不适用于我添加的示例?也许我错过了什么。
【解决方案2】:

最好使用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 ')]

【讨论】:

  • 我认为这不适用于我的(添加的)特定示例?
  • @TroyWray 你的 xpath 应该包含 btnSalePrice 而不是 btnSalesPrice
  • 确实如此,对不起,我不得不接受另一个答案,因为 //a 更简洁,我相信同样准确
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多