Locator de sélénium pour <étiquette pour = "x">
-
19-09-2019 - |
Question
Avec ASP.NET, les ID de balise sont assez volatils, donc pour rendre mes tests plus robustes, je veux localiser les éléments par leurs textes d'étiquette. J'en ai joué avec Wasing et cela le fait parfaitement, mais ce projet semble un peu mort de nos jours, alors j'ai pensé que je regarderais le sélénium aussi avant de décider d'un cadre.
J'ai HTML qui ressemble à quelque chose comme ça
<label for="ctl00_content_loginForm_ctl01_username">Username</label>:
<input type="text" id="ctl00_content_loginForm_ctl01_username" />
Je ne veux pas taper:
selenium.Type("ctl00_content_loginForm_ctl01_username", "xxx");
Cela dépend trop de l'ID. Dans Wasing, j'écrirais:
browser.TextField(Find.ByLabelText("Username")).TypeText("xxx");
Existe-t-il un moyen de le faire en sélénium?
La solution
Je crois que vous pouvez le faire avec les éléments suivants:
selenium.Type(selenium.getAttribute("//label[text()='Username']/@for"), "xxx");
Le bit text () = 'username' obtient l'étiquette que vous souhaitez par son innerhtml, alors le / @ pour vous redonne la valeur de son attribut "For".
La tête haute: Ce n'est pas testé (excuses pour cela!) Mais je pense que cela fonctionnera, en fonction de certains outils dans le plugin IDE
Autres conseils
Cela marche:
//input[@id=(//label[text()="Username"]/@for)]
Explication: Puisque vous recherchez l'entrée:
//input[@id=("ctl00_content_loginForm_ctl01_username")]
Remplacez le "CTL00_CONTENT_LOGINFORM_CTL01_USERNAME" par la valeur de l'attribut de l'étiquette:
//label[text()="Username"]/@for
Ok, cela peut avoir un an mais ce qu'ils sont. Cela sélectionnera la première entrée sous une étiquette contenant le texte «Nom d'utilisateur».
//label[text()='Username']/input
Je préfère généralement utiliser CONTAINS () car je trouve que certains navigateurs ajoutent des espaces ennuyeux dans l'élément occasionnel:
//label[contains(., 'Username')]/input
Notez que la slash unique avant l'entrée indique qu'il ne ressemblera à qu'un niveau vers le bas, où la double barre oblique vérifierait tous les niveaux sous l'étiquette. Utilisez XPather pour Firefox pour créer et vérifier vos xpaths, c'est très utile.
Oui, vous pouvez utiliser des localisateurs XPATH, CSS ou DOM pour identifier votre élément. Dans cet exemple, votre xpath pourrait ressembler à // lable [@ for = 'ctl00_content_loginform_ctl01_username'] pour identifier cette étiquette particulière.