"和不包含"的Xpath语法

Mat*_*att 9 xpath qtp

这是我试图使用的XPath:

//div[contains(@class='xyz ng-binding ng-scope') and not(contains(@class = 'ng-hide'))]
Run Code Online (Sandbox Code Playgroud)

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

class="xyz ng-binding ng-scope typeA ng-hide"
class="xyz ng-binding ng-scope typeB ng-hide"
Run Code Online (Sandbox Code Playgroud)

我想选择在HTML或者是情况typeA或者typeB,但没有ng-hide.

Dan*_*ley 12

你可以这样做:

//div[(contains(@class,'typeA') or contains(@class,'typeB')) and not(contains(@class,'ng-hide'))]
Run Code Online (Sandbox Code Playgroud)

您还应该看一下如何在包含特定字符串的属性上匹配?看看为什么contains()上面的内容可能与你想要的完全不符.

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

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

它在XPath 2.0中要容易得多,但我不确定qtp是否支持它.如果你可以创建concat(' ',@class,' ')一个变量,你也可以清理XPath.

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

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


hxi*_*xin 5

在你的问题中,正如迈克尔·凯指出的那样,语法不正确。

如果我正确理解你的问题,你想要选择一个包含“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'))]
Run Code Online (Sandbox Code Playgroud)

我经常发现在这种情况下空格会导致问题。我见过一些属性在中间有前导和/或尾随空格和/或多个连续空格字符。使用归一化空间可以消除这个问题。

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

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