Ejemplos basicos de HTMLUnit

De ChuWiki
Saltar a: navegación, buscar

HTMLUnit nos permite cargar una página web y analizar o modificar fácilmente su contenido. Veamos algunos ejemplos, que tienes disponibles en ejemplos HtmlUnit

Extraer los enlaces de una página HTML

El siguiente código extrae los enlaces <a herf=".."> de una página web HTML.

package com.chuidiang.ejemplos.html_unit;

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

/**
 * Ejemplo de extracion de los enlaces de una pagina usando HTMLUnit.
 * Necesitas las librerías de HTMLUnit
 *  
 * @author Chuidiang
 *
 */
public class ExtractingLinksWithHtmlUnit {

   public static void main(String[] args) throws Exception {
      WebClient webClient = new WebClient();
      HtmlPage page = webClient.getPage("http://www.gnu.org/home.es.html");
      
      DomNodeList<DomElement> nodeList = page.getElementsByTagName("a");
      for (DomElement element : nodeList){
         System.out.println(element.getTextContent()+ " -> " +element.getAttribute("href"));
      }

   }

}

Una pequeña explicación del código:

Instanciamos WebClient y llamando a su método getPage() cargamos la página web que nos interese.

page tiene un método getElementsByTagName() que nos devuelve todos los elementos HTML en la página que sean de un determinado tipo, en nuestro caso, hemos elegido los <a>. El método devuelve una colección DomNodeList<DomElement>, que sólo tendremos que ir recorriendo en un bucle.

Para cada DomElement, obtenemos el texto del enlace con el método getTextContent() y obtenemos la referencia obteniendo el atributo href de dicho elemento. Escribimos en pantalla ambas cosas.

Como se ve, mucho más fácil que extraer enlaces con java estándar, sin librerías.

Javascript con HTMLUnit

Cuando cargamos una página web con Java y HTMLUnit, también se ejecuta su código Javascript, por lo que podemos obtener la página tal cual queda después de que el código Javascript la haya modificado. Podemos, a su vez, desde Java hacer que se ejecute código Javascript en esa página. Veamos un ejemplo sencillo de todo esto.

Por supuesto, necesitas descargar HTMLUnit y poner todas sus librerías en tu proyecto.


La página HTML

Hagamos una página HTML sencilla con un poco de Javascript, como esta

<!DOCTYPE html>
<html>
   <head>
      <meta charset="ISO-8859-1">
      <title>Prueba Javascript con Html Unit</title>
   </head>
   <body>
      <div id="unDiv"></div>
   </body>
</html>
<script>
   var cambia = function(texto) {
      document.getElementById("unDiv").innerHTML = texto;
   }

   cambia("hola");
</script>

Hay un div vacío con id="unDiv". Con el código Javascript al final de la página le ponemos de contenido "hola".

El código Java

El código Java que carga esta página con HTMLUnit, comprueba que efectivamente se ha rellenado el div con "hola" y que luego hace algunos cambios llamando a funciones de Javascript es el siguiente

package com.chuidiang.ejemplos.html_unit;

import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

/**
 * Ejemplo tonto con HTML Unit para ver cómo se ejecuta el código javascript de la página
 * y cómo puede ejecutarse a posteriori más código javascript sobre la página.
 * 
 * Necesitas todas las librerías que vienen con HTMLUnit.
 * 
 * @author Chuidiang
 */
public class JavascriptWithHtmlUnit {

   public static void main(String[] args) throws Exception {
      WebClient webClient = new WebClient();
      HtmlPage page = webClient.getPage("file:files/JavascriptWithHtmlUnit.html");
      
      // Sale "hola", puesto que se ha ejecutado el codigo javascript de la pagina
      System.out.println(page.getElementById("unDiv").getTextContent());
      
      // Cambiamos el contenido usando funciones estándar de javascript en navegador
      page.executeJavaScript("document.getElementById(\"unDiv\").innerHTML=\"que tal?\"");
      System.out.println(page.getElementById("unDiv").getTextContent());
      
      // Cambiamos el contenido con una funcion javascript definida en la pagina.
      page.executeJavaScript("cambia(\"adios\")");
      System.out.println(page.getElementById("unDiv").getTextContent());
   }
}

Procedemos a explicarlo, aunque es bastante evidente.

Primero se instancia la clase WebClient. Llamamos a su método getPage() para cargar nuestra página HTML (en el ejemplo la hemos ubicado con un nombre y path concreto, tendrás que cambiarlo a tu página HTML).

Con page.getElementById() podemos obtener uno de los elementos HTML de la página, en concreto "unDiv" y con getTextContent() de ese elemento obtenemos su contenido de texto. Se puede comprobar que el contenido es "hola", que es el que ha puesto el código javascript.

Con la función page.executeJavaScript() podemos ejecutar un código javascript arbitrario en la página. Como WebClient proporciona a Javascript un entorno similar al de un navegador, tenemos cosas como document y podemos hacer la llamada document.getElementById() para modificar el contenido del div. Después de esto, el contenido del div será "que tal?", como mostrará el System.out.println() que hay a continuación.

Finalmente, podemos también llamar a funciones javascript que se han declarado en la pagina HTML. En el ejemplo, llamamos a la función cambia() para cambiar nuevamente el contenido del div "unDiv". El System.out.println() posterior nos mostrará que el contenido ha cambiado a "adios".

Enlaces