texto sacar nodos herramienta expresión evaluar ejemplo debe conjunto como buscar aprender xml search xpath selenium

xml - sacar - Usar XPATH para buscar texto que contenga & nbsp;



xpath buscar texto (6)

Uso XPather Browser para verificar mis expresiones XPATH en una página HTML.

Mi objetivo final es usar estas expresiones en Selenium para probar mis interfaces de usuario.

Obtuve un archivo HTML con un contenido similar a este:

<tr> <td>abc</td> <td>&nbsp;</td> </tr>

Quiero seleccionar un nodo con un texto que contenga la cadena " &nbsp; ".

Con una cadena normal como "abc" no hay problema. Uso una XPATH similar a //td[text()="abc"] .

Cuando intento con un XPATH como //td[text()="&nbsp;"] no devuelve nada. ¿Hay alguna regla especial sobre los textos con " & "?


Buscar &nbsp; o solo nbsp - ¿Intentó esto?


Descubrí que puedo hacer la coincidencia cuando ingreso un espacio duro no codificado (U + 00A0) escribiendo Alt + 0160 en Windows entre las dos comillas ...

//table[@id=''TableID'']//td[text()='' '']

trabajado para mí con el char especial.

Por lo que entendí, el estándar XPath 1.0 no maneja el escape de los caracteres Unicode. Parece que hay funciones para eso en XPath 2.0, pero parece que Firefox no lo admite (o entendí mal algo). Entonces tiene que ver con la página de códigos local. Feo, lo sé.

En realidad, parece que el estándar se basa en el lenguaje de programación usando XPath para proporcionar la secuencia de escape Unicode correcta ... Así que, de alguna manera, hice lo correcto.



No puedo obtener una coincidencia usando Xpather, pero lo siguiente funcionó para mí con archivos XML y XSL en el Bloc de notas XML de Microsoft:

<xsl:value-of select="count(//td[text()=''&nbsp;''])" />

El valor devuelto es 1, que es el valor correcto en mi caso de prueba.

Sin embargo, tuve que declarar nbsp como una entidad dentro de mi XML y XSL usando lo siguiente:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>

No estoy seguro si eso te ayuda, pero pude encontrar nbsp usando una expresión XPath.

Editar: Mi ejemplo de código realmente contiene los caracteres ''& nbsp;'' pero el resaltado de sintaxis de JavaScript lo convierte en el carácter de espacio. No se deje engañar!


Parece que OpenQA , los chicos detrás de Selenium, ya han abordado este problema. Definieron algunas variables para unir explícitamente espacios en blanco. En mi caso, necesito usar un XPATH similar a //td[text()="${nbsp}"] .

Reproduje aquí el texto de OpenQA sobre este tema (que se encuentra here ):

HTML normaliza automáticamente el espacio en blanco dentro de los elementos, ignorando los espacios iniciales / finales y convirtiendo espacios adicionales, pestañas y líneas nuevas en un solo espacio. Cuando Selenium lee texto de la página, intenta duplicar este comportamiento, por lo que puede ignorar todas las pestañas y nuevas líneas en su HTML y hacer afirmaciones basadas en cómo se ve el texto en el navegador cuando se procesa. Hacemos esto reemplazando todos los espacios en blanco no visibles (incluido el espacio sin interrupción " &nbsp; ") con un espacio único. Se deben preservar todas las líneas nuevas formateadas ( <br> , <p> y <pre> visibles).

Usamos la misma lógica de normalización en el texto de las tablas de casos de prueba de HTML Selenese. Esto tiene una serie de ventajas. Primero, no necesita mirar el código fuente HTML de la página para descubrir cuáles deberían ser sus afirmaciones; Los símbolos " &nbsp; " son invisibles para el usuario final, por lo que no debe tener que preocuparse por ellos al escribir pruebas Selenese. (No necesita colocar " &nbsp; " marcadores en su caso de prueba para assertText en un campo que contenga " &nbsp; "). También puede poner nuevas líneas y espacios adicionales en sus etiquetas <td> Selenese; ya que utilizamos la misma lógica de normalización en el caso de prueba que en el texto, podemos asegurarnos de que las aserciones y el texto extraído coincidan exactamente.

Esto crea un pequeño problema en las raras ocasiones en las que realmente desea / necesita insertar espacios en blanco adicionales en su caso de prueba. Por ejemplo, puede que necesite escribir texto en un campo como este: " foo ". Pero si simplemente escribe <td>foo </td> en su caso de prueba de Selenese, reemplazaremos sus espacios adicionales con solo un espacio.

Este problema tiene una solución simple. Hemos definido una variable en Selenese, ${space} , cuyo valor es un espacio único. Puede usar ${space} para insertar un espacio que no se recortará automáticamente, como este: <td>foo${space}${space}${space}</td> . También hemos incluido una variable ${nbsp} , que puede usar para insertar un espacio sin interrupciones.

Tenga en cuenta que XPaths no normaliza el espacio en blanco de la manera en que lo hacemos. Si necesita escribir un XPath como //div[text()="hello world"] pero el HTML del enlace es realmente " hello&nbsp;world ", tendrá que insertar un " &nbsp; real" en su Selenese caso de prueba para que coincida, así: //div[text()="hello${nbsp}world"] .


Tenga en cuenta que un procesador XML que cumpla con los estándares habrá reemplazado cualquier referencia de entidad que no sean las cinco estándar de XML ( &amp; &gt; &lt; &apos; &quot; ) con el carácter correspondiente en la codificación de destino en el momento de XPath expresiones son evaluadas Dado el comportamiento, las sugerencias de PhiLho y jsulak son el camino a seguir si quieres trabajar con herramientas XML. Cuando ingresas &#160; en la expresión XPath, se debe convertir a la secuencia de bytes correspondiente antes de aplicar la expresión XPath.