Estoy tratando de probar una interfaz javascript complicada con Selenium (usando la interfaz Python y en varios navegadores). Tengo varios botones de la forma:
<div>My Button</div>
Me gustaría poder buscar botones basados en "Mi botón" (o coincidencias parciales que no distinguen entre mayúsculas y minúsculas, como "mi botón" o "botón")
Me parece increíblemente difícil, en la medida en que siento que me falta algo obvio. Lo mejor que tengo hasta ahora es:
driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')
Sin embargo, esto distingue entre mayúsculas y minúsculas. La otra cosa que he intentado es iterar a través de todos los divs en la página y verificar la propiedad element.text. Sin embargo, cada vez que tenga una situación de la forma:
<div class="outer"><div class="inner">My Button</div></div>
div.outer también tiene "Mi botón" como texto. Para solucionar ESO, intenté ver si div.outer es el padre de div.inner, pero no pude averiguar cómo hacerlo (element.get_element_by_xpath ('..') devuelve el elemento primario de un elemento, pero pruebas no iguales a div.outer). Además, la iteración a través de todos los elementos de la página parece ser muy lenta, al menos con el controlador web de Chrome.
Ideas?
Editar: Esta pregunta salió un poco vaga. Se le preguntó (y respondió) una versión más específica aquí: ¿Cómo obtener el texto de un elemento en Selenium WebDriver (a través de la API Python) sin incluir el texto del elemento hijo?
Respuestas:
Intenta lo siguiente:
fuente
find_element(s)_by_link_text
yfind_element(s)_by_partial_link_text
métodospodrías probar un xpath como:
fuente
.format
no se reconoce en mi eclipse. da y error. alguna idea, ¿por qué?También puede usarlo con el patrón de objeto de página, por ejemplo:
Prueba este código:
fuente
// * buscará cualquier etiqueta HTML. Donde si algún texto es común para Button y div tag y si // * son categorías, no funcionará como se esperaba. Si necesita seleccionar algún específico, puede obtenerlo declarando la etiqueta Elemento HTML. Me gusta:
fuente
Curiosamente, prácticamente todas las respuestas giran en torno a la función de xpath
contains()
, descuidando el hecho de que distingue entre mayúsculas y minúsculas , al contrario de lo que pregunta OP.Si necesita insensibilidad a mayúsculas y minúsculas, eso se puede lograr en xpath 1.0 (la versión compatible con los navegadores modernos) , aunque no es bonito, mediante el uso de la
translate()
función. Sustituye un carácter fuente a su forma deseada, mediante el uso de una tabla de traducción.La construcción de una tabla de todos los caracteres en mayúscula transformará efectivamente el texto del nodo a su forma más baja (), lo que permite la coincidencia entre mayúsculas y minúsculas (esta es solo la prerrogativa) :
La llamada completa a Python:
Naturalmente, este enfoque tiene sus inconvenientes: como se indica, funcionará solo para texto latino; Si desea cubrir caracteres Unicode, deberá agregarlos a la tabla de traducción. Lo hice en la muestra anterior: el último carácter es el símbolo cirílico
"Й"
.Y si viviéramos en un mundo en el que los navegadores admitían xpath 2.0 y versiones posteriores (🤞, pero que no sucedería pronto ☹️) , podríamos haber utilizado las funciones
lower-case()
(aún, no totalmente conscientes de la ubicación) ymatches
(para búsquedas de expresiones regulares, con mayúsculas y minúsculas). -insensible ('i'
) bandera).fuente
En el HTML que ha proporcionado:
El texto
My Button
es elinnerHTML
y no tiene espacios en blanco a su alrededor para que pueda usarlo fácilmente de latext()
siguiente manera:Texto con espacios iniciales / finales
En caso de que el texto relevante contenga espacios en blanco al principio:
o al final:
o en ambos extremos:
En estos casos tienes 2 opciones:
Puede usar la
contains()
función que determina si la primera cadena de argumento contiene la segunda cadena de argumento y devuelve boolean verdadero o falso de la siguiente manera:Puede usar la
normalize-space()
función que elimina los espacios en blanco iniciales y finales de una cadena, reemplaza las secuencias de caracteres de espacios en blanco por un solo espacio y devuelve la cadena resultante de la siguiente manera:xpath para texto variable
En caso de que el texto sea una variable que puede usar:
fuente
fuente
Problema similar: encontrar
<button>Advanced...</button>
Tal vez esto le dará algunas ideas (transfiera el concepto de Java a Python):
fuente
Utilice driver.find_elements_by_xpath y hace coincidir la función de coincidencia de expresiones regulares para la búsqueda de mayúsculas y minúsculas del elemento por su texto.
fuente
matches()
es una función de xpath 2.0, y los navegadores lamentablemente solo admiten 1.0.Prueba esto. Es muy fácil:
Esto realmente funcionó para mí en el controlador web de selenio.
fuente