Utilisation du pilote Web Selenium pour récupérer la valeur d'une entrée HTML


122

Dans le HTML d'une webapp, il y a le code suivant

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

Ce qui est réellement affiché sur la page est une chaîne affichant l'heure.

Dans Selenium Web Driver, j'ai un WebElementobjet faisant référence à l' <input>utilisation

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

Je veux obtenir la valeur de WebElement, ou, en d'autres termes, ce qui est imprimé sur la page. J'ai essayé tous les WebElementgetters et rien n'a récupéré la valeur réelle que l'utilisateur voit. De l'aide? Merci.

Réponses:


212

Essayer element.getAttribute("value")

La textpropriété est pour le texte dans les balises d'un élément. Pour les éléments d'entrée, le texte affiché n'est pas enveloppé par la <input>balise, mais à l'intérieur de l' valueattribut.

Remarque: le cas est important. Si vous spécifiez "Value", vous récupérerez une valeur "null". Cela est vrai au moins pour C #.


12
getAttribute("value")c'est vraiment comment tu fais ça?! Cela n'a aucun sens. Il y a une grande différence entre l' valueattribut d'un inputélément et sa valuepropriété. Selenium fait-il la chose horrible que jQuery fait et les confond?
TJ Crowder

C'est ce que j'ai rencontré en ce moment: essayer d'obtenir une valeur d'une zone de texte, qui n'est ni un attribut "value", ni un texte entre balises (défini dynamiquement comme attribut "value".
CF

2
Eh bien, il s'avère que si l'attribut est manquant, il essaiera d'obtenir la propriété correspondante. Vous pouvez donc prendre une "valeur" dans une zone de texte.
CF

Apparemment, c'est la seule façon dont j'ai réussi à accéder aux champs de forme matérielle
angulat

Pour les utilisateurs javascript, n'oubliez pas le awaitlors de l'utilisation getAttribute.
Jeffrey Martinez

28

Vous pouvez faire comme ceci:

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

cela vous donnera l'heure affichée sur la page Web.


17

Avec du sélénium 2,

je l'écris généralement comme ça:

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

OU

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


5

J'utilise la réponse de @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;
        }
    }

Cela fonctionne assez bien et n'altère pas le DOM


5

Comme mentionné précédemment, vous pouvez faire quelque chose comme ça

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

Mais comme vous pouvez le voir, votre élément doit avoir un idattribut, ainsi que jquery sur votre page.


1

Si la valeur d'entrée est remplie par un script qui a une certaine latence (par exemple, un appel AJAX), vous devez attendre que l'entrée soit remplie. Par exemple

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

Même si vous ne voyez pas l'attribut "value" dans html dom, vous obtiendrez la valeur du champ affichée sur l'interface graphique.


-1

C'est un peu piraté, mais ça marche.

J'ai utilisé JavascriptExecutoret ajouté un divau HTML, et changé le texte dans le diven $('#prettyTime').val()J'ai ensuite utilisé Selenium pour récupérer le divet saisir sa valeur. Après avoir testé l'exactitude de la valeur, j'ai supprimé le div qui venait d'être créé.


11
Cela ne devrait pas être la réponse acceptée. Même si vous utilisez JS, vous pouvez simplement l'exécuter et le renvoyer (au lieu de jouer avec le DOM).
Matt Luongo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.