2012-05-30 15 views
6

Używam selenu do pobrania tekstu na mojej stronie przy użyciu xpath.Czytanie tekstu przy użyciu selionowego webdrivera (xpath)

Struktura tag strona jest następujący -

<span id="data" class="firefinder-match"> 
    Seat Height, Laden 
    <sup> 
    <a class="speckeyfootnote" rel="p7" href="#">7</a> 
    </sup> 
</span> 

Gdybym użyć następującego kodu -

driver.findElement(By.xpath("//span[@id='data']")).getText(); 

uzyskać wynik = Seat Height, Laden 7

Ale chcę uniknąć czytania tekst w tagach <sup> i uzyskaj

Proszę dać mi znać, które wyrażenie xpath mogę użyć, aby uzyskać pożądany wynik.

+3

Um. W zwykłym XPath (który byłby w stanie zwrócić Stringi, a nie tylko WebElements), możesz zrobić '// span [@ id = 'data']/text() [1]'. Jedno z możliwych rozwiązań, jakie mogę wymyślić, używa JS, drugie pobiera cały tekst, a następnie usuwa wszystko z elementów potomnych. Oba rozwiązania są dość brzydkie i chciałbym zobaczyć coś ładniejszego. W każdym razie, jeśli w rozsądnym krótkim czasie nie będzie odpowiedzi, opublikuję to. –

+1

Każdy powód, dla którego xpath jest Twoją jedyną opcją? Webdriver najdłużej lokalizuje element przy pomocy xpath – Amey

+0

. Dobrze, że używam xpath tylko dlatego, że czuję się z tym komfortowo. Jeśli istnieje jakikolwiek inny sposób rozwiązania mojego problemu, będę wdzięczny. –

Odpowiedz

7

Nie wiem, jak to zrobić w Selenium, więc istnieje moje rozwiązanie JS. Chodzi o to, aby pobrać wszystkie elementy potomne elementu (w tym węzły tekstowe), a następnie wybrać tylko węzły tekstowe. Może być konieczne dodanie niektórych wywołań .trim() (lub równoważnych JS), aby pozbyć się niepotrzebnych spacji.

Cały kod:

WebElement elem = driver.findElement(By.id("data")); 
String text; 
if (driver instanceof JavascriptExecutor) { 
    text = ((JavascriptExecutor)driver).executeScript(
      "var nodes = arguments[0].childNodes;" + 
      "var text = '';" + 
      "for (var i = 0; i < nodes.length; i++) {" + 
      " if (nodes[i].nodeType == Node.TEXT_NODE) {" + 
      "  text += nodes[i].textContent;" + 
      " }" + 
      "}" + 
      "return text;" 
      , elem); 
} 

I właśnie JS dla lepszej czytelności.

var nodes = arguments[0].childNodes; 
var text = ''; 
for (var i = 0; i < nodes.length; i++) { 
    if (nodes[i].nodeType == Node.TEXT_NODE) { 
     text += nodes[i].textContent; 
    } 
} 
return text; 
+0

Hej, fajne rozwiązanie, aby uzyskać wynik przez JS. Ale chcę zapytać, czy jest coś takiego! operator na xpath, dzięki któremu możemy zaniedbać pewne tagi. –

+1

Tak, jest. Jednak nie zadziała w tym konkretnym przypadku, ponieważ nadal wybierasz element zewnętrzny i zawiera on domyślnie wszystkie elementy podrzędne. Węzeł tekstowy jest również jego elementem potomnym, a zwykły analizator składni może go pobrać. WebDriver nie jest zwykłym analizatorem składni i nie ma tej funkcji. Jeszcze. Jeśli chcesz poznać konkretny XPath, nie wahaj się zapytać. –

Powiązane problemy