2010-01-08 8 views
10

Mit ASP.NET sind die Tag-IDs recht flüchtig, um meine Tests robuster zu machen Ich möchte Elemente anhand ihrer Beschriftungstexte suchen. Ich habe einige mit WatiN gespielt und es funktioniert perfekt, aber dieses Projekt scheint heutzutage irgendwie tot zu sein, also dachte ich mir, ich würde Selenium ebenfalls untersuchen, bevor ich mich für ein Framework entscheide.Selen-Locator für <label for = "x">

Ich habe html, die so etwas wie dieses

<label for="ctl00_content_loginForm_ctl01_username">Username</label>: 
<input type="text" id="ctl00_content_loginForm_ctl01_username" /> 

Ich will nicht geben sucht:

selenium.Type("ctl00_content_loginForm_ctl01_username", "xxx"); 

Das auf der ID ist auch angewiesen. In WatiN würde ich schreiben:

browser.TextField(Find.ByLabelText("Username")).TypeText("xxx"); 

Gibt es eine Möglichkeit, dies in Selen zu tun?

+0

Sorry, du hast den Eindruck, dass WatiN ein totes Projekt ist, aber es ist lebendig und munter. Letzten Dezember haben wir eine Veröffentlichung von WatiN 2.0 RC1 veröffentlicht. Jeroen van Menen –

+0

Nun, Sie hatten eine Roadmap, die eine Veröffentlichung q1 2009 erwähnt und gegen Ende des Jahres 2009 noch nicht freigegeben und die Roadmap wurde nicht aktualisiert. Auch wenn ich einen Patch an das Source-Forge-Feature-Anfrage-Forum geschickt habe (um auf die Roh-HTML-Quelle zuzugreifen), habe ich überhaupt keine Antwort erhalten. Es schien wie ein ziemlich totes Projekt. Ich bin froh, dass ich falsch lag. –

Antwort

6

Ich glaube, Sie können dies tun, mit den folgenden:

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

Der Text() = ‚Benutzername‘ Bit bekommt das Etikett Sie durch seine innerHTML- wollen, dann ist die/@ für Sie gibt wieder den Wert von sein "für" -Attribut.

Heads up: nicht getestet wird (! Entschuldigungen dafür), aber ich denke, es wird funktionieren, basierend auf einigen Werkzeugen um in der IDE-Plugin

+0

Es sieht vielversprechend aus. Ich werde es morgen versuchen. –

+0

Danke. Das hat gut funktioniert (außer GetAttribute sollte groß geschrieben werden). Die Syntax ist bei weitem nicht so gut wie die von WatiN, aber sie wird den Job erledigen. –

1

Ja, Sie können XPath-, CSS- oder DOM-Locators verwenden, um Ihr Element zu identifizieren. In diesem Beispiel könnte Ihr XPath wie folgt aussehen: // label [@ for = 'ctl00_content_loginForm_ctl01_username'], um dieses spezielle Label zu identifizieren.

+0

Außer es ist nicht die Bezeichnung, die ich identifizieren möchte - es ist das Eingabefeld. –

+0

Oh dann die XPath ändern für diesen Eingang zu finden - in diesem Fall: // input [@ id = ‚ctl00_content_loginForm_ctl01_username‘] Hier ist die Erklärung dafür - Sie alle Eingabeelemente suchen (daher //) wo die Attribut-ID gleich ctl00_content_loginForm_ctl01_username ist – John

+0

Ja, aber mein ganzes Problem ist, dass ich keine der IDs in meinem Testcode haben will, da sie sich ändern, sobald ich etwas auf der Seite ändere. Es gab mehr zu meiner Frage, als ich in die Überschrift passen konnte ... –

3

Ok, kann dies ein Jahr alt, aber sein, was sie hey. Dadurch wird die erste Eingabe unter einem Label mit dem Text 'Benutzername' ausgewählt.

//label[text()='Username']/input 

ich generell lieber mit() enthält, wie ich finde, dass einiger Browser lästige Räume in das gelegentliche Element hinzufügen:

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

Beachten Sie, dass der einzelne Schrägstrich vor der Eingabe bezeichnet wird nur eine Ebene aussehen unten, wo der Doppelstrich alle Ebenen unter dem Label überprüfen würde. Verwenden Sie XPather für Firefox, um Ihre XPaths zu erstellen und zu überprüfen, es ist sehr nützlich.

+0

Ja, diese Frage ist ein bisschen alt, aber ich glaube nicht, dass ich dieses Problem jemals sauber gelöst habe. Das Problem mit Ihrem Vorschlag ist, dass der '' Eingang _inside_ der'

8

Dies funktioniert:

//input[@id=(//label[text()="Username"]/@for)] 

Erläuterung: Da Sie für die Eingabe suchen:

//input[@id=("ctl00_content_loginForm_ctl01_username")] 

ersetzen die "ctl00_content_loginForm_ctl01_username" durch den Wert des Attributs des Etiketts:

//label[text()="Username"]/@for 
+0

Ich hatte keine Ahnung, dass Sie "Unterabfragen" in XPath verwenden könnten. Ich habe keinen Zugriff mehr auf das Projekt, in dem ich dieses Problem hatte, daher kann ich die Lösung nicht einfach überprüfen. Aber es sieht vielversprechend aus. Vielen Dank! –