Pregunta

Uso XPather Browser para consultar 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 " & amp; nbsp; " ;.

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

Cuando intento con un XPATH como // td [text () = " & amp; nbsp; "] , no devuelve nada. ¿Existe una regla especial para los textos con " & amp; " ?

¿Fue útil?

Solución

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

He reproducido aquí el texto de OpenQA relacionado con este problema (encontrado aquí ):

  

HTML se normaliza automáticamente   espacio en blanco dentro de los elementos, ignorando   Espacios iniciales / finales y conversión   espacios adicionales, pestañas y nuevas líneas en un   único espacio. Cuando Selenio lee texto   fuera de la página, intenta   duplica este comportamiento, para que puedas   ignorar todas las pestañas y nuevas líneas en   su HTML y hacer aseveraciones basadas en   cómo se ve el texto en el navegador cuando   prestados Hacemos esto reemplazando todos   espacios en blanco no visibles (incluido el   espacio sin interrupciones " & amp; nbsp; ") con un   único espacio. Todas las nuevas líneas visibles.   ( < br > , < p > , y < pre > formateados   nuevas líneas) deben ser preservadas.

     

Usamos la misma lógica de normalización en   El texto del caso de prueba HTML Selenese.   mesas. Esto tiene una serie de   ventajas Primero, no necesitas   mira la fuente HTML de la página para   averiguar cuáles deberían ser sus afirmaciones   ser; " & amp; nbsp; " los simbolos son invisibles   al usuario final, por lo que no deberías   Hay que preocuparse por ellos al escribir.   Selenese pruebas. (No es necesario poner   " & amp; nbsp; " marcadores en su caso de prueba   a assertText en un campo que contiene   " & amp; nbsp; " ;.) También puedes poner extra   Nuevas líneas y espacios en tu Selenese.   Etiquetas < td > ; ya que usamos el mismo   Lógica de normalización en el caso de prueba.   Como lo hacemos en el texto, podemos garantizar   Que las afirmaciones y el texto extraído.   coincidirá exactamente.

     

Esto crea un poco de problema en   esas raras ocasiones en que realmente   quiere / necesita insertar espacios en blanco adicionales   en su caso de prueba Por ejemplo tu   Es posible que tenga que escribir texto en un campo como   esto: " foo " ;. Pero si simplemente   escribe < td > foo < / td > en tu   Selenese caso de prueba, vamos a reemplazar su   espacios adicionales con un solo espacio.

     

Este problema tiene una solución simple.   Hemos definido una variable en Selenese,    $ {space} , cuyo valor es un solo   espacio. Puedes usar $ {space} para   inserta un espacio que no sea   Recortado automáticamente, como este:    < td > foo $ {space} $ {space} $ {space} < / td > .   También hemos incluido una variable    $ {nbsp} , que puede usar para insertar   Un espacio que no rompe.

     

Tenga en cuenta que XPaths no se normalizan   Los espacios en blanco de la forma en que lo hacemos. Si necesitas   escribir un XPath como    // div [text () = " hola mundo "] pero el   HTML del enlace es realmente   " hola & amp; nbsp; world " ;, deberás   inserte un " & amp; nbsp; real " en tu   Selenese caso de prueba para que coincida,   Me gusta esto:    // div [text () = " hello $ {nbsp} world "] .

Otros consejos

Descubrí que puedo hacer la coincidencia cuando ingrese un espacio no fragmentado (U + 00A0) codificado al escribir Alt + 0160 en Windows entre las dos comillas ...

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

trabajó para mí con el char especial.

Por lo que entendí, el estándar XPath 1.0 no controla los caracteres de Unicode que se escapan. Parece que hay funciones para eso en XPath 2.0 pero parece que Firefox no lo admite (o entendí mal algo). Así que tienes 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 que usa XPath para proporcionar la secuencia de escape correcta de Unicode ... Entonces, de alguna manera, hice lo correcto.

Intente usar la entidad decimal & amp; # 160; en lugar de la entidad nombrada. Si eso no funciona, debería poder usar simplemente unicode carácter para un espacio de no separación en lugar de la entidad & amp; nbsp; .

(Nota: no probé esto en XPather, pero sí lo intenté en Oxygen)

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

No puedo obtener una coincidencia con Xpather, pero lo siguiente me funcionó 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 de si eso te ayuda, pero pude en realidad encontrar nbsp usando una expresión XPath.

Editar: el ejemplo de mi código realmente contiene los caracteres '& amp; nbsp;' pero el resaltado de sintaxis de JavaScript lo convierte al carácter de espacio. ¡No te dejes engañar!

Busca & amp; nbsp; o solo nbsp . ¿Intentaste esto?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top