2012-05-30 19 views
6

Estoy usando selenio para obtener texto en mi página web usando xpath.Lectura de texto usando selenium webdriver (xpath)

La estructura de la página etiqueta es de la siguiente manera -

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

Si utilizo el siguiente código -

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

consigo el resultado = Seat Height, Laden 7

Pero quiero evitar la lectura de la texto dentro de las etiquetas <sup> y obtenga el resultado Seat Height, Laden

Háganme saber qué expresión xpath puedo usar para obtener el resultado deseado.

+3

Um. En XPath simple (que podría devolver cadenas y no solo WebElements), podría hacer '// span [@ id = 'data']/text() [1]'. Una posible solución que se me ocurre usa JS, la segunda obtiene el texto completo y luego elimina todo de los elementos secundarios. Ambas soluciones son bastante feas y me gustaría ver una mejor. De todos modos, si no hay respuesta en un tiempo razonablemente corto, lo publicaré. –

+1

¿Por qué razón xpath es tu única opción? Webdriver tarda más tiempo en localizar un elemento mediante xpath – Amey

+0

, así que utilizo xpath solo porque me siento cómodo con él. Si hay alguna otra forma de resolver mi problema, lo agradeceré. –

Respuesta

7

No sé de ninguna manera de hacer esto en Selenium, entonces está mi solución JS. La idea es obtener todos los elementos secundarios del elemento (incluidos los nodos de texto) y luego seleccionar solo los nodos de texto. Es posible que deba agregar algunas llamadas al .trim() (o JS equivalente) para eliminar los espacios innecesarios.

Todo el código:

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); 
} 

Y sólo la JS para una mejor legibilidad.

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

Hey buena solución para obtener el resultado a través de JS. Pero quiero preguntar si hay algo así como un! operador en xpath por el cual podemos descuidar ciertas etiquetas. –

+1

Sí, lo hay. Sin embargo, no funcionará en este caso particular ya que aún está seleccionando el elemento externo y que contiene todos los elementos secundarios de forma predeterminada. El nodo de texto también es un elemento secundario y un analizador normal podría obtenerlo. WebDriver no es un analizador habitual y no tiene esta funcionalidad. Todavía. Si desea conocer un XPath en particular, siéntase libre de preguntar. –

Cuestiones relacionadas