Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
17
respostas

A pagina não está sendo direcionada para o fomulario de novo leilão(leiloes/new)

Boa tarde a todos,

Gostaria de saber se alguem poderia me ajudar.... Estou há um bom tempo tentando entender pq não está sendo redirecionado para a pagina leiloes/new.

Quando está com comentário faz o login normalmente porém se eu tirar os comentrário nao faz login e retorna para a pagina de login.

Até os comentarios o teste passa normlmente, depois ele da uma NoSuchException pq nao entra na pagina onde quer prrocurar o nome.

Estou travado nesse problema, desde já agradeço!!

segue meu código:

@Test
public void deveriaCadastrarLeilao() {
    LoginPage paginaDeLogin = new LoginPage();
    paginaDeLogin.preencherFormularioDeLogin("fulano", "pass");
    this.paginaDeLeiloes = paginaDeLogin.efetuaLogin();

//CadastroLeilaoPage paginaDeCadastro = paginaDeLeiloes.carregarFormulario();

// String hoje = LocalDate.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")); // String nome = "Leilao do dia " + hoje; // String valor = "500.00"; // this.paginaDeLeiloes = paginaDeCadastro.cadastrarLeilao(nome, valor, hoje); // Assert.assertTrue(paginaDeLeiloes.isLeilaoCadastrado(nome, valor, hoje));

}

17 respostas

segue as classes completas:

package br.com.alura.leilao.leiloes;

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

public class LeiloesPage {

private static final String URL_CADASTRO_LEILAO = "http://localhost:8080/leiloes/new";

private WebDriver browser;

public LeiloesPage(WebDriver browser) {
    this.browser = browser;
}

public void fechar() { 
    this.browser.quit();
}


public CadastroLeilaoPage carregarFormulario() {
    this.browser.navigate().to(URL_CADASTRO_LEILAO);
    return new CadastroLeilaoPage(browser);

}

public boolean isLeilaoCadastrado(String nome, String valor, String data) {
        WebElement linhaDaTabela = this.browser.findElement(By.cssSelector("#tabela-leiloes tbody tr:last-child"));
        WebElement colunaNome = linhaDaTabela.findElement(By.cssSelector("td:nth-child(1)"));
        WebElement colunaDataAbertura = linhaDaTabela.findElement(By.cssSelector("td:nth-child(2)"));
        WebElement colunaValorInicial = linhaDaTabela.findElement(By.cssSelector("td:nth-child(3)"));

        return colunaNome.getText().equals(nome)
                && colunaDataAbertura.getText().equals(data) 
                && colunaValorInicial.getText().equals(valor);
    }

}

package br.com.alura.leilao.leiloes;

import java.time.LocalDate; import java.time.format.DateTimeFormatter;

import org.junit.Assert; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test;

import br.com.alura.leilao.login.LoginPage;

public class LeiloesTeste {

private LeiloesPage paginaDeLeiloes;

@AfterEach
public void afterEach() {
    this.paginaDeLeiloes.fechar();
} 

@Test
public void deveriaCadastrarLeilao() {
    LoginPage paginaDeLogin = new LoginPage();
    paginaDeLogin.preencherFormularioDeLogin("fulano", "pass");
    this.paginaDeLeiloes = paginaDeLogin.efetuaLogin();

    CadastroLeilaoPage paginaDeCadastro = paginaDeLeiloes.carregarFormulario();

    String hoje = LocalDate.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
    String nome = "Leilao do dia " + hoje;
    String valor = "500.00";

    this.paginaDeLeiloes = paginaDeCadastro.cadastrarLeilao(nome, valor, hoje);

    Assert.assertTrue(paginaDeLeiloes.isLeilaoCadastrado(nome, valor, hoje));

}

}

Oi Daniel,

Posta aqui o código da sua classe LoginPage e também a mensagem de erro quando o teste falha

package br.com.alura.leilao.login;

import org.openqa.selenium.By; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver;

import br.com.alura.leilao.leiloes.LeiloesPage;

