2
respostas

Erro na execução do Código

Ao executar o teste, está retornando o seguinte erro:

java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:373)
    at java.base/java.util.ArrayList.get(ArrayList.java:425)
    at br.com.caelum.teste.LeiloesPage.detalhes(LeiloesPage.java:38)
    at br.com.caelum.teste.LanceSystemTest.deveFazerUmLance(LanceSystemTest.java:47)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
    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.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
    at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
    at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
    at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
    at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:43)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
    at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:82)
    at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:73)
    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:41)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:542)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
2 respostas

Segue as classes criadas:

package br.com.caelum.teste;

import static org.junit.Assert.assertTrue; public class LanceSystemTest {
//private FirefoxDriver driver;
private WebDriver driver;
private LeiloesPage leiloes;
//private DetalhesDoLeilaoPage lances;
//private CriadorDeCenarios criadorDeCenarios;

@Before
public void inicializa() {
    System.setProperty("webdriver.gecko.driver","E:\\Curso\\Selenium\\geckodriver.exe");
    driver = new FirefoxDriver();
    leiloes = new LeiloesPage(driver);
    driver.get("http://localhost:8080/apenas-teste/limpa");

    //cenario padrao
    UsuariosPage usuarios = new UsuariosPage(driver);
    usuarios.visita();
    usuarios.novo().cadastra("Paulo Henrique", "paulo@henrique.com");
    usuarios.visita();
    usuarios.novo().cadastra("José Alberto", "jose@alberto.com");

    leiloes = new LeiloesPage(driver);
    leiloes.visita();
    leiloes.novo().preenche("Geladeira", 100, "Paulo Henrique", false);

}

@Test
public void deveFazerUmLance() {

    DetalhesDoLeilaoPage lances = leiloes.detalhes(1);

    lances.lance("José Alberto", 150);

    assertTrue(lances.existeLance("José Alberto", 150));

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

Quando roda o teste, ele as vezes cria os dois usuários e as vezes não, meio que exclui o primeiro criado, mas as vezes ele roda certo, chegando até a parte onde deveria clicar no "exibir", porém não sai dessa página, ele não executa a ação do "click".

Oi Luciano, senti falta do Explicit Wait, usando a classe WebDriverWait como mostrado na aula, isso pode fazer seu teste dar falsos positivos ou falsos negativos por que o não houve espera pela finalização do ajax.