Utilizzo di Selenium Web Driver per recuperare il valore di un input HTML


122

Nell'HTML di una webapp c'è il seguente codice

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

Ciò che viene effettivamente mostrato sulla pagina è una stringa che mostra l'ora.

In Selenium Web Driver, ho un WebElementoggetto che si riferisce <input>all'utilizzo di

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

Voglio ottenere il valore di WebElement, o, in altre parole, ciò che è stampato sulla pagina. Ho provato tutti i WebElementgetter e nulla ha recuperato il valore effettivo che l'utente vede. Qualsiasi aiuto? Grazie.

Risposte:


212

Provare element.getAttribute("value")

La textproprietà è per il testo all'interno dei tag di un elemento. Per gli elementi di input, il testo visualizzato non è racchiuso nel <input>tag, ma è all'interno valuedell'attributo.

Nota: il caso è importante. Se specifichi "Valore", otterrai di nuovo un valore "nullo". Questo è vero almeno per C #.


12
getAttribute("value")è davvero come si fa ?! Non ha alcun senso. C'è una grande differenza tra l' valueattributo di un inputelemento e la sua valueproprietà. Il selenio fa la cosa orribile che fa jQuery e li confonde?
TJ Crowder

Questo è ciò in cui mi sono imbattuto in questo momento: cercare di ottenere un valore da un'area di testo, che non è né un attributo "valore", né un testo tra tag (impostato dinamicamente come attributo "valore".
CF

2
Bene, risulta che se l'attributo manca, proverà a ottenere la proprietà corrispondente. Quindi puoi prendere un "valore" da una textarea.
CF

Apparentemente, questo è l'unico modo in cui sono riuscito ad accedere ai campi del modulo materiale angulat
Yennefer

Per gli utenti javascript, non dimenticare di awaitutilizzare getAttribute.
Jeffrey Martinez,

28

Puoi fare così:

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

questo ti darà il tempo di visualizzazione sulla pagina web.


17

Con selenio 2,

di solito lo scrivo così:

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

A seguito della risposta di @ragzzy che 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;
        }
    }

Funziona abbastanza bene e non altera il DOM


5

Come accennato prima, potresti fare qualcosa del genere

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

Ma come puoi vedere, il tuo elemento deve avere un idattributo e anche jquery sulla tua pagina.


1

Se il valore di input viene popolato da uno script che ha una certa latenza coinvolta (ad esempio una chiamata AJAX), è necessario attendere fino a quando l'input non è stato popolato. Per esempio

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

Anche se se non vedi l'attributo "valore" in html dom, otterrai il valore del campo visualizzato sulla GUI.


-1

Questo è un po 'hacky, ma funziona.

Ho usato JavascriptExecutore aggiunto diva all'HTML, e ho cambiato il testo in diva $('#prettyTime').val()Ho quindi usato Selenium per recuperare dive afferrare il suo valore. Dopo aver verificato la correttezza del valore, ho rimosso il div appena creato.


11
Questa non dovrebbe essere la risposta accettata. Anche se usi JS, puoi semplicemente eseguirlo e restituirlo (invece di scherzare con il DOM).
Matt Luongo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.