Usando o Selenium Web Driver para recuperar o valor de uma entrada HTML

122

No HTML de um webapp existe o seguinte código

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

O que realmente é mostrado na página é uma string exibindo a hora.

No Selenium Web Driver, tenho um WebElementobjeto que se refere ao <input>uso

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

Quero obter o valor de WebElement, ou, em outras palavras, o que está impresso na página. Tentei todos os WebElementgetters e nada recuperou o valor real que o usuário vê. Qualquer ajuda? Obrigado.

Jamesfzhang
fonte

Respostas:

212

Experimentar element.getAttribute("value")

A textpropriedade é para o texto dentro das tags de um elemento. Para elementos de entrada, o texto exibido não é envolvido pela <input>tag, em vez disso, está dentro do valueatributo.

Observação: casos importantes. Se você especificar "Value", obterá um valor 'nulo' de volta. Isso é verdadeiro para C #, pelo menos.

prestomanifesto
fonte
12
getAttribute("value")é realmente como você faz isso ?! Isso não faz sentido. Há uma grande diferença entre o valueatributo de um inputelemento e sua valuepropriedade. O Selenium faz a coisa horrível que o jQuery faz e os confunde?
TJ Crowder
Isso é o que eu encontrei agora: tentar obter um valor de uma textarea, que não é um atributo "valor", nem um texto entre tags (definido dinamicamente como atributo "valor".
CF
2
Bem, acontece que se o atributo estiver faltando, ele tentará obter a propriedade correspondente. Portanto, você pode obter um "valor" de uma textarea.
CF
Aparentemente, esta é a única maneira que consegui acessar os campos de formulário de material
angulat
Para usuários de javascript, não se esqueça do awaitao usar getAttribute.
Jeffrey Martinez
28

Você pode fazer assim:

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

isso lhe dará o tempo de exibição na página da web.

Praveen
fonte
17

Com selênio 2,

eu normalmente escrevo assim:

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
fonte
9

Para ligações python, será:

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

Seguindo a resposta de @ragzzy, eu 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 muito bem e não altera o DOM

Vfleitao
fonte
5

Como foi mencionado antes, você poderia fazer algo assim

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

Mas, como você pode ver, seu elemento deve ter um idatributo e também jquery em sua página.

maltrapilho
fonte
1

Se o valor de entrada for preenchido por um script que tem alguma latência envolvida (por exemplo, chamada AJAX), você precisa esperar até que a entrada seja preenchida. Por exemplo

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

element.GetAttribute ("valor");

Mesmo que você não veja o atributo "valor" no dom html, obterá o valor do campo exibido na GUI.

Rajesh
fonte
-1

Isso é meio hacky, mas funciona.

Usei JavascriptExecutore adicionei um divao HTML e alterei o texto no divpara $('#prettyTime').val(), em seguida, usei o Selenium para recuperar o dive obter seu valor. Depois de testar a exatidão do valor, removi o div que acabou de ser criado.

Jamesfzhang
fonte
11
Esta não deve ser a resposta aceita. Mesmo se estiver usando JS, você pode apenas executar e retornar isso (em vez de mexer com o DOM).
Matt Luongo