Wie wähle ich alle Spalten, die ersten Zellen (tds) in Selenium webdriver?
Ich bin mit Selen 2.12. Die Verwendung der WebDriver-API, sagen wir, ich habe ein WebElement, das entspricht einer Tabelle (<table>
). Mit diesem element, wie wähle ich alle td ' s in der ersten Spalte? Ich gehe davon aus, dass ein xpath-Ausdruck ist in Ordnung hier.
Besser zu verstehen, die Struktur der Tabelle, wenn ich den HTML-von meinem tableelementes WebElement ...
String html = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", tableElt);
Bekomme ich das Durcheinander unter. Die wichtige Sache zu beachten ist, dass es 6 tr 's und 16 td' s ...
<thead><tr><th colspan="1" class="GCSPOWVGE GCSPOWVEE GCSPOWVEF GCSPOWVFF"><div style="padding-left: 17px;position:relative;zoom:1;"><div style="left:0px;margin-top:-4px;position:absolute;top:50%;line-height:0px;"><img onload='this.__gwtLastUnhandledEvent="load";' src="http://localhost:9080/cme-productplus-web/productplus/clear.cache.gif" style="width: 11px; height: 7px; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAAHCAYAAADebrddAAAAiklEQVR42mNgwALyKrumFRf3iDAQAvmVXVVAxf/zKjq341WYV95hk1fZ+R+MK8C4HqtCkLW5FZ2PQYpyK6AaKjv/5VV1OmIozq3s3AFR0AXFUNMrO5/lV7WKI6yv6mxCksSGDyTU13Mw5JV2qeaWd54FWn0BRAMlLgPZl/NAuBKMz+dWdF0H2hwCAPwcZIjfOFLHAAAAAElFTkSuQmCC) no-repeat 0px 0px;" border="0"></div><div>GUID</div></div></th><th colspan="1" class="GCSPOWVGE GCSPOWVEF">Fung Ratio</th><th colspan="1" class="GCSPOWVGE GCSPOWVEF">Fung type</th><th colspan="1" class="GCSPOWVGE GCSPOWVEF">Fung Date Offset</th><th colspan="1" class="GCSPOWVGE GCSPOWVEF GCSPOWVOE">Days To Retain</th></tr></thead><colgroup><col><col><col><col><col></colgroup><tbody><tr onclick="" class="GCSPOWVAE"><td class="GCSPOWVPD GCSPOWVBE GCSPOWVCE"><div style="outline:none;" tabindex="0"> DSSUAQR6IE6E </div></td><td class="GCSPOWVPD GCSPOWVBE"><div style="outline:none;"> 10 </div></td><td class="GCSPOWVPD GCSPOWVBE"><div style="outline:none;"> </div></td><td class="GCSPOWVPD GCSPOWVBE"><div style="outline:none;"> </div></td><td class="GCSPOWVPD GCSPOWVBE GCSPOWVME"><div style="outline:none;"> </div></td></tr><tr onclick="" class="GCSPOWVAF"><td class="GCSPOWVPD GCSPOWVBF GCSPOWVCE"><div style="outline:none;"> ETTUAQR6IE6E </div></td><td class="GCSPOWVPD GCSPOWVBF"><div style="outline:none;"> 30 </div></td><td class="GCSPOWVPD GCSPOWVBF"><div style="outline:none;"> </div></td><td class="GCSPOWVPD GCSPOWVBF"><div style="outline:none;"> </div></td><td class="GCSPOWVPD GCSPOWVBF GCSPOWVME"><div style="outline:none;"> </div></td></tr><tr onclick="" class="GCSPOWVAE"><td class="GCSPOWVPD GCSPOWVBE GCSPOWVCE"><div style="outline:none;"> FCCUAQR6IE6E </div></td><td class="GCSPOWVPD GCSPOWVBE"><div style="outline:none;"> 20 </div></td><td class="GCSPOWVPD GCSPOWVBE"><div style="outline:none;"> </div></td><td class="GCSPOWVPD GCSPOWVBE"><div style="outline:none;"> </div></td><td class="GCSPOWVPD GCSPOWVBE GCSPOWVME"><div style="outline:none;"> </div></td></tr></tbody><tbody style="display: none;"><tr><td colspan="5" align="center"><div><div style="width: 100%; height: 100%; padding: 0px; margin: 0px; display: none;"><div style="width: 100%; height: 100%; display: none;"></div></div><div style="width: 100%; height: 100%; padding: 0px; margin: 0px; display: none;"><div class="GCSPOWVPE" style="width: 100%; height: 100%; display: none;"><img class="gwt-Image" onload='this.__gwtLastUnhandledEvent="load";' src="http://localhost:9080/cme-productplus-web/productplus/clear.cache.gif" style="width: 43px; height: 11px; background: url(data:image/gif;base64,R0lGODlhKwALAPEAAP///0tKSqampktKSiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAKwALAAACMoSOCMuW2diD88UKG95W88uF4DaGWFmhZid93pq+pwxnLUnXh8ou+sSz+T64oCAyTBUAACH5BAkKAAAALAAAAAArAAsAAAI9xI4IyyAPYWOxmoTHrHzzmGHe94xkmJifyqFKQ0pwLLgHa82xrekkDrIBZRQab1jyfY7KTtPimixiUsevAAAh+QQJCgAAACwAAAAAKwALAAACPYSOCMswD2FjqZpqW9xv4g8KE7d54XmMpNSgqLoOpgvC60xjNonnyc7p+VKamKw1zDCMR8rp8pksYlKorgAAIfkECQoAAAAsAAAAACsACwAAAkCEjgjLltnYmJS6Bxt+sfq5ZUyoNJ9HHlEqdCfFrqn7DrE2m7Wdj/2y45FkQ13t5itKdshFExC8YCLOEBX6AhQAADsAAAAAAAAAAAA=) no-repeat 0px 0px;" border="0"></div></div></div></td></tr></tbody><tfoot style="display: none;"><tr><th colspan="5" class="GCSPOWVFE GCSPOWVDE GCSPOWVNE"></th></tr></tfoot>
Leider beide diese Ausdrücke nicht liefern die richtigen Ergebnisse.
//This returns zero td's
final List<WebElement> tds = tableElt.findElements(By.xpath("/tr/td[1]"));
...
//This returns 238 td's (I think that's everything in my document)
final List<WebElement> tds = tableElt.findElements(By.xpath("//td[1]"));
InformationsquelleAutor Dave | 2011-11-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist genau so, wie pro thw XPath-W3c-Spezifikationen und ist eine der am meisten FAQ in XPath.
Den Vorrang (die Priorität) der
//
pseudo-operator ist kleiner als die[]
Betreiber.Daher
//SomeName[1]
wählt alle Elemente mit den NamenSomeName
erstenSomeName
Kind Ihrer Eltern -- und es kann viele solche Elemente.Wenn Sie wollen wählen Sie die 1.
SomeName
element im XML-Dokument, müssen Sie explizit überschreiben die Standard-Operatoren mit Klammern:In diesem Fall wollen Sie nur die ersten
td
Nachkomme von einem bestimmten element -- daher zusätzlich zu den oben genannten Korrektur, korrigieren Sie müssen Ihren Ausdruck in relative -- absolut nicht. Ein absoluter XPath-Ausdruck (beginnend mit/
wird immer ausgewertet, dass als zusätzliche Kontext-node der Dokument-node an).Verwenden:
Wenn alle
td
Nachkommen des aktuellen Knotens ausgewählt, dann verwenden Sie:Und noch besser:
Oh, dann verwenden Sie einfach:
.//td
Ich aktualisiert meine Antwort mit meiner Antwort auf Ihren Kommentar.
Vielen Dank für die Fortsetzung der stick mit diesem, aber die Antwort, die eigentlich für mich gearbeitet wurde "(.//td[1])". Nicht Ihre Antwort nur ein einzelnes element zurückgeben?
Re:
(.//td[1])
. Die Klammern sind nicht wichtig, und Sie können nur ommit. Diese wählt jedertd
Nachkomme, ist die erstetd
Kind seiner Eltern. Sie nicht erklären, in Ihrer Frage, dass Sie tatsächlich wollte, dass. Auch, es ist noch nicht klar, was der initial context-Knoten (unten, von denen, die Sie suchentd
s. Dies alles ist eine Konsequenz aus der Tatsache, dass Sie nicht provied eine Beispiel XML-Quelldokument. Es wäre schön, wenn Sie bei der Bearbeitung der Frage-und dies alles fehlt und wesentliche Informationen. Ich hoffe, dass Ihre Fragen " Qualität in der Zukunft verbessern wird.InformationsquelleAutor Dimitre Novatchev
Den genauen Ausdruck zu verwenden, hängt von der tatsächlichen Struktur des Dokuments.
Im allgemeinsten Fall -- die Auswahl aller ersten Spalte von Zellen aus einer Tabelle -- könnten Sie den folgenden Ausdruck:
Beispielsweise auf dieses Dokument:
Dieser Ausdruck:
Gibt:
Hinweis, dass ich mit der descendant-or-self-Achse (
//
), weil HTML-Tabellen ermöglichen die optionale Gruppierung von Elementen (z.B.<tbody>
), die möglicherweise oder möglicherweise nicht vorhanden. Allerdings wird die erste Spalte der Zellen von geschachtelten Tabellen als gut. Dies berücksichtigen Eingang:Den gleichen Ausdruck von oben zurück:
Wenn du mehr wissen über Ihre spezifische Struktur der Tabelle, dann schreiben Sie einen spezifischen Ausdruck. Zum Beispiel auf der vorherigen Eingabe, dieser Ausdruck:
...gibt Zellen aus der äußersten Tabelle:
In diesem Fall ist es wahrscheinlich so etwas wie
/tr/td[1]
oder//td[1]
je nach Aufbau der TabelleHi, Leider ist jeder dieser Ausdrücke nicht die richtigen Ergebnisse. Ich bearbeitet meine Reaktion auf die Tabelle-Struktur von meinem WebElement. Obwohl es eine Sauerei ist, nehmen Sie mein Wort, dass der erste Ausdruck (/tr/td[1]) null-Elemente beim Aufruf, "die endgültige Liste<WebElement> tds = tableElt.findElements(Durch.xpath("/tr/td[1]"));". Die zweite gibt 238, die jeden td in meinem HTML-Dokument, im Gegensatz zu nur die td ' s innerhalb des table-Elements.
Ich weiß nicht, Selen, aber es sieht für mich wie die XPath-nicht ausgewertet wird, relativ zu dem Tisch.
Wenn Sie bereits das table-element, dann wäre es so einfach, wie tableelementes.findElements(Durch.tagName("td"));
InformationsquelleAutor Wayne Burkett
Wenn jeder
tr
enthält die gleiche Anzahl vontd
Sie können eine Liste allertd
Elemente mit.findElements(By.tagName("td"))
und Durchlaufen jedes N-te element von Liste, wobei n gleich der Anzahl dertd
Elemente in jedertr
InformationsquelleAutor jamesfzhang
wenn Sie bereits in der Tabelle gespeichert als WebElement dann alles, was Sie tun müssen, ist, analysieren die WebElement wie würden Sie die WebDriver.
Dadurch wird eine Liste der td-Elemente (sollten Sie xpath verwenden, wie Sie können, geben Sie die relative xPath des Elements und Staat, die spezifische element, das Sie möchten, dass der xPath-neigt dazu, ein wenig auf der langsamen Seite, so, wenn Sie analysieren, eine große Seite möchten Sie vielleicht zu gehen mit CssSelector :first-of-type
InformationsquelleAutor CBRRacer