2017-04-14 2 views
0

Ich verwende Selenium WebDriver 2.53.1 auf Java, Chrome.Selen xpath text() - einfache Auswahl scheint nicht funktioniert

Ich finde ein Element und speichern Sie es in einer WebElement-Variable namens dropdownMenuList. Hier ist sein OuterHTML, formatiert.

<ul tabindex="-1" class="dropdownMenu apmurldropdownmenu thing menu" role="menu" aria-label="Menu region"> 
    <li class="menuitem apmurldropdownmenu" tabindex="-1" role="menuitem"> 
     <div class="thing text">CardNameWebpage</div> 
    </li> 
    <li class="menuitem apmurldropdownmenu" tabindex="-1" role="menuitem"> 
     <div class="thing text">CardNameWebpage</div> 
    </li> 
    <li class="menuitem apmurldropdownmenu" tabindex="-1" role="menuitem"> 
     <div class="thing text">CardNameWebpage</div> 
    </li> 
    <!-- react-text: 9 --> 
    <!-- /react-text --> 
</ul> 

Dann suche ich darin von XPath:

dropdownMenuList.findElement(By.xpath("*[text()='CardNameWebpage']")); 

Und ich bekomme eine NoSuchElementException. Aber der HTML hat alle drei Elemente mit diesem Text. Was mache ich falsch?

Antwort

2

Sie sollten zwei Schrägstriche setzen (//) vor, da Elemente, die Sie suchen, sind nicht auf oberster Ebene

"//*[text()='CardNameWebpage']" 

Nachkomme Element der aktuellen zu finden (paul tremberth ist absolut richtig :)), fügen Punkt beim Start der XPath

".//*[text()='CardNameWebpage']" 
+0

Wenn ich // verwende, wird vom Anfang des Dokuments gesucht. Ich muss nur von diesem Element aus suchen. –

+2

Dann versuchen './/** [text() = 'CardNameWebpage']' (relative Pfad) –

+0

Ich würde '*' durch 'div' in diesem Fall ersetzen, um es genauer zu machen ... aber das kann nur sein mich. :) – JeffC

0

Bearbeitet: Sie müssen zu, //*[text()='value'] oder //*[contains(text(),'value')] ändern.

+0

ich glaube, er meinte entweder // * [text() = 'value'] oder // * [enthält (text(), 'value')], da Sie wissen, dass es eine Listenelement, Sie könnten in beiden Fällen "*" durch "li" ersetzen und in der contains-Version könnten Sie "." für "text()" –

+0

Wenn ich // verwende, wird von oben nach dem Dokument gesucht. Ich muss nur von diesem Element aus suchen. –

+0

Nein, // sagt ihm einfach, dass er von seiner relativen Position nach "*" suchen soll. Was // im Vergleich zu/ist, sucht nach dem Element und überspringt alle Knotenebenen dazwischen. Wenn es // li [contains ("boo")] wäre, würde es nach dem ersten Listenelement suchen, das "boo" in der Zeile enthält, beginnend von wo es gerade ist. –