XPath: Encuentra el elemento que contiene el texto exacto mientras traduces y aplicas normalize-space.
No estoy seguro de la sintaxis correcta de XPath para lograr estos objetivos:
- El contenido de texto del elemento en la página web debería ser exactamente
"ABC"
, excepto: - Quiero usar
translate
para poder buscar con"abc"
y encontrar"ABC"
- Quiero hacer
normalize-space
Conozco la sintaxis para translate
y normalize-text
cuando se utiliza contains
, es decir:
"//*[contains(translate(normalize-space(.), '%s), '%s')]" % ("ABC', 'abc'", "abc")
# ↑ Traducción ↑ Objetivo
Esto encontrará un elemento que contiene "ABC"
como "ABCD"
cuando se busca con "abc"
.
Sin embargo, estoy teniendo dificultades con la sintaxis correcta cuando no se utiliza contains
, es decir, que el contenido de texto debe ser exactamente "ABC"
y no "ABCD"
y ser encontrado con "abc"
– al mismo tiempo que se realiza normalize-space
.
Sé que se puede encontrar un texto exacto, por ejemplo, usando:
//*[normalize-space(text()) = "ABC"]
¿Cómo combino estas partes?
NB: Estoy usando Firefox para Selenium para encontrar elementos mediante driver.find_element_by_xpath
. Según tengo entendido, Firefox utiliza XPath 1 y no versiones más recientes como XPath 2.
davy.ai
Para lograr el objetivo de encontrar un elemento en una página web con un contenido de texto exacto de
"ABC"
y utilizartranslate
para buscar"abc"
y realizarnormalize-space
, se puede utilizar la siguiente sintaxis de XPath:Esta expresión XPath utiliza la función
translate
para convertir el contenido de texto a minúsculas y la funciónnormalize-space
para eliminar espacios en blanco al principio y al final, y colapsar cualquier secuencia de espacios internos en un solo espacio. Luego compara el contenido de texto resultante con'abc'
para encontrar el elemento con el contenido de texto exacto de"ABC"
sin importar las mayúsculas.Tenga en cuenta que, dado que Firefox utiliza XPath 1, la función
translate
está limitada a reemplazar caracter por caracter, por lo que se requiere un reemplazo por separado para cada letra mayúscula.