1
resposta

Falha no teste deveriaEfetuarLoginComDadosValidos utilizando geckodriver/marionete

Olá, boa tarde! Finalizei o curso utilizando o chromedriver, porém, ao usar o geckodriver/marionete não estou conseguindo avançar na aula de Page Object.

Para passar nos testes anteriores a esta aula, tive que usar Thread.sleep(3000), porém, nesta aula, ao criar a LoginPage, criei também o método "dormir", para declarar a Thread.sleep(3000) e deixar o código mais limpo. Estou recebendo erro no JUnit apenas no teste deveriaEfetuarLoginComDadosValidos, onde a informação prestada é de que era esperado "fulano" mas estava como "nulo".

Eu acredito que a exceção lançada no public String getNomeUsuarioLogado deve estar em conflito com a Thread.sleep(3000), pois a mesma lança uma throws InterruptedException nos testes em LoginTest. Aproveito a oportunidade para copiar os códigos.

public class LoginTest {

private LoginPage paginaDeLogin;

@BeforeEach
public void beforeEach() {
    this.paginaDeLogin = new LoginPage();
}

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

@Test
public void deveriaEfetuarLoginComDadosValidos() throws InterruptedException {
    paginaDeLogin.preencheFormularioDeLogin("fulano", "pass");
    paginaDeLogin.efetuaLogin();
    paginaDeLogin.dormir();

    Assert.assertFalse(paginaDeLogin.isPaginaDeLogin());
    Assert.assertEquals("fulano", paginaDeLogin.getNomeUsuarioLogado());
}

@Test
public void naoDeveriaLogarComDadosInvalidos() throws InterruptedException {
    paginaDeLogin.preencheFormularioDeLogin("invalido", "123");
    paginaDeLogin.efetuaLogin();
    paginaDeLogin.dormir();

    Assert.assertTrue(paginaDeLogin.isPaginaDeLoginComDadosInvalidos());
    Assert.assertNull(paginaDeLogin.getNomeUsuarioLogado());
    Assert.assertTrue(paginaDeLogin.contemTexto("Usuário e senha inválidos."));
}

@Test
public void naoDeveriaAcessarPaginaRestritaSemEstarLogado() throws InterruptedException {
    paginaDeLogin.navegaParaPaginaDeLances();
    paginaDeLogin.dormir();

    Assert.assertTrue(paginaDeLogin.isPaginaDeLogin());
    Assert.assertFalse(paginaDeLogin.contemTexto("Dados do Leilão"));
}

} xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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.exe");
    this.browser = new FirefoxDriver();
    this.browser.navigate().to(URL_LOGIN);
}

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

}

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

public void efetuaLogin() {
    browser.findElement(By.id("login-form")).submit();

}

public void dormir() throws InterruptedException  {
    Thread.sleep(3000);

}

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(URL_LOGIN + "?error");
}

}

Obrigado pela atenção.

1 resposta

Olá Diego, tudo bem?

Pelo que entendi, você está tendo problemas ao utilizar o geckodriver/marionete no lugar do chromedriver em um teste de Page Object. Você acredita que a exceção lançada no método getNomeUsuarioLogado pode estar em conflito com o Thread.sleep(3000), que você declarou no método dormir.

Uma sugestão que posso te dar é tentar utilizar o método WebDriverWait, que é uma classe do Selenium que espera por um determinado período de tempo até que uma condição seja atendida. Isso pode ajudar a evitar o conflito que você mencionou.

Por exemplo, você pode substituir o método dormir por algo assim:

public void esperaElementoEstarVisivel(By by) { WebDriverWait wait = new WebDriverWait(browser, 10); wait.until(ExpectedConditions.visibilityOfElementLocated(by)); }

E então, no método getNomeUsuarioLogado, você pode chamar o método esperaElementoEstarVisivel antes de tentar encontrar o elemento:

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

Espero que isso ajude! Se ainda tiver dúvidas, pode perguntar.

Espero ter ajudado e bons estudos!

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