使用Selenium Web驱动程序检索HTML输入的值


122

在Webapp的HTML中,有以下代码

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

页面上实际显示的是显示时间的字符串。

硒网络驱动器,我有一个WebElement对象指的是<input>使用

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

我想获取的值,WebElement换句话说,就是页面上打印的内容。我尝试了所有的WebElement吸气剂,但没有任何方法可以检索用户看到的实际值。有什么帮助吗?谢谢。

Answers:


212

尝试 element.getAttribute("value")

text属性用于元素标签中的文本。对于输入元素,显示的文本不是由<input>标签包裹的,而是位于value属性内。

注意:大小写很重要。如果指定“值”,则将返回“空”值。至少对于C#如此。


12
getAttribute("value")真的是怎么做到的?那没有任何意义。元素的value属性input与其value属性之间存在很大差异。Selenium会做jQuery的可怕事情并将其合并吗?
TJ Crowder

这就是我现在遇到的问题:尝试从textarea中获取一个值,该值既不是“ value”属性,也不是标记间文本(动态设置为“ value”属性。)
CF

2
好吧,事实证明,如果缺少该属性,它将尝试获取相应的属性。因此,您可以从文本区域中获取“值”。
CF CF

显然,这是我设法访问angulat材料表单字段的唯一方法
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中看不到“ value”属性,也将在GUI上显示字段值。


-1

这有点hacky,但是行得通。

我使用JavascriptExecutor并增加了div对HTML,并改变了文本div$('#prettyTime').val()我,然后用硒检索div并抓住它的价值。在测试了值的正确性之后,我删除了刚刚创建的div。


11
这不应该是公认的答案。即使使用JS,您也可以执行并返回该代码(而不是弄乱DOM)。
Matt Luongo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.