Komplikationen mit Selen die GetAttribute-Methode
Ich habe vor kurzem versucht, auf selenium RC ist GetAttribute Methode, sondern rannte sofort zu einer Herausforderung. Ich habe versucht, führen Sie ein sehr einfaches selenium.GetAttribute("//a/@href")
aber den code warf einen SeleniumException mit der Meldung "ERROR: could not find element-Attribut: //a/@href".
Durch die Substitution selenium.GetText("//a[@href]")
an die Stelle der GetAttribute rufen, habe ich bestätigt, dass es ein element war definitiv vorhanden, da diese Anweisung ordnungsgemäß zurückgegeben, wird der text des Links.
Habe ich dann versucht:
- den Verweis auf eine andere web-Seite mit einem anderen Protokoll (file:///vs http://) - das gleiche problem.
- mit einem anderen xpath-locator verweist auf ein anderes Attribut-das gleiche problem.
- mit einem DOM-locator
selenium.GetAttribute("document.getElementsByTagName('a')[0].getAttribute('href')")
- das gleiche problem; etwas andere Fehlermeldung (und die Fehlermeldung fehlt die abschließende Klammer): "FEHLER: Element Dokument.getElementsByTagName('a')[0].getAttribute('href' nicht gefunden". Beachten Sie, dass genau dieser Ausdruck korrekt funktioniert in Firebug-Konsole. - die Verwendung von absoluten statt relativen xpath-Adressierung, mit
selenium.GetText("xpath=/html/body/a[@href]")
zu bestätigen die Existenz und dannselenium.GetAttribute("xpath=/html/body/a/@href")
um die Attribut-und es funktionierte!
Während das Handbuch erklärt deutlich, dass relative xpath-locators nicht eine explizite locator-Typ (D. H. die "xpath=" Präfix) es ist still über absolute xpath-locators; ich interpretiere daraus, dass der Präfix ist erforderlich. Aber aus Neugier, ging ich zurück zu meinen verwandten Ausdruck und fügte hinzu, die explizite Präfix--ändern selenium.GetAttribute("//a/@href")
zu selenium.GetAttribute("xpath=//a/@href")
-- und das klappte auch!
Schließlich, meine Experimente mit dem sehr handlichen Finden Schaltfläche in Selenium IDE zeigen, dass es nicht in Ordnung mit Elementen scheitert aber mit Parametern. Ich kann verstehen, dass es nicht sinnvoll ist, markieren Sie ein Attribut, da Attribute nicht sichtbar sind Elemente einer Seite, aber warum nicht markieren Sie das element, das das Attribut enthält, und machen es in einer anderen Farbe? Vielleicht nicht eine einfache Aufgabe...
Meine Fragen:
Ich destilliert die Ergebnisse der oben genannten Experimente, die nach unten auf diese Fragen; das ist der ganze Sinn meines posting hier! Jede dieser scheint mir ein bug aber lassen Sie mich wissen, wenn Sie denken, dass mein Sprachgebrauch ist falsch-oder gibt es einen workaround:
- Warum GetAttribute mit einem XPath-locator-Typ eindeutig erfordern eine explizite locator geben, wenn andere Methoden (z.B. GetText) nicht?
- Warum hat der DOM locator fehl mit 'nicht gefunden' - Fehler? (Das Handbuch ist auch klar, dass DOM-locators tun nicht bedürfen einer ausdrücklichen locator-Typ-Präfix, aber ich habe dennoch versucht, indem "dom=" als Präfix auf dem DOM testen; es noch nicht.)
- Warum Selenium IDE nicht scheitern, mehr anmutig, wenn Sie versuchen, zu markieren (Finden) ein Attribut? Mit der gleichen
"xpath=//a/@href"
locator, drücken Sie die Find-Taste Erträge diese hässliche Fehlermeldung: "[Fehler] locator nicht gefunden: xpath=//a/@href, Fehler = [Exception... "Konnte nicht konvertiert JavaScript-argument arg 0 [inIFlasher.scrollElementIntoView]" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: chrome://selenium-ide/content/selenium-runner.js :: showElement :: Linie 386" data: no]"
Ihre Eingabe ist auch für die beantragte Folgendes: das Muster, Das ich wollte, für jeden test hier wurde (A) GetText(locator-für-element-mit-Attribut), um zu bestätigen, die Anwesenheit von dem element, dann (B) GetAttribute(locator-für-Attribut-selbst). Der 6 slots in der Tabelle unten habe ich gelöst, 3 von Ihnen erfolgreich wie nur ausführliche, und eine 4. scheint ein Fehler zu sein. Gibt es Lösungen für die beiden verbleibenden slots?
Typ GetText GetAttribute XPath //a[@href] " xpath=//a/@href CSS CSS=a[href] ?? DOM ?? Dokument.getElementsByTagName('a')[0].getAttribute('href')
(Details: Selenium RC version 1.0.3, Browser: Firefox 3.6.13, Mein Ziel von code in C#)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Selenium RC ist
GetAttribute
Methode gibt die Wert des Elements\locator-Attribut. Die Allgemeine form für diesen Locator-Punkten istbeispielsweise
gibt den Wert der
href
Attribut auf das element mit der idSaveButton
. Xpath-Locator-Punkte können auch verwendet werden:gibt den Wert der
href
Attribut auf das element, dessen id enthält den textSaveButton
.Ihre Fragen zu beantworten,
1: ich weiß wirklich nicht, dies ist eine Frage für die Entwickler von Selen.
2: Die Selenium-Befehle ausführen verschiedene "Kontexte". In einigen der Befehle, die
document
bezieht sich auf die web-Seite unter test, in anderen Befehlendocument
bezieht sich auf die Seite mit dem Selen-frame (testRunner.html ich glaube,).3: Die Fehlermeldung sagt, dass es nicht finden können, das element, das Sie angefordert. Den Informationen nach, die nützlich sein könnten, um die Selen-team, wenn es tatsächlich ein bug vorhanden, aber nicht wirklich beeinflussen Sie. Je mehr Informationen, desto besser, richtig?
//a@href
funktioniert, wenn der korrekte xpath -//a/@href
macht nicht (außer durch irgendeine Eigenart, es wird funktionieren, mit einer expliziten "xpath=" Präfix). So versehentliches--oder vielleicht sollte ich sagen, indirekt - du hast die Antwort zu den Fragen 1 und 2.:-) Auch Ihre Antwort erlaubt es mir, 5 von 6 meiner Tabelle Einträge.http://release.seleniumhq.org/selenium-remote-control/0.9.2/doc/java/com/thoughtworks/selenium/Selenium.html#getAttribute%28java.lang.String%29
So sollten Sie sagen
selenium.GetAttribute("locator@href")
Locator als id oder Namen. Wenn Ihr ein element keine id oder Namen, die Sie verwenden sollten, xpath,selenium.GetAttribute("xpath=/html/body/a/@href")
wie Sie bereits erfolgreich ausprobiert.