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

В HTML файле webapp имеется следующий код

<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, и ничего не получало фактическое значение, которое видит пользователь. Любая помощь? Спасибо.

Ответ 1

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

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

Ответ 2

Попробуйте element.getAttribute("value")

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

Примечание. Дело имеет значение. Если вы укажете "Значение", вы получите значение "null". Это верно для С# по крайней мере.

Ответ 3

Вы можете сделать следующее:

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

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

Ответ 4

С селеном 2,

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

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

ИЛИ

String elementval = driver.findElement(By.id("input_name")).getAttribute("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

Ответ 6

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

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

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

Ответ 7

Если входное значение заполняется script, которое имеет некоторую задержку (например, вызов 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);
        }