Використання веб-драйвера Selenium для отримання значення вводу HTML


122

У HTML веб-сторінки є наступний код

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

Те, що насправді відображається на сторінці, - це рядок із відображенням часу.

У веб-драйвері Selenium у мене є WebElementоб'єкт, що стосується <input>використання

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

Я хочу отримати значення того WebElement, або, іншими словами, того, що надруковано на сторінці. Я спробував усі WebElementгеттери і нічого не знайшов фактичного значення, яке бачить користувач. Будь-яка допомога? Дякую.

Відповіді:


212

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

textВластивість текст в тегах елемента. Для вхідних елементів відображуваний текст не загортається <input>тегом, натомість знаходиться всередині valueатрибута.

Примітка. Справа має значення. Якщо ви вкажете "Value", ви отримаєте значення "null" назад. Це справедливо як мінімум для C #.


12
getAttribute("value")це на самому справі , як ви це робите?! Це не має сенсу. Існує велика різниця між valueатрибутом inputелемента та його valueвластивістю. Чи робить Селен те жахливе, що робить jQuery і збентежує їх?
TJ Crowder

Ось що я натрапив на даний момент: намагаюся отримати значення з textarea, яке не є ні атрибутом "value", ні текстом між тегами (динамічно встановлюється як атрибут "value".
CF

2
Ну, виявляється, якщо атрибут відсутній, він спробує отримати відповідне властивість. Таким чином, ви можете взяти "значення" з textarea.
CF

Мабуть, це єдиний спосіб, коли мені вдалося отримати доступ до полів ангулатного матеріалу
Yennefer

Для користувачів Javascript не забувайте awaitпри використанні getAttribute.
Джефрі Мартінес

28

Ви можете зробити так:

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

це надасть вам час відображення на веб-сторінці.


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


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


5

Як було сказано раніше, ви могли зробити щось подібне

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

Але, як бачите, ваш елемент повинен мати idатрибут, а також jquery на вашій сторінці.


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

0

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

Навіть якщо ви не побачите атрибут "value" в html dom, ви отримаєте значення поля, відображене в графічному інтерфейсі.


-1

Це свого роду хакі, але це працює.

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


11
Це не повинно бути прийнятою відповіддю. Навіть якщо ви використовуєте JS, ви можете просто виконати та повернути це (замість того, щоб возитися з DOM).
Метт Луонго
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.