example python selenium selenium-webdriver

selenium python example



¿Cómo obtener el texto de un elemento en Selenium WebDriver(a través de la API de Python) sin incluir el texto del elemento secundario? (3)

<div id="a">This is some <div id="b">text</div> </div>

Obtener "Esto es algo" no es trivial. Por ejemplo, esto devuelve "Esto es un texto":

driver.find_element_by_id(''a'').text

¿Cómo puede uno, de manera general, obtener el texto de un elemento específico sin incluir el texto de sus hijos?

(Proporciono una respuesta a continuación, pero dejaré la pregunta abierta en caso de que alguien pueda encontrar una solución menos espantosa).


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 los find_element...() (es decir, puede ser un objeto WebElement ).

O si no tiene jQuery o no quiere usarlo, puede reemplazar el cuerpo de la función de arriba 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)

En realidad estoy usando este código en un banco de pruebas.


No tiene que hacer un reemplazo, puede obtener la longitud del texto de los niños y restarlo de la longitud total, y cortar en el texto original. Eso debería ser sustancialmente más rápido.


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