- Retrouvez les réponses et les commentaires concernant cette question" />
11
votes

Localisateur de sélénium pour <étiquette pour = "x">

avec asp.net Les identifiants de tag sont assez volatils afin de rendre mes tests plus robustes, je souhaite localiser des éléments par leurs textes d'étiquettes. Je l'ai joué avec Watin et cela le fait parfaitement, mais ce projet semblait genre de morts de nos jours, alors je pensais que je me pencherais dans le sélénium aussi avant que je décide d'un cadre.

J'ai html qui ressemble à ceci xxx

Je ne veux pas taper: xxx

qui est trop dépendant de l'ID. Dans Watin, j'écrirais: xxx

est là un moyen de le faire en sélénium?


2 commentaires

Désolé, vous avez l'impression que Watin est un projet mort, mais c'est vivant et frappe. En décembre dernier, nous avons fait une sortie de WATIN 2.0 RC1. Jeroen van menen


Eh bien, vous avez eu une feuille de route qui a mentionné une version Q1 2009 et vers la fin de 2009, elle n'avait toujours pas été publiée et la feuille de route n'avait pas été mise à jour. De plus, lorsque j'ai soumis un correctif au forum de demande de fonctionnalité de Forge Source (pour accéder à la source HTML RAW), je n'ai reçu aucune réponse du tout. Cela a semblé être un projet assez mort. Je suis content d'avoir eu tort.


4 Réponses :


1
votes

Oui, vous pouvez utiliser XPath, CSS ou DOM localisateurs pour identifier votre élément. Dans cet exemple, votre xpath pourrait ressembler à // h @ @ for = 'ctl00_content_loginform_ctl01_username'] pour identifier cette étiquette particulière.


3 commentaires

Sauf que ce n'est pas l'étiquette que je veux identifier - c'est la boîte de saisie.


Oh, puis changez la xpath pour rechercher cette entrée - dans ce cas: // entrée [@ id = 'ctl00_content_loginform_ctl01_username'] Voici l'explication pour cela - vous recherchez tous les éléments d'entrée (par conséquent //) où l'ID d'attribut Equals ctl00_content_loginform_CTL01_USERNAME


Oui, mais tout mon problème est que je ne veux pas que les identifiants de mon code de test puisqu'ils changent dès que je change quelque chose sur la page. Il y avait plus à ma question que je pouvais tenir dans le titre ...



7
votes

Je crois que vous pouvez le faire avec ce qui suit:

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


2 commentaires

Il semble prometteur. Je vais essayer demain.


Merci. Cela a fonctionné bien (sauf getattribute devrait être capitalisé). La syntaxe n'est nulle part près aussi belle que Watin's mais cela aura le travail.



3
votes

OK, cela peut être un an, mais ce qu'ils hey hey. Cela sélectionnera la première entrée sous une étiquette contenant le texte 'Nom d'utilisateur'. xxx pré>

i Généralement en utilisant contient () car je constate que certains navigateurs ajoutent des espaces ennuyeux dans l'élément occasionnel: P>

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


1 commentaires

Oui, cette question est un peu ancienne, mais je ne pense pas avoir jamais résolu ce problème de manière propre. Le problème avec votre suggestion est qu'il nécessite que l'entrée soit intérieure le



13
votes

Ceci fonctionne: xxx

explication: puisque vous recherchez l'entrée: xxx

remplacez "ctl00_content_loginform_ctl01_username" par l'attribut Valeur de l'étiquette: xxx


1 commentaires

Je ne savais pas que vous pourriez utiliser des «sous-requêtes» dans XPath. Je n'ai plus accès au projet où j'ai eu ce problème, je ne peux donc pas facilement vérifier la solution. Mais il semble prometteur. Merci!