public class LoginPage { private static final String URL_LOGIN = "http://localhost:8080/login"; private WebDriver browser;

public LoginPage() {
    System.setProperty("webdriver.gecko.driver", "drivers/geckodriver");
    this.browser = new FirefoxDriver();
    this.browser.navigate().to(URL_LOGIN); 
}

public void fechar() { 
    this.browser.quit(); 
} 

public void preencherFormularioDeLogin(String username, String password) {
    browser.findElement(By.id("username")).sendKeys(username);
    browser.findElement(By.id("password")).sendKeys(password);
}

public LeiloesPage efetuaLogin() {
    browser.findElement(By.id("login-form")).submit();
    return new LeiloesPage(browser);
}



public boolean isPaginaDeLogin() {
    return browser.getCurrentUrl().equals(URL_LOGIN);
}

public String getNomeUsuarioLogado() {
    try {
        return browser.findElement(By.id("usuario-logado")).getText();
    } catch (NoSuchElementException e) {
        return null;
    }
}

public void navegaParaPaginaDeLances() {
    this.browser.navigate().to("http://localhost:8080/leiloes/2");        
}

public boolean contemTexto(String texto) {
    return browser.getPageSource().contains(texto);
}

public boolean isPaginaDeLoginComDadosInvalidos() {
    return browser.getCurrentUrl().equals("http://localhost:8080/login?error");
}

}

org.openqa.selenium.NoSuchElementException: Unable to locate element: #nome 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:17:03' System info: host: 'MacBook-Air-de-Daniel.local', ip: 'fe80:0:0:0:1c0e:da1e:2302:4cbb%en0', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.15.7', java.version: '18' Driver info: org.openqa.selenium.firefox.FirefoxDriver Capabilities {acceptInsecureCerts: true, browserName: firefox, browserVersion: 101.0.1, javascriptEnabled: true, moz:accessibilityChecks: false, moz:buildID: 20220608170832, moz:geckodriverVersion: 0.31.0, moz:headless: false, moz:processID: 2172, moz:profile: /var/folders/mb/81154zds62z..., moz:shutdownTimeout: 60000, moz:useNonSpecCompliantPointerOrigin: false, moz:webdriverClick: true, pageLoadStrategy: normal, platform: MAC, platformName: MAC, platformVersion: 19.6.0, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify} Session ID: 993d00ba-65b7-43f6-bb5b-0c44451ddf2b *** Element info: {Using=id, value=nome} at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483) 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.findElementById(RemoteWebDriver.java:372) at org.openqa.selenium.By$ById.findElement(By.java:188) at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315) at br.com.alura.leilao.leiloes.CadastroLeilaoPage.cadastrarLeilao(CadastroLeilaoPage.java:21) at br.com.alura.leilao.leiloes.LeiloesTeste.deveriaCadastrarLeilao(LeiloesTeste.java:33) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:577) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)

at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6(TestMethodTestDescriptor.java:212) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:208) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:71) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:248) at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$5(DefaultLauncher.java:211) at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:226) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:199) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:141) at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:98) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:529) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)

os teste de login passaram normalmente.

na pagina de LeiloesTeste comeca a falhar na linha (27)

CadastroLeilaoPage paginaDeCadastro = paginaDeLeiloes.carregarFormulario();

O problema parece estar na sua classe CadastroLeilaoPage. Posta o código completo dela aqui também.

package br.com.alura.leilao.leiloes;

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

