Verwenden des Selenium Web Driver zum Abrufen des Werts einer HTML-Eingabe


122

Im HTML einer Webanwendung gibt es den folgenden Code

<input type="text" name="prettyTime" id="prettyTime" class="ui-state-disabled prettyTime"  readonly="readonly">

Was tatsächlich auf der Seite angezeigt wird, ist eine Zeichenfolge, die die Zeit anzeigt.

In Selenium Web Driver habe ich ein WebElementObjekt, das sich auf die <input>Verwendung bezieht

WebElement timeStamp = waitForElement(By.id("prettyTime"));

Ich möchte den Wert von WebElementoder mit anderen Worten, was auf der Seite gedruckt ist, erhalten. Ich habe alle WebElementGetter ausprobiert und nichts hat den tatsächlichen Wert abgerufen, den der Benutzer sieht. Irgendeine Hilfe? Vielen Dank.

Antworten:


210

Versuchen element.getAttribute("value")

Die textEigenschaft gilt für Text innerhalb der Tags eines Elements. Bei Eingabeelementen wird der angezeigte Text nicht vom <input>Tag umbrochen , sondern innerhalb des valueAttributs.

Hinweis: Der Fall ist wichtig. Wenn Sie "Wert" angeben, erhalten Sie einen "Null" -Wert zurück. Dies gilt zumindest für C #.


12
getAttribute("value")ist wirklich wie du das machst?! Das macht keinen Sinn. Es gibt einen großen Unterschied zwischen dem valueAttribut eines inputElements und seiner valueEigenschaft. Tut Selen das Schreckliche, was jQuery tut, und bringt sie zusammen?
TJ Crowder

Das ist es, worauf ich gerade gestoßen bin: Der Versuch, einen Wert aus einem Textbereich zu erhalten, der weder ein "Wert" -Attribut noch ein Text zwischen Tags ist (dynamisch als "Wert" -Attribut festgelegt.
CF

2
Nun, es stellt sich heraus, dass wenn das Attribut fehlt, es versucht, die entsprechende Eigenschaft zu erhalten. Sie können also einen "Wert" aus einem Textbereich entnehmen.
CF

Anscheinend ist dies die einzige Möglichkeit, auf Angulat-Material-Formularfelder
zuzugreifen

Vergessen Sie für Javascript-Benutzer nicht, awaitwenn Sie verwenden getAttribute.
Jeffrey Martinez

27

Sie können dies tun:

webelement time=driver.findElement(By.id("input_name")).getAttribute("value");

Dadurch erhalten Sie die Zeit, die auf der Webseite angezeigt wird.


17

Mit Selen 2,

Normalerweise schreibe ich es so:

WebElement element = driver.findElement(By.id("input_name"));
String elementval = element.getAttribute("value");

ODER

String elementval = driver.findElement(By.id("input_name")).getAttribute("value");


5

Nach der Antwort von @ragzzy verwende ich

 public static string Value(this IWebElement element, IJavaScriptExecutor javaScriptExecutor)
    {

        try
        {
            string value = javaScriptExecutor.ExecuteScript("return arguments[0].value", element) as string;
            return value;
        }
        catch (Exception)
        {
            return null;
        }
    }

Es funktioniert ganz gut und verändert das DOM nicht


5

Wie bereits erwähnt, können Sie so etwas tun

public String getVal(WebElement webElement) {
    JavascriptExecutor e = (JavascriptExecutor) driver;
    return (String) e.executeScript(String.format("return $('#%s').val();", webElement.getAttribute("id")));
}

Wie Sie jedoch sehen können, muss Ihr Element ein idAttribut und auch eine Abfrage auf Ihrer Seite haben.


1

Wenn der Eingabewert von einem Skript mit einer gewissen Latenz (z. B. AJAX-Aufruf) ausgefüllt wird, müssen Sie warten, bis die Eingabe ausgefüllt wurde. Z.B

var w = new WebDriverWait(WebBrowser, TimeSpan.FromSeconds(10));
            w.Until((d) => {
                // Wait until the input has a value...

                var elements = d.FindElements(By.Name(name));

                var ele = elements.SingleOrDefault();

                if (ele != null)
                {
                    // Found a single element

                    if (ele.GetAttribute("value") != "")
                    {
                        // We have a value now
                        return true;
                    }
                }

                return false;
                });

        var e = WebBrowser.Current.FindElement(By.Name(name));

        if (e.GetAttribute("value") != value)
        {
            Assert.Fail("Result contains a field named '{0}', but its value is '{1}', not '{2}' as expected", name, e.GetAttribute("value"), value);
        }

0

element.GetAttribute ("Wert");

Wenn Sie das Attribut "value" in HTML dom nicht sehen, wird der Feldwert auf der GUI angezeigt.


-1

Das ist irgendwie hackig, aber es funktioniert.

Ich benutzte JavascriptExecutorund eine hinzugefügt , divum die HTML, und änderte den Text in der divbis $('#prettyTime').val()ich dann Selen verwendet abrufen das divund greifen ihren Wert. Nachdem ich die Richtigkeit des Wertes getestet hatte, entfernte ich das gerade erstellte div.


11
Dies sollte nicht die akzeptierte Antwort sein. Selbst wenn Sie JS verwenden, können Sie dies einfach ausführen und zurückgeben (anstatt mit dem DOM herumzuspielen).
Matt Luongo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.