Selen-Locator für <label for=“x“>
-
19-09-2019 - |
Frage
Bei ASP.NET sind die Tag-IDs ziemlich volatil. Um meine Tests robuster zu machen, möchte ich Elemente anhand ihrer Beschriftungstexte lokalisieren.Ich habe einiges mit WatiN gespielt und es macht das perfekt, aber dieses Projekt scheint heutzutage irgendwie tot zu sein, also dachte ich, ich würde mir auch Selenium ansehen, bevor ich mich für ein Framework entscheide.
Ich habe HTML, das ungefähr so aussieht
<label for="ctl00_content_loginForm_ctl01_username">Username</label>:
<input type="text" id="ctl00_content_loginForm_ctl01_username" />
Ich möchte nicht tippen:
selenium.Type("ctl00_content_loginForm_ctl01_username", "xxx");
Das ist zu stark vom Ausweis abhängig.In WatiN würde ich schreiben:
browser.TextField(Find.ByLabelText("Username")).TypeText("xxx");
Gibt es eine Möglichkeit, dies in Selenium zu tun?
Lösung
Ich glaube, dass Sie dies mit Folgendem erreichen können:
selenium.Type(selenium.getAttribute("//label[text()='Username']/@for"), "xxx");
Das Bit text()='Username' erhält die gewünschte Bezeichnung durch sein innerHTML, dann gibt /@for Ihnen den Wert seines Attributs „for“ zurück.
Kopf hoch: Dies ist nicht getestet (entschuldigen Sie das!), aber ich denke, dass es funktionieren wird, basierend auf einigen Tools im IDE-Plugin
Andere Tipps
Das funktioniert:
//input[@id=(//label[text()="Username"]/@for)]
Erläuterung:Da Sie nach der Eingabe suchen:
//input[@id=("ctl00_content_loginForm_ctl01_username")]
Ersetzen Sie „ctl00_content_loginForm_ctl01_username“ durch den Attributwert des Labels:
//label[text()="Username"]/@for
Ok, das ist vielleicht ein Jahr alt, aber was soll's.Dadurch wird die erste Eingabe unter einer Beschriftung ausgewählt, die den Text „Benutzername“ enthält.
//label[text()='Username']/input
Im Allgemeinen bevorzuge ich die Verwendung von contains(), da ich finde, dass einige Browser lästige Leerzeichen in das Occasional-Element einfügen:
//label[contains(., 'Username')]/input
Beachten Sie, dass der einfache Schrägstrich vor der Eingabe bedeutet, dass nur eine Ebene tiefer gesucht wird, während der doppelte Schrägstrich alle Ebenen unter der Bezeichnung überprüfen würde.Verwenden Sie XPather für Firefox, um Ihre XPaths zu erstellen und zu überprüfen. Das ist sehr nützlich.
Ja, Sie können XPath-, CSS- oder DOM-Locators verwenden, um Ihr Element zu identifizieren.In diesem Beispiel könnte Ihr XPath wie //lable[@for='ctl00_content_loginForm_ctl01_username'] aussehen, um diese bestimmte Bezeichnung zu identifizieren.