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.

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.


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.


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


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


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.


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

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.


-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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.