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

Resolução do Professor está incompleta

Olá galera. O professor sugere fazer uma mudança no código:

03 Testando validação do cadastro de leilão

"O que acontece se cadastrarmos um leilão sem nome ou valor inicial? Uma mensagem de validação deve aparecer!

Escreva o teste que garanta que isso aconteça.

Lembre-se que um bom lugar para colocar o código que checa se a validação apareceu é no próprio NovoLeilaoPage."

Porém ele só passa a resolução do código na classe NovoLeilaoPage, não passa o código da classe de teste:

No final eu coloco meu código da classe de teste que está dando erro e não sei resolver.

public class NovoLeilaoPage {

    private WebDriver driver;

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

    public void preenche(String nome, double valor, String usuario, boolean usado) {

        WebElement txtNome = driver.findElement(By.name("leilao.nome"));
        WebElement txtValor = driver.findElement(By.name("leilao.valorInicial"));

        txtNome.sendKeys(nome);
        txtValor.sendKeys(String.valueOf(valor));

        WebElement combo = driver.findElement(By.name("leilao.usuario.id"));
        Select cbUsuario = new Select(combo);
        cbUsuario.selectByVisibleText(usuario);

        if(usado) {
            WebElement ckUsado = driver.findElement(By.name("leilao.usado"));
            ckUsado.click();
        }

        txtNome.submit();
    }

    public boolean validacaoDeProdutoApareceu() {
        return driver.getPageSource().contains("Nome obrigatorio!");
    }

    public boolean validacaoDeValorApareceu() {
        return driver.getPageSource()
                .contains("Valor inicial deve ser maior que zero!");
    }

}

Agora o código da minha classe de testes:

package br.com.caelum.teste;

import static org.junit.Assert.assertTrue;

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 LeiloesSystemTest {

    private WebDriver driver;
    private LeiloesPage leiloesPage;

    @Before
    public void inicializa() {
        System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
        this.driver = new FirefoxDriver();
        this.leiloesPage = new LeiloesPage(driver);

//        UsuariosPage usuariosPage = new UsuariosPage(driver);
//        usuariosPage.visita();
//        usuariosPage.novo().cadastra("Paulo Henrique", "paulo.henrique@hotmail.com");
    }

//    @Test
//    public void DeveCadastrarUmLeilao() {
//        leiloesPage.visita();        
//        
//        leiloesPage.novo().preenche("Fogão", 1000, "Paulo Henrique", true);
//
////        NovoLeilaoPage novoLeilaoPage = leiloesPage.novo();
////        novoLeilaoPage.preenche("Fogão", 1000, "Paulo Henrique", true);
//
//        assertTrue(leiloesPage.existe("Fogão", 1000, "Paulo Henrique", true));
//    }

    @Test
    public void naoDeveCadastrarLeilaoSemNomeOuValor() {
        leiloesPage.visita();

        leiloesPage.novo().preenche("Fogão", 110, "Paulo Henrique", true);

        //assertTrue(leiloesPage.novo().validacaoDeProdutoApareceu() && leiloesPage.novo().validacaoDeValorApareceu());
        assertTrue(leiloesPage.novo().validacaoDeProdutoApareceu());
        assertTrue(leiloesPage.novo().validacaoDeValorApareceu());

    }

    @After
    public void finaliza() {
        driver.close();
    }
}
4 respostas

CONTINUANDO...

O erro de "no such element exception" é exibido e diz que não foi possível encontrar o elemento "Novo Leilão":

