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.