Saltar al contenido

¿Cómo obtener el texto de un elemento en Selenium WebDriver, sin incluir el texto del elemento secundario?

El tutorial o código que hallarás en este artículo es la resolución más sencilla y válida que hallamos a tus dudas o dilema.

Solución:

Aquí hay una solución general:

def get_text_excluding_children(driver, element):
    return driver.execute_script("""
    return jQuery(arguments[0]).contents().filter(function() 
        return this.nodeType == Node.TEXT_NODE;
    ).text();
    """, element)

El elemento pasado a la función puede ser algo obtenido de la find_element...() métodos (es decir, puede ser un WebElement objeto).

O si no tiene jQuery o no quiere usarlo, puede reemplazar el cuerpo de la función anterior con esto:

return self.driver.execute_script("""
var parent = arguments[0];
var child = parent.firstChild;
var ret = "";
while(child) 
    if (child.nodeType === Node.TEXT_NODE)
        ret += child.textContent;
    child = child.nextSibling;

return ret;
""", element) 

De hecho, estoy usando este código en un conjunto de pruebas.

En el HTML que has compartido:

This is some
text

El texto This is some está dentro de un nodo de texto. Para representar el nodo de texto de forma estructurada:

This is some
text

Este caso de uso

Para extraer e imprimir el texto This is some desde el nodo de texto usando el cliente python de Selenium, tiene 2 formas de la siguiente manera:

  • Usando splitlines(): Puede identificar el elemento principal, es decir

    extrae el innerHTML y luego usar splitlines() como sigue:

    • usando xpath:

      print(driver.find_element_by_xpath("//div[@id='a']").get_attribute("innerHTML").splitlines()[0])
      
    • usando xpath:

      print(driver.find_element_by_css_selector("div#a").get_attribute("innerHTML").splitlines()[0])
      
  • Usando execute_script(): También puede utilizar el execute_script() método que puede ejecutar JavaScript sincrónicamente en la ventana/marco actual de la siguiente manera:

    • usando xpath y primer hijo:

      parent_element = driver.find_element_by_xpath("//div[@id='a']")
      print(driver.execute_script('return arguments[0].firstChild.textContent;', parent_element).strip())
      
    • usando xpath y childNodes[n]:

      parent_element = driver.find_element_by_xpath("//div[@id='a']")
      print(driver.execute_script('return arguments[0].childNodes[1].textContent;', parent_element).strip())
      

def get_true_text(tag):
    children = tag.find_elements_by_xpath('*')
    original_text = tag.text
    for child in children:
        original_text = original_text.replace(child.text, '', 1)
    return original_text

Comentarios y calificaciones del post

Puedes sostener nuestra misión dejando un comentario o puntuándolo te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *