Xpath: 选择包含类 AND 的 div,AND 的特定子元素包含文本

这个所以问题的帮助下,我有了一个几乎可以工作的 xpath:

//div[contains(@class, 'measure-tab') and contains(., 'someText')]

然而,这得到两个 divs: 在一个是子 td有一些文本,另一个是子 span

我怎么把范围缩小到有 span的那个?

<div class="measure-tab">
<!-- table html omitted -->
<td> someText</td>
</div>


<div class="measure-tab">  <-- I want to select this div (and use contains @class)
<div>
<span> someText</span>  <-- that contains a deeply nested span with this text
</div>
</div>
247140 次浏览

To find a div of a certain class that contains a span at any depth containing certain text, try:

//div[contains(@class, 'measure-tab') and contains(.//span, 'someText')]

That said, this solution looks extremely fragile. If the table happens to contain a span with the text you're looking for, the div containing the table will be matched, too. I'd suggest to find a more robust way of filtering the elements. For example by using IDs or top-level document structure.

You could use the xpath :

//div[@class="measure-tab" and .//span[contains(., "someText")]]

Input :

<root>
<div class="measure-tab">
<td> someText</td>
</div>
<div class="measure-tab">
<div>
<div2>
<span>someText2</span>
</div2>
</div>
</div>
</root>

Output :

    Element='<div class="measure-tab">
<div>
<div2>
<span>someText2</span>
</div2>
</div>
</div>'

You can change your second condition to check only the span element:

...and contains(div/span, 'someText')]

If the span isn't always inside another div you can also use

...and contains(.//span, 'someText')]

This searches for the span anywhere inside the div.

You can use ancestor. I find that this is easier to read because the element you are actually selecting is at the end of the path.

//span[contains(text(),'someText')]/ancestor::div[contains(@class, 'measure-tab')]