Localizador de selenio para
-
19-09-2019 - |
Pregunta
Con ASP.NET, las ID de etiqueta son bastante volátiles, por lo que para que mis pruebas sean más robustas, quiero localizar elementos mediante los textos de sus etiquetas. He jugado algunos con Watin y lo hace perfectamente, pero ese proyecto parece un poco muerto hoy en día, así que pensé en buscar en Selenium antes de decidir un marco.
Tengo html que se parece a 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 identificación. En Watin escribiría:
browser.TextField(Find.ByLabelText("Username")).TypeText("xxx");
¿Hay alguna forma de hacer esto en Selenium?
Solución
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 el /@para le devuelve el valor de su atributo "para".
Aviso: Esto no se prueba (¡disculpas por eso!) Pero creo que funcionará, basado en algunas herramientas en el complemento IDE
Otros consejos
Esto funciona:
//input[@id=(//label[text()="Username"]/@for)]
Explicación: ya que está buscando la entrada:
//input[@id=("ctl00_content_loginForm_ctl01_username")]
Reemplace el "CTL00_CONTENT_LOGINFORM_CTL01_USERNAME" por el valor del atributo de la etiqueta:
//label[text()="Username"]/@for
Ok, esto puede tener un año de edad, pero lo que oye. Esto seleccionará la primera entrada en una etiqueta que contiene el texto 'Nombre de usuario'.
//label[text()='Username']/input
Generalmente prefiero usar Contiene (), ya que encuentro que algunos navegadores están agregando espacios molestos al elemento ocasional:
//label[contains(., 'Username')]/input
Tenga en cuenta que el corte único antes de la entrada denota que solo se verá hacia abajo, donde la barra doble verificaría todos los niveles debajo de la etiqueta. Use XPather para Firefox para crear y verificar sus XPaths, es muy útil.
Sí, puede usar los localizadores XPATH, CSS o DOM para identificar su elemento. En este ejemplo, su XPath podría parecerse // lable [@for = 'ctl00_content_loginform_ctl01_username'] para identificar esa etiqueta en particular.