Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro no teste de exclusão de usuário no Firefox

Olá, pessoal!

Estou com problema na execução do teste de exclusão de um usuário com o cenário descrito a seguir:

Na classe UsuariosSystemTest,

    @Test
    public void deveExcluirUmUsuario() {

        usuarios.novo().cadastra("Teste de Exclusão", "texclusao@teste.com.br");

        assertTrue(usuarios.existeNaListagem("Teste de Exclusão", "texclusao@teste.com.br"));

        usuarios.excluiUsuarioNaPosicao(1);

        assertFalse(usuarios.existeNaListagem("Teste de Exclusão", "texclusao@teste.com.br"));

    }

Na classe UsuariosPage,

    public void excluiUsuarioNaPosicao(int posicao) {
        driver.findElements(By.tagName("button")).get(posicao - 1).click();

        Alert alert = driver.switchTo().alert();
        alert.accept();

    }

Esse cenário executa sem problemas no Chrome mas apresenta erro no Firefox.

Após várias tentativas de correção, o acréscimo de um comando wait do Selenium fez o teste resultar como o esperado no Firefox mas apresentar erro no Chrome.

Na classe UsuariosPage (para Firefox),

    public void excluiUsuarioNaPosicao(int posicao) {
        driver.findElements(By.tagName("button")).get(posicao - 1).click();

        WebDriverWait wait = new WebDriverWait(driver, 10);

        Alert alert = driver.switchTo().alert();
        alert.accept();

        wait.until(ExpectedConditions.stalenessOf(driver.findElements(By.tagName("button")).get(posicao - 1)));

    }

Sem o comando wait, no Firefox, o comando assertFalse(usuarios.existeNaListagem("Teste de Exclusão", "texclusao@teste.com.br")), executado após a exclusão do registro, retorna true e o teste falha.

No Chrome, a tentativa de acesso ao webElement no comando wait provoca erro.

As versões que estou utilizando:

Selenium selenium-server-standalone-3.11.0

Firefox 58.0.2 (64-bit)

Chrome Versão 65.0.3325.181 (Versão oficial) 64 bits

Windows 7 64 bits

java version "1.8.0_161"

Java(TM) SE Runtime Environment (build 1.8.0_161-b12)

Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

JUnit 4

geckodriver 0.19.1

ChromeDriver 2.37.544315

Onde trabalho, utilizamos os dois browsers e faz-se necessário que os testes respondam corretamente para ambos.

Como resolver essa questão? Alguém poderia me ajudar?

Obrigada. : )

4 respostas

Oi Suely,

Eu tinha visto essa dúvida e acabando ficando com outra. Não fez muito sentido para mim(devo estar redondamente equivocado) o wait causar o erro, já que se a coisa já está na tela você só está adicionando um tempo pré manipulação... Acontece alguma exception? Só para a gente colher mais informações e buscar as causas.

Olá, Alberto!

Desculpe-me. Não ficou claro o erro "provocado pelo wait" no Chrome.

No Chrome, o acesso ao WebElement driver.findElements(By.tagName("button")).get(posicao - 1)), no comando wait, causa a exception java.lang.IndexOutOfBoundsException: Index: 0, Size: 0.

Parece-me que, no Chrome, a página atualiza e o método usuarios.existeNaListagem(nome, email) retorna false quando testa o registro excluído e o assertFalse executa como esperado.

No Firefox, sem o comando wait, o método usuarios.existeNaListagem(nome, email) retorna true quando testa o registro excluído e o assertFalse falha.

O que fazer?

Obrigada pela ajuda! : )

solução!

Olá Suely,

se entendi bem o que aconteceu, parece que no chrome executa o comando alert.accept() e, antes de fazer o wait.until, ele já atualiza a página. Por isso, ao fazer o comando driver.findElements(By.tagName("button")).get(posicao - 1)) no wait ele dá uma exception, porque não existe nenhum botão na tela e a lista vem vazia.

Já no firefox, pode ser que ele realmente não esteja esperando atualizar a tela e fazendo o assert antes. Para confirmar se este é o problema mesmo, você pode executar o teste no firefox em debug, esperando ele terminar de carregar a tela antes de fazer o assert.

De qualquer forma, para resolver o problema da exception no wait o que você pode fazer é no começo do método excluiUsuarioNaPosicao armazenar o elemento buscado pelo comando driver.findElements(By.tagName("button")).get(posicao - 1) numa variável, pois neste instante esse elemento ainda existe na tela. Então reaproveitar essa variável WebElement para fazer os comandos click e o wait.

Olá, Lucas!

O problema é exatamente como você descreveu tanto no Chrome como no Firefox.

A solução, que você apresentou, resolveu o problema. Segue o novo código do método:

    public void excluiUsuarioNaPosicao(int posicao) {
        WebElement botaoExcluir = driver.findElements(By.tagName("button")).get(posicao - 1);
        botaoExcluir.click();

        WebDriverWait wait = new WebDriverWait(driver, 10);

        Alert alert = driver.switchTo().alert();
        alert.accept();

        wait.until(ExpectedConditions.invisibilityOf(botaoExcluir));

    }

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software