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.

jamesfzhang
quelle

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 #.

Prestomanifest
quelle
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.

Praveen
quelle
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");
e1che
quelle
9

Für Python-Bindungen gilt Folgendes:

element.get_attribute('value')
Sajid Manzoor
quelle
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

Vfleitao
quelle
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.

raggzy
quelle
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);
        }
Saille
quelle
0

element.GetAttribute ("Wert");

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

Rajesh
quelle
-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.

jamesfzhang
quelle
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