"的Xpath语法,而不包含"

时间:2014-10-29 21:11:00

标签: xpath qtp

以下是我尝试使用的XPath:

//div[contains(@class='xyz ng-binding ng-scope') and not(contains(@class = 'ng-hide'))]

我不确定这是正确的语法。基本上HTML看起来像:

class="xyz ng-binding ng-scope typeA ng-hide"
class="xyz ng-binding ng-scope typeB ng-hide"

我想选择HTML为typeAtypeB但没有ng-hide的情况。

4 个答案:

答案 0 :(得分:12)

你可以这样做:

//div[(contains(@class,'typeA') or contains(@class,'typeB')) and not(contains(@class,'ng-hide'))]

您还应该查看How can I match on an attribute that contains a certain string?,了解上述contains()可能与您的预期不符的原因。

例如,要真正匹配您的意图,您可以使用:

//div[(contains(concat(' ',@class,' '),' typeA ') or contains(concat(' ',@class,' '),' typeB ')) and not(contains(concat(' ',@class,' '),' ng-hide '))]

在XPath 2.0中更容易,但我不确定qtp是否支持它。如果你可以使concat(' ',@class,' ')变量,你也可以清理XPath。

这是一个2.0示例,以防万一:

//div[tokenize(@class,'\s')=('typeA','typeB') and not(tokenize(@class,'\s')='ng-hide')]

答案 1 :(得分:1)

contains()是一个带有两个参数的函数:如果B是A的子字符串,则contains(A,B)返回true。

因此,如果您将“=”替换为“,”contains(@class, 'X')代替contains(@class = 'X'),则您的语法将变为有效。但我不知道它是否会对所有可能的输入数据做你想要的 - 这是一个不同的问题。

答案 2 :(得分:0)

在你的问题中,Michael Kay指出的语法不正确。

如果我正确理解了您的问题,您想要选择一个包含“xyz ng-binding ng-scope”而不是“ng-hide”的类,无论它是否包含“typeA”,“typeB”。

我会用这样的东西:

//div[contains(normalize-space(@class), 'xyz ng-binding ng-scope') and not(contains(@class, 'ng-hide'))]

我经常发现空间在这种情况下会引起问题。我已经看到在中间有前导和/或尾随空格和/或多个连续空格字符的属性。使用标准化空间消除了这个问题。

另一件事是,如果QTP给我们多个匹配错误,我们可以使用这个技巧来查看xpath是否正常工作。然后继续努力寻找正确的。

(//div[contains(normalize-space(@class), 'xyz ng-binding ng-scope') and not(contains(@class, 'ng-hide'))])[1]

答案 3 :(得分:-1)

您可以将此表达式用于XPATH并包含:

//div[contains(@class, 'xyz ng-binding ng-scope')]

只在容器中使用,而不是=

,当您想将其与not contain结合使用时,可以将此表达式用于不包含:not(expression)函数。 最后:

//div[contains(@class, 'xyz ng-binding ng-scope') and not(contains(@class , 'ng-hide'))]