2010-01-08 8 views
10

Con ASP.NET los identificadores de etiquetas son bastante volátiles, por lo que para hacer que mis pruebas sean más robustas quiero ubicar elementos por sus textos de etiquetas. He jugado algunos con WatiN y lo hace a la perfección, pero ese proyecto parece un poco muerto hoy en día, así que pensé en buscar Selenium también antes de decidirme sobre un framework.Localizador de selenio para <label for = "x">

que tienen html que se ve algo como esto

<label for="ctl00_content_loginForm_ctl01_username">Username</label>: 
<input type="text" id="ctl00_content_loginForm_ctl01_username" /> 

no quiero escribir:

selenium.Type("ctl00_content_loginForm_ctl01_username", "xxx"); 

Eso es demasiado dependiente de la ID. En WatiN escribiría:

browser.TextField(Find.ByLabelText("Username")).TypeText("xxx"); 

¿Hay alguna manera de hacer esto en Selenium?

+0

Lamento que hayas tenido la impresión de que WatiN es un proyecto muerto, pero está vivo y coleando. El pasado mes de diciembre hicimos un lanzamiento de WatiN 2.0 RC1. Jeroen van Menen –

+0

Bueno, usted tenía una hoja de ruta que mencionaba un lanzamiento en el año 2009 y hacia fines de 2009 todavía no se había publicado y el mapa no se había actualizado. Además, cuando envié un parche al foro de solicitud de funciones forge de origen (para acceder a la fuente html sin procesar), no obtuve ninguna respuesta. Parecía un proyecto bastante muerto. Me alegro de haberme equivocado. –

Respuesta

6

Creo que se puede hacer esto con lo siguiente:

selenium.Type(selenium.getAttribute("//label[text()='Username']/@for"), "xxx"); 

El texto() bit = 'nombre de usuario' se pone la etiqueta que desea por su innerHTML, entonces el/@ para usted devuelve el valor de su atributo "para".

Heads up: esto no es comprobada (! Disculpas por ello), pero creo que va a trabajar, sobre la base de algunos dando vueltas en el plugin IDE

+0

Parece prometedor. Voy a intentarlo mañana. –

+0

Gracias. Eso funcionó bien (excepto que GetAttribute debería estar en mayúscula). La sintaxis no es tan buena como la de WatiN pero hará el trabajo. –

1

Sí, puede usar localizadores XPath, CSS o DOM para identificar su elemento. En este ejemplo, su XPath podría verse como // lable [@ for = 'ctl00_content_loginForm_ctl01_nombredeusuario'] para identificar esa etiqueta en particular.

+0

Excepto que no es la etiqueta que quiero identificar, es el cuadro de entrada. –

+0

Oh continuación, cambie el XPath para buscar esa entrada - en este caso: // entrada [@ id = 'ctl00_content_loginForm_ctl01_username'] Esta es la explicación para ello - que busca todos los elementos de entrada (de ahí //) donde la identificación del atributo es igual a ctl00_content_loginForm_ctl01_nombre de usuario – John

+0

Sí, pero mi problema es que no quiero ninguno de los ID en mi código de prueba, ya que cambian tan pronto como cambio algo en la página. Había más en mi pregunta de lo que podía caber en el titular ... –

3

Ok, esto puede ser un año de edad, pero lo ellos oyen Esto seleccionará la primera entrada debajo de una etiqueta que contenga el texto 'Nombre de usuario'.

//label[text()='Username']/input 

general, yo prefiero usar contains() ya que me parece que algunos navegadores son la adición de espacios molestos en el elemento de vez en cuando:

//label[contains(., 'Username')]/input 

Tenga en cuenta que la sola barra antes de la entrada indica que sólo se verá un nivel abajo, donde la doble barra verificaría todos los niveles debajo de la etiqueta. Usa XPather para Firefox para crear y verificar tus XPaths, es muy útil.

+0

Sí, esa pregunta es un poco vieja, pero no creo que alguna vez haya resuelto ese problema de una manera limpia. El problema con su sugerencia es que requiere que la entrada '' sea _inside_ la '

8

Esto funciona:

//input[@id=(//label[text()="Username"]/@for)] 

Explicación: Puesto que busca la entrada:

//input[@id=("ctl00_content_loginForm_ctl01_username")] 

reemplazar el "ctl00_content_loginForm_ctl01_username" por el valor del atributo de la etiqueta:

//label[text()="Username"]/@for 
+0

No tenía idea de que pudiera usar "sub-consultas" en xpath. Ya no tengo acceso al proyecto donde tuve este problema, por lo que no puedo verificar fácilmente la solución. Pero parece prometedor. ¡Gracias! –