Conflito entre aplicações Ajax e testes em Selenium

Olá , bom dia

Estou testando um sistema web , usando o selenium

Quando vou testar a inserção de um novo usuário , os campos obrigatórios nome e sobrenome só aceitam letras , porém estou levando o teste a erros e estou colocando números

Assim que coloco números , a borda do campo que estava vermelha fica azul , indicando que não vou conseguir inserir este usuário

O campo responsável pela borda colorida é esse border-bottom-color , o que poderia fazer para testar essa mudança de cor ?

Obrigada .

Pode postar as tags HTML para maior detalhamento?

Sim , no caso as tags div class ?


<div class="line">
                <label>Nome</label>
                <input required type="text" id="nome" class="input-xlarge" placeholder="Primeiro nome apenas" name="nome" value="<?php echo $this->nome ?>"  data-content="Apenas letras.">
            </div>

Geralmente problemas com Selenium x Ajax são relacionados a esperar o Ajax retornar. Você falou em Ajax no título mas não colocou as partes de códigos relacionadas a ele.

Olá , o código Ajax não é minha autoria .

Mas no caso como você falou que problemas com Ajax são relacionados a esperar o Ajax retornar , esse problema poderia ser resolvido com o comando waitFor() ?

Obrigada .

[quote=jeh_dias]Olá , o código Ajax não é minha autoria .

Mas no caso como você falou que problemas com Ajax são relacionados a esperar o Ajax retornar , esse problema poderia ser resolvido com o comando waitFor() ?

Obrigada .[/quote]
waitFor() logicamente vai funcionar no tempo cravado que você colocar. Mas se quiser saber exatamente quando o Ajax acabou de trabalhar, você testa “jQuery.active == 0” via jquery, fazendo um loop com algum sleep pequeno até que a condição jquery seja satisfeita.

A questão é , quero resolver conflitos de validação de campos , através das cores da borda do campo , pois elas mudam quando o campo contém caracteres inválidos .

Eu não vejo como esses comandos que esperam um tempo antes da validação ou saber quando o Ajax acabou de trabalhar , poderiam me ajudar . Ou vejo quando ele acaba de trabalhar e ai faço o teste que preciso ?

Dá uma olhada nesses exemplos:

http://wiki.openqa.org/display/SEL/waitForCondition

waitForCondition é um método que ja faz mastigado o que falei. Vai ficar testando até conseguir, só tem que passar um timeout pra a coisa não ficar infinita.

Obrigada , vou ler e depois posto dúvidas .

O comando waitForCondition() necessita de um script e um timeout . Esse script é o código em JavaScript que tem o Ajax , certo ?

Não entendi como construir esse script no meu caso . Colocar o script em JavaScript , mas vou ter true e false . Como pegar a transformação ?

Pensando por outro lado , se conseguir colocar o código da transformação , e o retorno for true , quer dizer que a transformação ocorreu e eu consegui o que queria . Mas a questão é o código dessa transformação .

Obrigada .

Segue esses passos. O código abaixo é em C# e meramente ilustrativo pra voce entender a lógica e implementar o seu em Java. As classes e métodos do selenium webdriver são as mesmas usadas para Java , C#, etc. Só mesmo diferença de padrão que no java os nomes dos métodos devem começar em letra minúscula.

            //1 - faz ação real do sistema que faz requisição ajax, exemplo supondo ter um botao pra Salvar:
            webDriver.FindElement(By.Id("botaoSalvar")).Click();

            //2 - esperar o ajax terminar, podendo fazer algo do tipo abaixo ou usar o método waitForCondition que passei no outro post.
            //criar um método genérico pra isso, caso for usar...
            int i = 0;

            //Thread.Sleep(100); //dependendo da fase da lua pode precisar aguardar algum tempo antes

            while (i <= 100)
            {
                if ((bool)(webDriver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"))
                {
                    break;
                }

                Thread.Sleep(200);

                i++;
            }

            //3 - fazer a verificação desejada do teste. Por exemplo verificar se encontrou o elemento que tem a borda azul (supondo nome da class do estilo ".bordaAzul"):
            IWebElement elemento = null;

            try
            {
                elemento = webDriver.FindElement(By.ClassName("bordaAzul"));
            }
            catch (NoSuchElementException)
            {
            }
            catch (InvalidSelectorException)
            {
            }

            bool passouNoTeste = elemento != null;

Muito obrigada pela dica e pelo código .

Vou converter para java e depois posto aqui .

Eu costumo utilizar Selenium IDE, existe o comando waitForElementPresent(locator)

Assim o selenium vai esperar até a classe css existir, caso não ocorra, irá falhar no timeout configurado.