7
respostas

Unable to locate element

Estacionei na aula 4.3, por não conseguir fazer o teste rodar. Obtenho o erro abaixo: org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"#tabela-leiloes tbody tr:last-child"}

O método isLeilaoCadastrado de LeiloesPage está assim, conforme o exemplo em vídeo. O exemplo em texto contém "table-leiloes', em vez de "tabela-leiloes".

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);
    }

O teste está assim:

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

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

        this.paginaDeLeiloes = paginaDeCadastro.cadastrarLeilao(nome, valor, hoje);
        Assert.assertTrue(paginaDeLeiloes.isLeilaoCadastrado(nome, valor, hoje));
    }

Agradeço desde já.

7 respostas

Oi Elianderson,

Você alterou a página html para adicionar na tabela o id="tabela-leiloes" ?

Sim.

<html>
    <head th:replace="~{base :: head}">
        <meta charset="UTF-8">
    </head>

    <body>
        <div th:replace="~{base :: logo}"></div>

        <div class="container">
            <div th:replace="~{base :: titulo('Leilões cadastrados')}"></div>

            <div class="alert alert-primary" role="alert" th:if="${message}">
                <span th:text="${message}"></span>
            </div>

            <table id="tabela-leiloes" class="table table-hover">
                <thead>
                <tr>
                    <th scope="col">Nome</th>
                    <th scope="col">Data de abertura</th>
                    <th scope="col">Valor inicial</th>
                    <th scope="col">Usuario</th>
                    <th scope="col"></th>
                    <th scope="col"></th>
                </tr>
                </thead>

                <tbody>
                    <tr th:each="leilao : ${leiloes}" >
                        <td scope="row" th:text="${leilao.nome}">Nome</td>
                        <td th:text="${#temporals.format(leilao.dataAbertura, 'dd/MM/yyyy')}">10/02/2020</td>
                        <td th:text="${leilao.valorInicial}">Valor Inicial</td>
                        <td th:text="${leilao.usuario.nome}">Nome do Usuario</td>
                        <td sec:authorize="isAuthenticated()" th:if="${leilao.usuario.nome != usuarioLogado.name && leilao.aberto}">
                            <a class="btn btn-block btn-info" th:href="@{'/leiloes/' + ${leilao.id}}" >dar lance</a>
                        </td>
                        <td sec:authorize="isAuthenticated()" th:if="${leilao.usuario.nome == usuarioLogado.name} ">
                            <a class="btn btn-block btn-primary m-0" th:href="@{'/leiloes/' + ${leilao.id}} + '/form'">editar</a>
                        </td>
                    </tr>
                </tbody>
            </table>
            <br />

            <a class="btn btn-primary" id="novo_leilao_link" th:href="@{'/leiloes/new'}" role="button" sec:authorize="isAuthenticated()">Novo Leilão</a>
        </div>
    </body>
</html>

Estranho, era pra ter funcionado então.

Pode ser algum detalhe que passou batido nos page object.

Consegue compartilhar seu projeto para avaliarmos o que pode ser o problema? pode ser via GitHub ou link do google drive

Acho que o problema está no seu page object LeiloesPage que sempre está navegando para a página de cadastro, sendo que depois que um leilão é cadastrado deveria navegar para a página de lista de leilões.

Estou exatamente com o mesmo problema. Segui a aula direitinho e nada.

Descobri o erro no meu caso. O html que veio não tinha os ids dos inputs usados no exemplo. Acho que seria bom só adicionar eles no código disponibilizado pelo curso, uma vez que no vídeo já tinha eles e não precisou adicionar.