7
respostas

Aula 5- Esperando por requisições AJAX (erro ao rodar o teste)

Erro ao rodar a aplicação da aula 5

org.openqa.selenium.NoSuchElementException: Unable to locate element: Novo Usuário 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: 'BRPC009788', ip: '192.168.1.111', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_211' Driver info: org.openqa.selenium.firefox.FirefoxDriver Capabilities {acceptInsecureCerts: true, browserName: firefox, browserVersion: 66.0.5, javascriptEnabled: true, moz:accessibilityChecks: false, moz:geckodriverVersion: 0.24.0, moz:headless: false, moz:processID: 23008, moz:profile: C:\Users\jars\AppData\Local..., 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: 025ed2dd-d042-4170-9f5c-48200ac874a9 *** Element info: {Using=link text, value=Novo Usuário} 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.UsuariosPage.novo(UsuariosPage.java:20) at br.com.caelum.teste.LanceSystemTest.inicializa(LanceSystemTest.java:26) 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.RunBefores.evaluate(RunBefores.java:24) 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)

7 respostas

package br.com.caelum.teste;

import static org.junit.Assert.assertTrue;

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

public class LanceSystemTest {

private FirefoxDriver driver;
private LeiloesPage leiloes;

@Before    
public void inicializa() {

    System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
    driver = new FirefoxDriver();
    leiloes = new LeiloesPage(driver);

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

    UsuariosPage usuarios = new UsuariosPage(driver);
    usuarios.visita();
    usuarios.novo().cadastra("Jessica Rodrigues", "jessica@teste.com");
    usuarios.novo().cadastra("José Eduardo", "jose@teste.com");

    LeiloesPage leiloes = new LeiloesPage(driver);
    leiloes.visita();
    leiloes.novo().preenche("Mesa", 150, "Jessica Rodrigues", false);


}

@Test 
public void deveFazerUmLance() {

    DetalhesDoLeilaoPage lances = leiloes.detalhes(1);

    lances.lance("Jose Eduardo", 150);

    assertTrue(lances.existeLance("Jessica Rodrigues", 150));

}

}

package br.com.caelum.teste;

import java.util.List;

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

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 DetalhesDoLeilaoPage detalhes(int posicao) {

    List<WebElement> elementos = driver.findElements(By.linkText("exibir"));
    elementos.get(posicao -1).click();

    return new DetalhesDoLeilaoPage(driver);
}

}

package br.com.caelum.teste;

import static org.junit.Assert.assertTrue;

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

public class LeiloesSystem {

private WebDriver driver;
private LeiloesPage leiloes;

@Before 
public void inicializa() {

    System.setProperty("webdriver.gecko.driver", "C:\\geckodriver.exe");
    driver = new FirefoxDriver();
    leiloes = new LeiloesPage(driver);

    UsuariosPage usuarios = new UsuariosPage(driver);
    usuarios.visita();
    usuarios.novo().cadastra("Jessica Rodrigues", "jessica@teste.com");

}

@Test
public void deveCadastrarUmLeilao() throws InterruptedException {

    leiloes.visita();
    NovoLeilaoPage novoLeilao = leiloes.novo();        
    novoLeilao.preenche("Carro", 50000, "Jessica Rodrigues", true);

     Thread.sleep(3000);

    assertTrue(leiloes.existe("Carro", 50000, "Jessica Rodrigues", true));        

}

}

Boa noite, Jéssica! Como vai?

Essa abordagem de fazer Thread.sleep() não é boa pois vc pode esperar uma quantidade de tempo muito grande ( o elemento já apareceu e vc continua esperando ) ou muito pequena ( e elemento ainda não apareceu mas a espera já acabou ). Pelo log de erro me parece que é o segundo caso! Sendo assim, a melhor estratégia nesses casos é instruir o Selenium a esperar o determinado elemento aparecer na tela e, somente após isso, prosseguir no que ele precisa fazer!

Contudo, pra te ajudar de forma efetiva, eu preciso saber de uma coisa: qual a versão do Selenium que vc está utilizando? Sabe me dizer?

Olá Gabriel, bom dia!

Eu coloquei o Thread.sleep porque sem isso o meu teste falha, a mensagem exibida é a seguinte:

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.UsuariosSystemTest.deveAdicionarUmUsuario(UsuariosSystemTest.java:35) 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)

Sem o Thread.sleep na classe UsuariosSystemTest, aparece a mensagem a seguir no console:

1558535642870 mozrunner::runner INFO Running command: "C:\Program Files\Mozilla Firefox\firefox.exe" "-marionette" "-foreground" "-no-remote" "-profile" "C:\Users\jars\AppData\Local\Temp\rust_mozprofile.d4oVdM57YXEp" 1558535643875 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: mozillaAddons 1558535643876 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: resource://pdf.js/ 1558535643876 addons.webextension.screenshots@mozilla.org WARN Loading extension 'screenshots@mozilla.org': Reading manifest: Invalid extension permission: about:reader* 1558535646528 Marionette INFO Listening on port 51390 1558535646740 Marionette WARN TLS certificate errors will be ignored for this session mai 22, 2019 11:34:06 AM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Detected dialect: W3C 1558535648119 Marionette INFO Stopped listening on port 51390 [Parent 29016, Gecko_IOThread] WARNING: pipe error: 109: file z:/build/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 332 [Parent 29016, Gecko_IOThread] WARNING: pipe error: 109: file z:/build/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 332 [Child 25924, Chrome_ChildThread] WARNING: pipe error: 109: file z:/build/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 332 [Child 25[Child 27744, Chrome_ChildThread] WARNING: pipe error: 109: file z:/build/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 332 [Child 27744, Chrome_ChildThrea[Parent 29016, Gecko_IOThread] WARNING: pipe error: 109: file z:/build/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 332 [Child 27432, Chrome_ChildThread] WARNING: pipe error: 109: file z:/build/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, line 332 [Child 2[GPU

###!!! [Child][RunMessage] Error: Channel closing: too late to send/recv, messages will be lost

29

###!!! [Child][MessageChannel::SendAndWait] Error: Channel error: cannot send/recv

A versão do Selenium server standalone é a 3.141.59.

O erro que estou é ao executar a classe LanceSystemTest, o teste para na tela: Todos os Usuários, ele cadastra o nome e e-mail, mas dá erro, não clica no link 'exibir'.

Não consegui identificar o erro.

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