2011-05-04 25 views
5

Estoy tratando de usar Selenium RC y WebDriver (por separado) para manipular una página HTML. La fuente contiene algo como:XPath interpretación por Selenium/WebDriver manejando IE

<a href="/logoff"><span> 
    <span>L</span> 
    ogoff 
    </span> 
</a> 

que desea orientar el enlace que contiene el texto 'Cerrar sesión', de tal manera que seguirá funcionando incluso si se rehacen los vanos. Estoy usando XPath ya que debería funcionar tanto en WebDriver como en Selenium RC. Esto funciona en IE pero es un poco frágil:

//a[contains(., 'ogoff')] 

y esto sería más robusto, pero no funciona:

//a[.='Logoff'] 

Puede explicar por qué el segundo no funciona? En particular, ¿cómo debe interpretarse . como una cadena, y cómo lo hacen Selenium y WebDriver?

Estoy tratando de hacer que Selenium funcione también con Firefox, por lo que se abrirá otro hervidero de gusanos.

Respuesta

10

Hay espacios en blanco (espacios y devoluciones de carro) que el procesador considera significativos y que afectan al valor calculado de a.

Cuando se selecciona el valor de a como esto *<xsl:value-of select="a"/>* el resultado es:

* L 
    ogoff 
    * 

Si utiliza *<xsl:value-of select="normalize-space(a)"/>* el resultado es:

*L ogoff* 

Si usted quiere ser capaz de seleccionar "Cerrar sesión", puede usar normalize-space() y luego ajustarlo con translate() para eliminar los espacios:

//a[translate(normalize-space(), ' ','')='Logoff'] 
+0

+1 Buena explicación. –

+0

Gracias por la explicación del manejo de espacio en blanco. Quizás XPath debería tener una sintaxis abreviada para 'normalize-space()' y para 'translate (., '', '')' Ya que son muy útiles. –

2

Para Selenium lo puedes dar como link="Logoff" donde Logoff es el texto en el enlace.

+0

Sí, esa es la forma más sencilla en este caso. ¡Gracias! (La sintaxis es 'link = Logoff' sin las comillas.) –

+0

Funciona, pero no es una implementación de XPath – Ardesco