it-swarm.com.de

Xpath: Wählen Sie div aus, das die Klasse AND enthält, deren spezifisches untergeordnetes Element Text enthält

Mit Hilfe von diese SO Frage habe ich einen fast funktionierenden xpath:

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

Dies ergibt jedoch zwei divs: In einem ist es das untergeordnete td, das someText hat, und im anderen das untergeordnete span.

Wie kann ich es auf das mit dem span eingrenzen?

<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>
22
Andrejs

Um ein div einer bestimmten Klasse zu finden, die ein spanin beliebiger Tiefe enthält, versuchen Sie Folgendes:

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

Trotzdem sieht diese Lösung extrem fragil aus. Wenn die Tabelle zufällig ein span mit dem gesuchten Text enthält, wird auch das div mit der Tabelle abgeglichen. Ich würde vorschlagen, eine robustere Methode zum Filtern der Elemente zu finden. Zum Beispiel durch Verwendung von IDs oder einer Dokumentstruktur der obersten Ebene.

37
nwellnhof

Du könntest den xpath benutzen:

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

Eingabe:

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

Ausgabe :

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

Sie können ancestor verwenden. Ich finde, dass dies einfacher zu lesen ist, da sich das Element, das Sie tatsächlich auswählen, am Ende des Pfads befindet.

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

Sie können Ihre zweite Bedingung ändern, um nur das span-Element zu überprüfen:

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

Wenn die Spanne nicht immer in einem anderen Div liegt, können Sie sie auch verwenden

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

Dies sucht nach der Spanne irgendwo innerhalb des Div.

3
Sami Kuhmonen