org.openqa.selenium.NoSuchElementException: Unable to locate element: Novo Leilão
For documentation on this error, please visit: https://www.seleniumhq.org/exceptions/no_such_element.html
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:53'
System info: host: 'LUPPI-PC', ip: '192.168.1.110', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_221'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities {acceptInsecureCerts: true, browserName: firefox, browserVersion: 68.0.1, javascriptEnabled: true, moz:accessibilityChecks: false, moz:buildID: 20190717172542, moz:geckodriverVersion: 0.24.0, moz:headless: false, moz:processID: 4744, moz:profile: C:\Users\adoni\AppData\Loca..., moz:shutdownTimeout: 60000, moz:useNonSpecCompliantPointerOrigin: false, moz:webdriverClick: true, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, platformVersion: 10.0, rotatable: false, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify}
Session ID: 2d251186-b0d2-4e44-a2bb-a8c2a7dbecb0
*** Element info: {Using=link text, value=Novo Leilão}
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:323)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByLinkText(RemoteWebDriver.java:380)
    at org.openqa.selenium.By$ByLinkText.findElement(By.java:220)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315)
    at br.com.caelum.teste.LeiloesPage.novo(LeiloesPage.java:21)
    at br.com.caelum.teste.LeiloesSystemTest.NaoDeveCadastrarLeilaoSemNomeOuEmail(LeiloesSystemTest.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

leiloesPage.novo().preenche("Qualquer valor", 10, "Paulo Henrique", true);

Quando eu informo valores nessa linha acima ele retorna outro erro:

java.lang.AssertionError
    at org.junit.Assert.fail(Assert.java:86)
    at org.junit.Assert.assertTrue(Assert.java:41)
    at org.junit.Assert.assertTrue(Assert.java:52)
    at br.com.caelum.teste.LeiloesSystemTest.NaoDeveCadastrarLeilaoSemNomeOuEmail(LeiloesSystemTest.java:45)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

Debugando o código eu percebi que ele passa por aqui normalmente:

public NovoLeilaoPage novo() {
        driver.findElement(By.linkText("Novo Leilão")).click();        
        return new NovoLeilaoPage(driver);
    }

As variáveis são todas preenchidas e o teste roda até o fim:

assertTrue(leiloesPage.novo().validacaoDeProdutoApareceu());
        assertTrue(leiloesPage.novo().validacaoDeValorApareceu());

Mas agora estou deixando essa parte do código assim:

assertTrue(leiloesPage.novo().validacaoDeProdutoApareceu() && leiloesPage.novo().validacaoDeValorApareceu());

Não sei se fica melhor ou pior hahahah

solução!

Consegui resolver o problema. Tive que fazer uns ajustes e o código ficou assim:

package br.com.caelum.teste;

import static org.junit.Assert.assertTrue;

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 LeiloesSystemTest {

    private WebDriver driver;
    private LeiloesPage leiloesPage;

    @Before
    public void inicializa() {
        System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
        this.driver = new FirefoxDriver();
        this.leiloesPage = new LeiloesPage(driver);

        driver.get("http://localhost:8080/apenas-teste/limpa");

        UsuariosPage usuariosPage = new UsuariosPage(driver);
        usuariosPage.visita();
        usuariosPage.novo().cadastra("Paulo Henrique", "paulo.henrique@hotmail.com");
    }

//    @Test
//    public void deveCadastrarUmLeilao() {
//            
//        leiloesPage.novo().preenche("Fogão", 1000, "Paulo Henrique", true);
//
////        NovoLeilaoPage novoLeilaoPage = leiloesPage.novo();
////        novoLeilaoPage.preenche("Fogão", 1000, "Paulo Henrique", true);
//
//        assertTrue(leiloesPage.existe("Fogão", 1000, "Paulo Henrique", true));
//    }

    @Test
    public void naoDeveCadastrarLeilaoSemNomeOuValor() throws Exception{
        leiloesPage.visita();

        leiloesPage.novo().preenche("", 0, "Paulo Henrique", true);

        Thread.sleep(1000);        

        assertTrue(leiloesPage.validacaoDeProdutoApareceu() && leiloesPage.validacaoDeValorApareceu());


//        assertTrue(leiloesPage.novo().validacaoDeProdutoApareceu());
//        assertTrue(leiloesPage.novo().validacaoDeValorApareceu());

    }

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

Devido o sistema web da Alura mudar a URL para http://localhost:8080/leiloes no momento em que vc tenta cadastrar sem aquelas informações, os métodos têm que ficar na classe LeiloesPage e não na NovoLeilaoPage como a resolução do professor pede para fazer:

package br.com.caelum.teste;

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

public class LeiloesPage {

    private WebDriver driver;

    public LeiloesPage(WebDriver driver) {
        this.driver = driver;

    }

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

    public NovoLeilaoPage novo() {
        driver.findElement(By.linkText("Novo Leilão")).click();
        return new NovoLeilaoPage(driver);
    }

    public boolean existe(String produto, double valor, String usuario, boolean usado) {

        return driver.getPageSource().contains(produto) && driver.getPageSource().contains(String.valueOf(valor))
                && driver.getPageSource().contains(usado ? "Sim" : "Não");

    }

    public boolean validacaoDeProdutoApareceu() {
        return driver.getPageSource().contains("Nome obrigatorio!");
    }

    public boolean validacaoDeValorApareceu() {
        return driver.getPageSource().contains("Valor inicial deve ser maior que zero!");
    }

}
package br.com.caelum.teste;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.Select;

public class NovoLeilaoPage {

    private WebDriver driver;

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

    public void preenche(String nome, double valor, String usuario, boolean usado) {

        WebElement txtNome = driver.findElement(By.name("leilao.nome"));
        WebElement txtValor = driver.findElement(By.name("leilao.valorInicial"));

        txtNome.sendKeys(nome);

        // o sendkeys recebe uma string, por isso é preciso converter:
        txtValor.sendKeys(String.valueOf(valor));

        // No combobox não fazemos uso do sendkeys,
        // Usamos metodos mais inteligentes para achar elementos de um combobox, a
        // classe Select:

        Select cbUsuario = new Select(driver.findElement(By.name("leilao.usuario.id")));
//        WebElement combo = driver.findElement(By.name("leilao.usuario.id"));
//      Select cbUsuario = new Select(combo);        

        cbUsuario.selectByVisibleText(usuario);

        // só clicamos no checkbox "usado" se a variável "usado" == true:
        if (usado) {
            driver.findElement(By.name("leilao.usado")).click();

//            WebElement ckUsado = driver.findElement(By.name("leilao.usado"));
//            ckUsado.click();
        }

        // txtNome.submit();Por algum motivo não valida no assertTrue...

        // isso aqui deu certo! Ele clica no botão "Salvar!" do menu "Leilões"
        // na verdade ele clica na tagname botão e pega (get) a posição dela, que no
        // caso é o 0
        driver.findElements(By.tagName("button")).get(0).click();

    }

//    public boolean validacaoDeProdutoApareceu() {
//        return driver.getPageSource().contains("Nome obrigatorio!");
//    }
//
//    public boolean validacaoDeValorApareceu() {
//        return driver.getPageSource().contains("Valor inicial deve ser maior que zero!");
//    }

}

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