Использование Selenium Web Driver для получения значения ввода HTML - PullRequest
95 голосов
/ 21 октября 2011

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

Ответы [ 8 ]

179 голосов
/ 21 октября 2011

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

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

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

20 голосов
/ 18 июня 2014

Вы можете сделать так:

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

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

15 голосов
/ 29 марта 2013

с селеном 2,

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

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

OR

String elementval = driver.findElement(By.id("input_name")).getAttribute("value");
5 голосов
/ 05 июня 2018

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

element.get_attribute('value')
5 голосов
/ 09 августа 2016

После ответа @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

4 голосов
/ 25 марта 2014

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

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

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

1 голос
/ 08 января 2013

Если входное значение заполняется сценарием с некоторой задержкой (например, вызовом 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);
        }
0 голосов
/ 26 октября 2011

Это отчасти хаки, но это работает.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...