2
respostas

Solução Alternativa - Testando a alteração de um usuário. Fiz certo?

Pessoal, depois que terminei o código do exercício, notei que no enunciado dizia "(você precisará alterar o UsuariosPage e criar o AlteraUsuarioPage)."

Mas cheguei na minha validação OK com o código abaixo. Como estou meio perdido ainda com relação a orientação a objetos, fiquei na dúvida se minha solução também é válida.

Reutilizei os métodos do UsuariosPage para realizar a edição, porque é a mesma tela que é chamada. Sei que o recomendado seria implementar o AlteraUsuariosPage como boa prática, mas para o efeito do exercício proposto pareceu ok.

package Teste.Alura.Cadastro;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class UsuariosSystemTest {

    private WebDriver driver;
    private UsuariosPage usuarios;


    @Before 
    public void inicializa () {
        this.driver = new FirefoxDriver();        
        this.usuarios = new UsuariosPage(driver);

        // visitamos a pagina de usuarios
        usuarios.visita();
    }

    @After
    public void encerra(){
        driver.close();
    }

    @Test
    public void adicionaUsuario(){
        usuarios.novo()
        .cadastra("Usuario Qualquer","qualquer@terra.com.br");

        assertTrue(usuarios.existeNaListagem("Usuario Qualquer","qualquer@terra.com.br"));
    }

    @Test
    public void loginBranco(){
        NovoUsuarioPage form = usuarios.novo();
        form.cadastra("", "");

        assertTrue(form.camposObrigatorios());
    }

    @Test
    public void addRemoveUsuario(){

        usuarios.novo()
        .cadastra("Usuario Qualquer","qualquer@terra.com.br");

        assertTrue(usuarios.existeNaListagem("Usuario Qualquer","qualquer@terra.com.br"));

        usuarios.excluiUsuario(1);

        assertFalse(usuarios.existeNaListagem("Usuario Qualquer", "qualquer@terra.com.br"));

    }

    @Test
    public void editarUsuario(){
        this.adicionaUsuario();
        NovoUsuarioPage edit = usuarios.editaUsuario();
        edit.cadastra("Usuario Editado", "email@editado");

        assertTrue(usuarios.existeNaListagem("Usuario Editado", "email@editado"));

    }

package Teste.Alura.Cadastro;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class UsuariosPage {

    private WebDriver driver;

    public UsuariosPage(WebDriver driver){
        this.driver = driver;
    }

    public void visita(){
        driver.get("localhost:8080/usuarios");
    }

    public NovoUsuarioPage novo(){
        // clica no link de novo usuario
        driver.findElement(By.linkText("Novo Usuário")).click();
        //retorna a classe que representa a nova pagina
        return new NovoUsuarioPage(driver);
    }

    public boolean existeNaListagem(String nome, String email){
        //verifica se ambos aparecem na listagem
        return driver.getPageSource().contains(nome) &&
                driver.getPageSource().contains(email);

    }

    public void excluiUsuario(int posicao){
        //posicao = 1; // queremos o 1o botao da pagina
        driver.findElements(By.tagName("button")).get(posicao-1).click();

        // pega o alert que está aberto
        Alert alert = driver.switchTo().alert();
        // confirma
        alert.accept();
    }

    public NovoUsuarioPage editaUsuario(){
        int posicao = 1; // 1o link de editar que aparecer
        driver.findElements(By.linkText("editar")).get(posicao-1).click();

        return new NovoUsuarioPage(driver);

    }


}

package Teste.Alura.Cadastro;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class NovoUsuarioPage {
    private WebDriver driver;

    public NovoUsuarioPage (WebDriver driver){
        this.driver = driver;
    }

    public void cadastra (String nome, String email){

        WebElement txtNome = driver.findElement(By.name("usuario.nome"));
        WebElement txtEmail = driver.findElement(By.name("usuario.email"));

        txtNome.sendKeys(nome);
        txtEmail.sendKeys(email);

        txtNome.submit();
    }

    public void cadastraVazio(String nomeVazio, String emailVazio){
        //verifica se ambos campos são obrigatórios no cadastro
                WebElement txtNomeVazio = driver.findElement(By.name("usuario.nome"));
                txtNomeVazio.submit();

    }

    public boolean camposObrigatorios(){
                return driver.getPageSource().contains("Nome obrigatorio!") &&
                        driver.getPageSource().contains("E-mail obrigatorio!");

    }

}
2 respostas

Oi Luiz, tudo bem ?

Aparentemente seu código está funcionando.

O pattern PageObject ajuda na hora de ler o teste, deixando o mais semântico e deixando todos os testes e comportamentos de determinada página isolados.

Espero ter deixado um pouco mais claro.

Abraços

Olá Luiz,

se no fundo sua tela de novo usuário e a tela de edição são a mesma, não há tanto problema assim em usar a mesma Page para ambos os cenários. Só que nesta situação o que pode confundir um pouco é o nome da classes e dos métodos. Por exemplo,

NovoUsuarioPage edit = usuarios.editaUsuario();

Você chama um método dizendo que está editando um usuário, mas a página que acessa fala que você está adicionando um novo usuário.

Talvez se você mudar a NovoUsuarioPage para UsuarioPage e a UsuariosPage para ListaUsuariosPage já deixe a leitura do código um pouco melhor.