testing - openqa - Localizador de selenio para<label for="x">
selenium mac (4)
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é que buscaría Selenium también antes de decidirme sobre un framework.
Tengo 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 depende demasiado de la ID. En WatiN escribiría:
browser.TextField(Find.ByLabelText("Username")).TypeText("xxx");
¿Hay alguna manera de hacer esto en Selenium?
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_username''] para identificar esa etiqueta en particular.
Esto funciona:
//input[@id=(//label[text()="Username"]/@for)]
Explicación: Dado que está buscando la entrada:
//input[@id=("ctl00_content_loginForm_ctl01_username")]
reemplace el "ctl00_content_loginForm_ctl01_nombre de usuario" por el valor del atributo de la etiqueta:
//label[text()="Username"]/@for
Ok, esto puede ser un año pero lo que oyen. Esto seleccionará la primera entrada debajo de una etiqueta que contenga el texto ''Nombre de usuario''.
//label[text()=''Username'']/input
Por lo general, prefiero usar contains () ya que algunos navegadores agregan espacios molestos en el elemento ocasional:
//label[contains(., ''Username'')]/input
Tenga en cuenta que la barra oblicua antes de la entrada denota que solo se verá un nivel hacia abajo, donde la barra doble comprobará todos los niveles debajo de la etiqueta. Usa XPather para Firefox para crear y verificar tus XPaths, es muy útil.
Creo que puedes hacer esto con lo siguiente:
selenium.Type(selenium.getAttribute("//label[text()=''Username'']/@for"), "xxx");
El bit text () = ''Username'' obtiene la etiqueta que desea por su innerHTML, luego la / @ le devuelve el valor de su atributo "for".
Cuidado: esto no está probado (¡disculpas por eso!) Pero creo que funcionará, basado en algunas herramientas en el complemento IDE