如何在xpath中使用(和)和(或)

时间:2018-06-14 21:39:07

标签: html selenium xpath

我正在尝试使用(和)和(或)两个表达式一起创建一个xpath,但是没有获得成功。

  1. 我想要抓住产品价格,但有些价格为.//p/span[@class='currency-value'],而其他价格为.//p/span/span[@class='currency-value'],所以我想使用OR exprssion
  2. 而且我不想要产品用于广告的价格,所以我使用的是.//span[not(contains(text(),'Ad'))]
  3. 我在xpath下面尝试过但是没有用。

    .//p/span[@class='currency-value'] | .//p/span/span[@class='currency-value'] and .//span[not(.='Ad')]

5 个答案:

答案 0 :(得分:3)

而不是说"尝试XXX"如果您了解当前尝试的错误,我认为这很有用。

.//p/span[@class='currency-value'] | .//p/span/span[@class='currency-value'] and .//span[not(.='Ad')]

" |" XPath中的运算符意味着" union" - 它形成两个节点集的并集。因此//x | //y选择由//x选择的节点和//y选择的节点的并集。到现在为止还挺好。你可以简化" union"表达的一部分

(.//p/span | .//p/span/span)[@class='currency-value']

如果你愿意的话。

"和"更有问题。 "和"的操作数必须是布尔值,而在你的表达式中,两个操作数都是节点集。我怀疑(虽然我无法确定)您的意图是从联合节点中排除 - 设置那些满足谓词.='Ad'的节点,但是没有看到您的源数据,它不清楚如何产品和价格相互关联。也许你打算这样做:

(.//p/span | .//p/span/span)[@class='currency-value'][not(.='Ad')]

或者也许这样:

(.//p/span | .//p/span/span)[@class='currency-value'][not(..='Ad')]

无论哪种方式,如果我说你的意图是排除一些原本会被选中的节点,那么另外一个谓词就是这样做的。

答案 1 :(得分:1)

查看页面后,此CSS选择器将起作用

div.hide-lg:not([data-behat-search-results-ads-xl]):not(.prolist-row) p > span.currency-value, div.hide-lg:not([data-behat-search-results-ads-xl]):not(.prolist-row) p > span > span.currency-value

答案 2 :(得分:0)

试试这个。不要过分复杂化 dependencies { implementation fileTree(dir: 'libs', include: '*.jar') // SUB-PROJECT DEPENDENCIES START implementation(project(path: "CordovaLib")) compile "com.android.support:customtabs:26.+" compile "com.android.support:support-v4:24.1.1+" compile "com.google.gms:google-services:+" compile "com.google.android.gms:play-services-tagmanager:11.+" compile "com.google.firebase:firebase-core:11.+" compile "com.google.firebase:firebase-messaging:11.+" compile "com.google.firebase:firebase-crash:11.+" compile "com.google.firebase:firebase-config:11.+" compile "com.google.firebase:firebase-perf:11.+" compile "com.google.android.gms:play-services-auth:11.+" compile "com.google.android.gms:play-services-identity:11.+" // SUB-PROJECT DEPENDENCIES END }

//p/span

答案 3 :(得分:0)

试试这个。将@Vitaliy的答案与你的答案结合起来:

.//p/span[@class='currency-value'][not(.='Ad')] | .//p/span/span[@class='currency-value'][not(.='Ad')]

答案 4 :(得分:0)

请在xpath中找到AND和OR的使用方法如下:

这是Page html:

<div class="mtlist-tab">
<ul class="wwf-tab-h">
<li class="tab-head">
<li class="tab-head on">
<li class="tab-head">
</ul>
</div>

如果你在xpath中使用AND,其中两个元素具有相同的类类名,那么它将返回2个匹配的元素。

//li[@class='tab-head' and @class='tab-head']

如果您在xpath中使用AND,其中两个元素具有不同的类类名,那么它将返回0个匹配的元素。

//li[@class='tab-head' and @class='tab-head on']

如果你在xpath中使用OR,其中两个元素具有不同的类类名,那么它将返回3个匹配的元素(根据HTML)。

//li[@class='tab-head' OR @class='tab-head on']