Korzystanie z Selenium Web Driver do pobierania wartości danych wejściowych HTML

122

W kodzie HTML aplikacji internetowej znajduje się następujący kod

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

To, co faktycznie jest pokazane na stronie, to ciąg znaków wskazujący czas.

W Selenium Web Driver mam WebElementobiekt odnoszący się do <input>using

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

Chcę poznać wartość WebElement, czyli innymi słowy, co jest wydrukowane na stronie. Wypróbowałem wszystkie metody WebElementpobierające i nic nie pobierało rzeczywistej wartości, którą widzi użytkownik. Jakaś pomoc? Dzięki.

jamesfzhang
źródło

Odpowiedzi:

212

Próbować element.getAttribute("value")

textNieruchomość jest dla tekstu w znacznikach danego elementu. W przypadku elementów wejściowych wyświetlany tekst nie jest zawijany <input>znacznikiem, ale znajduje się wewnątrz valueatrybutu.

Uwaga: sprawa ma znaczenie. Jeśli określisz „Wartość”, otrzymasz z powrotem wartość „zerową”. Dotyczy to przynajmniej języka C #.

prestomanifesto
źródło
12
getAttribute("value")czy naprawdę to robisz ?! To nie ma żadnego sensu. Istnieje duża różnica między valueatrybutem inputelementu a jego valuewłaściwością. Czy Selen robi to okropne, co robi jQuery i je łączy?
TJ Crowder
Właśnie na to właśnie się natknąłem: próbując uzyskać wartość z obszaru tekstowego, która nie jest ani atrybutem „value”, ani tekstem między tagami (ustawianymi dynamicznie jako atrybut „wartość”.
CF
2
Okazuje się, że jeśli brakuje atrybutu, spróbuje uzyskać odpowiednią właściwość. Możesz więc pobrać „wartość” z obszaru tekstowego.
CF
Najwyraźniej jest to jedyny sposób, w jaki udało mi się uzyskać dostęp do pól formularza materiału angulat
Yennefer
Użytkownicy javascript nie zapomną o awaitużywaniu getAttribute.
Jeffrey Martinez
28

Możesz zrobić tak:

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

dzięki temu czas wyświetlany na stronie internetowej.

Praveen
źródło
17

Z selenem 2,

zazwyczaj piszę to tak:

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

LUB

String elementval = driver.findElement(By.id("input_name")).getAttribute("value");
e1che
źródło
9

W przypadku powiązań Pythona będzie to:

element.get_attribute('value')
Sajid Manzoor
źródło
5

Po odpowiedzi @ragzzy używam

 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;
        }
    }

Działa całkiem dobrze i nie zmienia DOM

Vfleitao
źródło
5

Jak wspomniano wcześniej, możesz zrobić coś takiego

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

Ale jak widzisz, twój element musi mieć idatrybut, a także jquery na twojej stronie.

postrzępiony
źródło
1

Jeśli wartość wejściowa zostanie wypełniona przez skrypt, który ma pewne opóźnienie (np. Wywołanie AJAX), musisz poczekać, aż dane wejściowe zostaną wypełnione. Na przykład

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);
        }
żaglowiec
źródło
0

element.GetAttribute ("wartość");

Nawet jeśli nie widzisz atrybutu „value” w html dom, otrzymasz wartość pola wyświetlaną w GUI.

Rajesh
źródło
-1

To trochę hakerskie, ale działa.

Kiedyś JavascriptExecutori dodano divdo HTML i zmieniła tekst w divcelu $('#prettyTime').val()I następnie wykorzystywane Selen aby pobrać divi chwycić jego wartość. Po sprawdzeniu poprawności wartości usunąłem właśnie utworzony div.

jamesfzhang
źródło
11
To nie powinna być akceptowana odpowiedź. Nawet jeśli używasz JS, możesz po prostu to wykonać i zwrócić (zamiast mieszać w DOM).
Matt Luongo,