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