2017-08-19 4 views
2

Ich versuche, nach einem Knoten zu suchen, der auf Text basiert, der auf einem Kind-/Enkelknoten seines unmittelbaren Bruders verfügbar ist. Der HTML-Code sieht wie folgt aus:XPath Selenium VBA

<div> 
    <div class="searchedDivClass" id="DynamicId1"> 
    </div> 
    <div class="classType1"> 
     //<h1> some text </h1> 
    </div> 
    // 
    <div class="searchedDivClass"> 
    </div> 
    <div class="classType2"> 
     //<p> some other text </p> 
    </div> 
</div> 

Wie Sie den gesuchten Text in jeder Art von Tag sein kann, sehen können, aber es ist immer ein Teil des Textes.

dachte ich, dass die folgende XPath funktionieren würde:

//div[contains(@class,'searchedDivClass')] 

Stellt sicher, dass es das richtige Maß an div zurückgibt, die ich suche, nicht höher:

drive.FindElementsByXPath("//div[following-sibling::div[1][//*[contains(text(),'some text')]] and contains(@class,'searchedDivClass')]") 

in Stücke Gegliedert oder tiefer im Baum.

//div[following-sibling::div[1][//*[contains(text(),'some text')]] 

Sucht das erste Geschwister des div oben gefunden. Innerhalb dieses Geschwisters sucht es nach einem Element, das den gesuchten Text enthält.

Wenn ich jedoch sehe, wie viele Elemente es zurückgibt, ist es tatsächlich größer als die Anzahl der Elemente, die die 'searchedDivClass' haben.

Beachten Sie, dass das Entfernen des // * [enthält (text(), 'some text')]

Mindestens gibt die Anzahl der Elemente mit der gesuchten Klasse.

Schließlich gibt der letzte XPath für sich selbst das Element zurück, das den Text enthält.

Irgendeine Idee oder Empfehlungen?

+0

Welches Element, das Sie tatsächlich auswählen möchten? –

+0

Ich habe meine Antwort bearbeitet, um sie etwas klarer zu machen. Ich versuche, das Div, das die "DynamicId1" hat, basierend auf dem Text in einem Unterknoten seiner unmittelbaren Geschwister zu bekommen. – havan

+0

Können Sie uns genau mitteilen, welches Element/welchen Text Sie suchen und in Bezug auf welches Element/Text? – DebanjanB

Antwort

1

So müssen Sie Ihr Problem in zwei Teile brechen

(element we need to select)[condition that element has to match] 

ist sie eins nach dem wir

Element müssen wählen

So wissen wir Lassen lösen, dass das Element haben eine Klasse searchedDivClass. Das ist also ein ganz einfaches und unten arbeiten sollte

//div[contains(@class,'searchedDivClass')] 

Bedingung, dass Element

Die erste Bedingung, dass ist Übereinstimmen, dass es einen folgenden div-Tag (oder im Grunde ein Geschwister.

following-sibling::div[1] 

Jetzt nächste Bedingung, die wir auf diesen Geschwister hinzufügen möchten, das ist, dass diese Geschwister sollten ein Kind haben, das Text hat some text. Also haben wir unsere XPath mit einem anderen Zustand aktualisieren

following-sibling::div[1][.//*[contains(text(),'some text')]] 

Beachten Sie, dass ich ein .// verwendet und nicht // weil .// von aktuellen Knoten Kind nehmen, während der // Sie bedeutet in dem Dokument überall verwenden.

Also unsere letzte XPATH wird

//div[@class='searchedDivClass'][following-sibling::div[1][.//*[contains(text(),'some text')]]] 
+0

Danke Tarun, ich bin derzeit nicht neben meinem Laptop, aber ich werde es versuchen, sobald ich eine Chance habe – havan

+0

Es sieht aus, als was ich fehlte war der Punkt vor dem ".//*". Das hat perfekt funktioniert. Danke vielmals. – havan

Verwandte Themen