以下是我尝试使用的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为typeA
或typeB
但没有ng-hide
的情况。
答案 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'))]