Использование Selenium Web Driver для получения значения ввода HTML

122

В HTML-коде веб-приложения есть следующий код

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

Фактически на странице отображается строка, отображающая время.

В Selenium Web Driver у меня есть WebElementобъект, относящийся к <input>использованию

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

Я хочу получить значение WebElementили, другими словами, то, что напечатано на странице. Я перепробовал все WebElementгеттеры, и ничего не получало фактического значения, которое видит пользователь. Любая помощь? Спасибо.

jamesfzhang
источник

Ответы:

212

Пытаться element.getAttribute("value")

textСвойство текст в тегах элемента. Для элементов ввода отображаемый текст не оборачивается <input>тегом, а находится внутри valueатрибута.

Примечание: дело имеет значение. Если вы укажете «Значение», вы вернете нулевое значение. По крайней мере, это верно для C #.

prestomanifesto
источник
12
getAttribute("value")это на самом деле , как вы это делаете ?! В этом нет никакого смысла. Есть большая разница между valueатрибутом inputэлемента и его valueсвойством. Делает ли Selenium ужасную вещь, которую делает jQuery, и объединяет ли их?
TJ Crowder
Вот с чем я столкнулся прямо сейчас: попытка получить значение из текстового поля, которое не является ни атрибутом «значение», ни текстом между тегами (устанавливается динамически как атрибут «значение».
CF
2
Что ж, оказывается, если атрибут отсутствует, он попытается получить соответствующее свойство. Таким образом, вы можете взять «значение» из текстового поля.
CF
По-видимому, это единственный способ получить доступ к полям формы материала
angulat
Для пользователей javascript не забывайте awaitпри использовании getAttribute.
Джеффри Мартинес
28

Сделать можно так:

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

это даст вам время, отображаемое на веб-странице.

Praveen
источник
17

С селеном 2,

я обычно пишу это так:

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

ИЛИ

String elementval = driver.findElement(By.id("input_name")).getAttribute("value");
e1che
источник
10

Для привязок python это будет:

element.get_attribute('value')
Саджид Манзур
источник
5

После ответа @ragzzy я использую

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

Он работает довольно хорошо и не меняет DOM

Vfleitao
источник
5

Как уже упоминалось ранее, вы можете сделать что-то подобное

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

Но, как видите, у вашего элемента должен быть idатрибут, а также jquery на вашей странице.

raggzy
источник
1

Если входное значение заполняется сценарием, который имеет некоторую задержку (например, вызов AJAX), вам нужно подождать, пока вход не будет заполнен. Например

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
источник
0

element.GetAttribute ( "значение");

Хотя, если вы не видите атрибут «значение» в html dom, вы получите значение поля, отображаемое в графическом интерфейсе.

Раджеш
источник
-1

Это вроде хакерства, но работает.

Я JavascriptExecutorи добавил divк HTML, и изменил текст в divк $('#prettyTime').val()I затем используется Selenium для извлечения divи захватить его значение. После проверки правильности значения я удалил только что созданный div.

jamesfzhang
источник
11
Это не должен быть принятый ответ. Даже если вы используете JS, вы можете просто выполнить и вернуть это (вместо того, чтобы возиться с DOM).
Мэтт Луонго