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

impossivel localizar o elemento css nome

org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"#nome"}

Recebi o seguinte erro, achei até que poderia ser algum erro de digitação e copiei os códigos que foram transcritos na aula mas de maneira alguma ele está indentificando o css nome

O que posso fazer?

5 respostas

Oi Giovanna,

Tem 2 possibilidades:

  • Na página html o elemento está sem o id="nome"
  • No teste você navegou para outra página que não tem esse elemento

Dá uma conferida no código se é alguma dessas.

notei que o problema era em identificar qualquer seletor css, não somente o nome mas também o valorInicial e dataAbertura, porque:

o teste está executando certo até aqui

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

porém depois disso notei que ele esta conseguindo logar, é redirecionado a pagina de leiloes, porém ao invés de ele cadastrar um novo leilao, uma outra guia é aberta cai novamente na pagina de login, quando fecho essa guia, vejo que a anterior ainda está parada na pagina /leiloes e nao está sendo encaminhada para leiloes/new mesmo eu ja tendo logado.

Entendo que o erro do seletor css vinha dai pois nao tinha como localizar um elemento de uma pagina que o browser nem estava.

Creio que com essa explicação ficará mais simples de vcs ajudarem na resolução do problema.

Segue restante do código da classe LeiloesTest:

public class LeiloesTest {

private LeiloesPage paginaDeLeiloes;


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

}

@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 = "Leilao do dia" +hoje;
    String valor = "500.00";


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

    }

}

código da classe LeiloesPage:

public class LeiloesPage {

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

    private WebDriver browser;

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

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

código CadastroLeilaoPage:

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.name("nome")).sendKeys(nome);
    this.browser.findElement(By.name("valorInicial")).sendKeys(valorInicial);
    this.browser.findElement(By.name("dataAbertura")).sendKeys(dataAbertura);
    this.browser.findElement(By.id("button-submit")).submit();

    return new LeiloesPage(browser);
}
}

e segue alteração feita para adicionar o id a tabela:

<table id="tabela-leiloes"

Conto muito com a ajuda de vocês, estou achando o curso extremamente produtivo, porém mesmo executando as exatas instruções do professor não está dando certo.

Acredito que com esses detalhes do código facilitará para vcs localizarem a raiz do problema.

No aguardo!

todos os ids citados estao no html, eu conferi... detalhei melhor o problema no comentário a cima, muito obrigada por responder! Com esses maiores detalhes vc consegue identificar o problema, Rodrigo?

solução!

Oi Giovanna,

Acho que o problema está no construtor da classe LeiloesPage, que está instanciando um novo ChromeDriver, fazendo com que o selenium perca a sessão anterior:

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

Altere esse construtor para:

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

E veja se resolve o problema.

Deu certo Rodrigo, o problema era esse mesmo, valeu pela ajuda!! Pode desconsiderar os outros tópicos em aberto pois era todos sobre esse assunto. Muito obrigada pelo apoio, ótimo dia!!