Java selenium xpath - immer alle Elemente unter einem bestimmten element
dies ist eine vereinfachte HTML-Struktur Suche ich durch:
<div class="main">
...other stuff...
<td class="child">44</td>
<td class="child">59</td>
<td class="child">11</td>
</div>
<div class="main">
...other stuff...
<td class="child">5</td>
<td class="child">14</td>
<td class="child">98</td>
</div>
...this kind of structure repeats with similar numbers a few more times but with identical class names
Muss ich extrahieren Sie alle zahlen, die unter der ersten gefunden main-Klasse also habe ich eine Abfrage, um die Suche für die ersten Haupt-und alle td mit der Klasse unter ihm. Kann jemand mir einen Tipp geben was ich falsch mache, da diese Abfrage gibt mir alle zahlen von allen td ' s der Klasse "Kind" in allen "Haupt" - div ' s:
List<WebElement> koefi = driver.findElements(By.xpath("//div[@class='main'][1]//td[@class='child']"));
Was mache ich falsch, oder ist meine Logik richtig, aber ich bin fehlen einige andere Teile von html, die ich noch nicht eingefügt, da hier die Struktur ist zu umständlich..?
Danke!!!!
p.s.:
Ich versuchte dies auch, aber wieder, ich bekomme Inhalten aller td ' s mit "Kind" - Klasse, und nicht nur die erste "Haupt"..
List<WebElement> koefi = driver.findElements(By.xpath("//*[1][@class='main']//td[@class='child']"));
UPDATE:
Ich konnte mein problem lösen, indem Sie zuerst die erste vorkommen von "main" div die per default in der .findElement Funktion:
WebElement element = driver.findElement(By.xpath("//*[1][@id='main']"));
Und dann extrahieren .findElements Funktion der "Kind" - Klassen:
List<WebElement> kk = element.findElements(By.className("child"));
Ich bin noch nicht in der Lage, herauszufinden, warum nicht das .findElements mit meinem xpath funktioniert, oder es funktioniert zu gut, es extrahiert alle "Haupt" - Klasse und nicht nur die erste. Und der original HTML-Code ist zu groß, um es hier einfügen, so dass ich nicht wollen, Sie zu stören Leute!!
Sind Sie sicher, dass alle
<div class="main">
Geschwister sind?Bekomme ich eine Liste aller "Kind" - Elemente, und mein Ziel ist es, die "Kind" - Elemente nur unter die erste "Haupt".. ich java importiert.util.Liste an der Spitze meiner Datei..
es ist eine zugrunde liegende Struktur über den "main" container aber, ja, Sie sind alle in der gleichen Ebene, zum Beispiel div1>div2>div3 ">Haupt -, und dann wieder div1>div2>div3 " >main und so weiter..
Die xpath-in der ursprünglichen Frage
//div[@class='main'][1]//td[@class='child']
enthält einen relativen Pfad, das gilt für alle Ihre wichtigsten Klassen.InformationsquelleAutor Hrvoje85 | 2014-12-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine viel sauberere Lösung wäre zunächst greifen Sie alle
div
s mit Klassemain
:Dann, wie von Ihnen angegeben, finden alle
td
s mit Klassechild
:Danach ist es nur eine Frage der Iteration über alle "tds", und Lesen Sie Ihre Werte.
InformationsquelleAutor SiKing
Sagen Sie in einem Kommentar, dass
also ich vermute, Sie fallen foul der ein häufiger Fehler im Zusammenhang mit der definition von
//
in XPath. Der Pfadtut nicht wählen Sie die erste "main" - div-Element im Dokument. Der Grund dafür ist, dass
//
ist eine Kurzform für/descendant-or-self::node()/
(einschließlich der voran-und nachgestellte Schrägstriche), was diesen Weg eigentlich bedeutet, istWenn Sie sehen, es vollständig erweitert, Sie erkennen, dass die
[1]
bezieht sich auf diechild::
Schritt und nicht die Suche nach Nachkommen, d.h. Sie erhalten alle diediv
Elemente im Dokument, das die Klasse "main" und sind die ersten div-mit-Klasse-main unter Ihrer jeweiligen übergeordneten Elemente. Wenn die tatsächliche HTML istdann, dass XPath auswählen würde, Sie beide (und beide sind die ersten, die unter Ihren Eltern). Wenn Sie wollen einfach nur das erste im Dokument, dann sollten Sie das
descendant::
Achsedie Ihnen die ersten passenden Nachkomme nur.
Prädikate gelten von Links nach rechts -
//*[1][@class='main']
bedeutet, dass jedes element im Dokument, wird das erste untergeordnete element des übergeordneten Elements, und hat die Klasse main, im Gegensatz zu//*[@class='main'][1]
die würde jedes element, dass das erste element-mit-Klasse-main in seiner übergeordneten.ja, jetzt verstehe ich, danke!
InformationsquelleAutor Ian Roberts