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.

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


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.


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");


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


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.


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

0

element.GetAttribute ("wartość");

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


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


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.