public class CadastroLeilaoPage {

private WebDriver browser;

public CadastroLeilaoPage(WebDriver browser) {
    this.browser = browser;
}

public void fechar() {
    this.browser.quit();
}



public LeiloesPage cadastrarLeilao(String nome, String valorInicial, String dataAbertura) {
    this.browser.findElement(By.id("nome")).sendKeys(nome);
    this.browser.findElement(By.id("valorInicial")).sendKeys(valorInicial);
    this.browser.findElement(By.id("dataAbertura")).sendKeys(dataAbertura);
    this.browser.findElement(By.id("button-submit")).submit();

    return new LeiloesPage(browser);
}

}

    <div class="container">
        <div th:replace="~{base :: titulo('Novo Leilão')}"></div>
        <form th:action="@{/leiloes}" method="post" th:object="${leilao}" class="card-body">
            <input th:field="*{id}" type="hidden">

            <div class="form-group">
                <label for="nome">Nome:</label>
                <input id="nome" th:field="*{nome}" th:errorclass="is-invalid" class="form-control" placeholder="Nome do leilão">
                <small>Coloque um nome expressivo</small>
                <p class="alert alert-danger" th:if="${#fields.hasErrors('nome')}" th:errors="*{nome}">
            </div>

            <div class="form-group">
                <label for="valorInicial">Valor inicial:</label>
                <input id="valorInicial" th:field="*{valorInicial}" th:errorclass="is-invalid" class="form-control" placeholder="Valor inicial">
                <small>Coloque um valor > 0.1</small>
                <p class="alert alert-danger" th:if="${#fields.hasErrors('valorInicial')}" th:errors="*{valorInicial}">
            </div>

            <div class="form-group">
                <label for="dataAbertura">Data Abertura:</label>
                <input id="dataAbertura" name="dataAbertura" th:value="*{dataAbertura}" 
                th:errorclass="is-invalid" class="form-control" placeholder="Data de abertura" type="text">
                <small>Coloque uma data no formato dd/MM/yyyy</small>
                <p class="alert alert-danger" th:if="${#fields.hasErrors('dataAbertura')}" th:errors="*{dataAbertura}">
            </div>

            <div class="form-group">
                <label for="usuario">Usuário:</label>
                <input th:value="${usuario}" class="form-control" placeholder="Nome do Usuário" type="text" readonly>
            </div>

            <button class="btn btn-primary" id="button-submit" type="submit" role="button">Salvar</button>
        </form>

        <a class="btn btn-primary mt-2" th:href="@{'/leiloes'}" role="button">Voltar</a>
    </div>
</body>

Boa tarde Professor,

Conseuguiu ententender o que pode estar acontecendo? Eu verifiquei tanto o formulario de cadastro de leilao quanto o arquivo index.html e ambos estao com os id's corretos.

Pelo fato de não conseguir acessar a pagina de cadastro de novo leilao não conseigo prosseguir com os demias testes de validação. O problema está sendo o redirecionamento para leiloes/new.

@Test
    public void deveriaCadastrarLeilao() {
        LoginPage paginaDeLogin = new LoginPage();
        paginaDeLogin.preencherFormularioDeLogin("fulano", "pass");
        this.paginaDeLeiloes = paginaDeLogin.efetuaLogin();

Quando eu rodo o teste assim não da problema nenhum, faz o login normalmente e entra na pagina da lista de lieloes cadastrados. Porém quando rodo o teste assim:

@Test
        public void deveriaCadastrarLeilao() {
        LoginPage paginaDeLogin = new LoginPage();
        paginaDeLogin.preencherFormularioDeLogin("fulano", "pass");
        this.paginaDeLeiloes = paginaDeLogin.efetuaLogin();

        CadastroLeilaoPage paginaDeCadastro = paginaDeLeiloes.carregarFormulario();

        String hoje = LocalDate.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy"));
        String nome = "Leilao do dia " + hoje;
        String valor = "500.00";

        this.paginaDeLeiloes = paginaDeCadastro.cadastrarLeilao(nome, valor, hoje);

        Assert.assertTrue(paginaDeLeiloes.isLeilaoCadastrado(nome, valor, hoje));

Da o erro mencionado e a pagina não faz login, não entra nem na lista de leiloes cadastrados nem na URL leiloes/new, volta para a pagina de login, acredito que por isso ele nao acha o elemento #nome buscado pelo css selector, pois não tem nessa pagina, pq é a pagina de login.

Desde já agradeço sua atenção.

Oi Daniel,

Consegue compartilhar o teu projeto? Via GitHub ou link do google drive

Acabei de colocar no GitHub, segue o link.

https://github.com/dr-saes/danielGit

Obrigado professor!

Professor,

Alguma ideia do que pode estar acontecendo?

Olá Professor.

Primeiramente me desculpe a insistência! Estou gostando bastante do treinamento e gostaria mto de entender o que esta acontecendo com o meu projeto. Já refiz a aula 4 vezes e não consigo ententer onde pode estar sendo o meu erro. Peço novamente a gentileza de me ajudar, acredito que possa ser algum detalhe que esteja passando despercebido. Disponibilizei o meu codigo no GitHub. Desde já agradeço pela sua atenção.

solução!

Oi Daniel,

O código está correto sim.

Acredito que seja algum problema do driver do firefox, pois no Chrome funcionou corretamente.

Oi Rodrigo.

Fiz o download do Chrome, rodei e tudo funcionou normalmente. Acredito que deve mesmo ser um problema com o driver do firefox. Desculpe a insistência! Estou gostanto mto do seu treinamento. Grato pela atenção.