Headless Browser com HtmlUnitDriver

Olá, pessoal!

Hoje vou falar um pouco do HtmlUnitDriver e mostrar um exemplo simples de código.

O qué o HtmlUnitDriver?

HtmlUnitDriver é basicamente um browser sem uma interface grafica para Senenium Webdriver. É baseado em HtmlUnit, um navegador que é bem mais rápido e leve implementado em Java.

Vantanges do HtmlUnitDriver:

  • Torna a execução dos testes mais rápida. Já que não precisa carregar interface gráfica.
  • Suporta execução de JavaScript.
  • Como é baseado em HtmlUnit, não necessita de importação de arquivos, como é o caso do “phantomjs.exe”, por exemplo.

Algumas limitações do HtmlUnitDriver:

  • Mesmo usando o motor javascript Rhino do HtmlUnitDriver, pode ocorrer problemas para executar o comportamento do JavaScript em diversos browsers.
  • Por não possuir interface gráfica, torna-se difícil criar scripts de depuração durante a execução.

Segue código de exemplo:

Para demonstrar, fiz um script que acessa a página do https://mvnrepository.com/ e faz uma busca por Junit.

Inserindo as depedências no arquivo “pom.xml”

   <dependency>
        <groupId>net.sourceforge.htmlunit</groupId>
        <artifactId>htmlunit</artifactId>
        <version>2.27</version>
    </dependency>

   <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>htmlunit-driver</artifactId>
        <version>2.27</version>
    </dependency>

Classe que tem a função de capturar os elementos, gosto de chamar de “Map”:

public class PesquisaJunitMap {

@FindBy(xpath ="//*[@id=\"query\"]")
protected WebElement campoPesquisa;

@FindBy(xpath = "//*[@id=\"search\"]/form/input[2]")
protected WebElement botaoPesquisa;

@FindBy(xpath = "//*[@id=\"maincontent\"]/div[2]/div[1]/h2/a[1]")
protected WebElement clicarNoLinkJunit;

 }

Classe que herda a classe Map e interage com os elementos:

public class PesquisaJunitPage extends PesquisaJunitMap {

WebDriver driver;

public PesquisaJunitPage(WebDriver driver){
    this.driver = driver;
}
public void buscar_junit() throws InterruptedException {

    campoPesquisa.sendKeys("Junit");
    botaoPesquisa.submit();
    clicarNoLinkJunit.click();
    System.out.println(driver.getTitle()); //mostrar a pagina acessada


}

}

Classe que executa o teste:

public class RunTest {

WebDriver driver;

@Before
public void Up(){


    driver = new HtmlUnitDriver(); // instancia o htmlunildriver

    driver.get("https://mvnrepository.com/");
    System.out.println(driver.getTitle()); //mostrar no log a pagina acessada

}
@Test
public void teste_pesquisar() throws InterruptedException {

    PesquisaJunitPage page = PageFactory.initElements(driver, PesquisaJunitPage.class);
    page.buscar_junit();

}
@After
public void close(){
    driver.quit();
}

}

Resultado da execução:

Maven Repository: Search/Browse/Explore
Maven Repository: junit » junit

Process finished with exit code 0

Agora o Chrome oferece o modo headless browser, entao o HtmlUnitDriver ainda é necessario? Existe uma comparação entre os dois?

@rafa Além do Chrome no modo headless, Xvfb continua sendo uma opção bem mais confiável e rápida. HTMLUnit já era pouco usado mesmo quando tínhamos o PhantomJS a pleno vapor, hoje em dia não vejo nenhuma vantagem em utilizá-lo.

Log in to reply

Looks like your connection to Agile Testers was lost, please wait while we try to reconnect.