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.

jamesfzhang
la source

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

pré-manifeste
la source
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.

Praveen
la source
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");
e1che
la source
9

Pour les liaisons python, ce sera:

element.get_attribute('value')
Sajid Manzoor
la source
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

Vfleitao
la source
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.

dégueulasse
la source
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);
        }
saille
la source
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.

Rajesh
la source
-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éé.

jamesfzhang
la source
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