2012-09-24 13 views
5

Estoy usando JSF 1.2. Queremos escribir algunas pruebas de selenio (basadas en xpath) pero xpath no parece tener coincidencia de comodines en los identificadores de elementos.ID de elementos coincidentes con vista dinámica JSF Id

No podemos desactivar las identificaciones de prefijos mientras se ejecuta como un portlet en IBM Portal Server 6.1 y nuestra aplicación se rompe en ese entorno con el prefijo desactivado.

Actualmente estamos utilizando XPaths de forma

//*[substring(@id, 54)='id_distributorName']

que coincidirá: <select size="1" class="firstName" name="viewns_7_8000CB1A0GUIE0IJF799CR10O2_:commonEntryForm:id_distributorName" id="viewns_7_8000CB1A0GUIE0IJF799CR10O2_:commonEntryForm:id_distributorName" >

pero se me ocurre que asumir JSF siempre generará un viewId de la misma longitud es peligroso.

¿Hay una mejor manera de hacerlo?

Hemos intentado utilizar el atributo name para nuestros controles de entrada de JSF, pero por supuesto ignora el atributo y escribe su propio atributo de nombre cuyo valor coincide con el ID presumiblemente para el manejo de Evant razones de scripting)

Respuesta

5

Si utiliza XPath 2.0, sólo tiene que utilizar la función ends-with():

//*[ends-with(@id, ':id_distributorName')] 

Si utiliza XPath 1.0, el uso string-length() para calcular el comienzo de substring():

//*[substring(@id, string-length(@id) - 18) = ':id_distributorName'] 

Aquí, 18 es la longitud de id_distributorName (sin el prefijo :).

4

Ok acabo respondió mi propia pregunta.

Admito que sé poco sobre xpaths, ¡esa es mi excusa!

La respuesta es utilizar

es decir //*[contains(@id, 'id_distributorName')]

+1

Esto también coincidirá con los identificadores como 'foo: id_distributorName: bar' sean y' myid_distributorNames', no es realmente robusta. – BalusC

0

Uso:

//*[substring-after(@id, ':commonEntryForm:') = 'id_distributorName']