Usando Selenium Web Driver para recuperar el valor de una entrada HTML

122

En el HTML de una aplicación web hay el siguiente código

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

Lo que realmente se muestra en la página es una cadena que muestra la hora.

En Selenium Web Driver, tengo un WebElementobjeto que se refiere al <input>uso

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

Quiero obtener el valor de WebElemento, en otras palabras, lo que está impreso en la página. Probé todos los WebElementcaptadores y nada ha recuperado el valor real que ve el usuario. ¿Alguna ayuda? Gracias.

jamesfzhang
fuente

Respuestas:

212

Tratar element.getAttribute("value")

La textpropiedad es para texto dentro de las etiquetas de un elemento. Para los elementos de entrada, el texto mostrado no está envuelto por la <input>etiqueta, sino que está dentro del valueatributo.

Nota: El caso importa. Si especifica "Valor", obtendrá un valor "nulo". Esto es cierto para C # al menos.

prestomanifesto
fuente
12
getAttribute("value")¿Es realmente cómo haces esto? Eso no tiene ningún sentido. Existe una gran diferencia entre el valueatributo de un inputelemento y su valuepropiedad. ¿Selenium hace lo horrible que hace jQuery y los combina?
TJ Crowder
Eso es con lo que me he encontrado ahora mismo: tratando de obtener un valor de un área de texto, que no es un atributo de "valor" ni un texto entre etiquetas (establecido dinámicamente como atributo de "valor".
CF
2
Bueno, resulta que si falta el atributo, intentará obtener la propiedad correspondiente. Entonces puede tomar un "valor" de un área de texto.
CF
Aparentemente, esta es la única forma en que logré acceder a los campos de formulario de material angulat
Yennefer
Para los usuarios de javascript, no olviden el awaital usar getAttribute.
Jeffrey Martinez
28

Puedes hacer esto:

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

esto le dará el tiempo que se muestra en la página web.

Praveen
fuente
17

Con selenio 2,

normalmente lo escribo así:

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

O

String elementval = driver.findElement(By.id("input_name")).getAttribute("value");
e1che
fuente
9

Para enlaces de Python será:

element.get_attribute('value')
Sajid Manzoor
fuente
5

Siguiendo la respuesta de @ragzzy, uso

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

Funciona bastante bien y no altera el DOM

Vfleitao
fuente
5

Como se mencionó antes, podrías hacer algo así

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

Pero como puede ver, su elemento debe tener un idatributo, y también, jquery en su página.

harapiento
fuente
1

Si el valor de entrada se completa con un script que tiene alguna latencia involucrada (por ejemplo, una llamada AJAX), entonces debe esperar hasta que se complete la entrada. P.ej

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
fuente
0

element.GetAttribute ("valor");

Aunque si no ve el atributo "valor" en html dom, obtendrá el valor del campo que se muestra en la GUI.

Rajesh
fuente
-1

Esto es una especie de truco, pero funciona.

Usé JavascriptExecutory agregué diva al HTML, y cambié el texto en diva $('#prettyTime').val(). Luego usé Selenium para recuperar divy tomar su valor. Después de probar la exactitud del valor, eliminé el div que se acababa de crear.

jamesfzhang
fuente
11
Esta no debería ser la respuesta aceptada. Incluso si usa JS, puede ejecutar y devolver eso (en lugar de jugar con el DOM).
Matt Luongo