Con los objetos WebEngine de JavaFX, es posible interactuar con una página web y extraer sus datos. Pero si son actualizados con mucha frecuencia, recargar la página para obtener el código HTML actualizado o revisar cada nodo para saber cuál ha cambiado, es ineficiente. Por ello, y debido a que las peticiones y respuestas HTTP suelen ser hechas con JQuery, probé a ver las respuestas del servidor añadiendo en la consola del navegador el código javascript:
Y tras comprobar que funciona en el navegador, quise incluirlo en Java escribiendo el código siguiente:
Lo curioso es que unas veces es abierta una ventana y se queda en blanco, otras aparece el código HTML inicial y se queda así, y otras presenta el código y lo cambia por la primera respuesta del servidor, y se queda así también. Necesito
Lo que necesito saber es porqué no me funciona como en el navegador, captando sólo la respuesta primera en el mejor de los casos, y cómo corregirlo, pues no sé cómo resolverlo.
Código [Seleccionar]
$(document).ajaxSuccess(function(event, xhr, settings){ alert(xhr.responseText); });
Y tras comprobar que funciona en el navegador, quise incluirlo en Java escribiendo el código siguiente:
Código [Seleccionar]
import javafx.application.Application;
import javafx.beans.value.*;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.web.WebEngine;
import javafx.stage.Stage;
//import javafx.concurrent.Worker.State;
import org.w3c.dom.Document;
import netscape.javascript.JSObject;
@SuppressWarnings("restriction")
public class Captura extends Application{
public static void main(String[] args) { launch(args); }
@Override
public void start(Stage escenario){
final TextArea área_texto = new TextArea();
área_texto.setEditable(false);
// 'ingenio' será el objeto que conecta con "webkit" para operar con HTML, javascript y CSS.
final WebEngine ingenio = new WebEngine();
// 'ventana' es el objeto que permite conectar javascript con Java.
final JSObject ventana = (JSObject)ingenio.executeScript("window");
// Esto establece el vínculo entre "jHelper" en javascript y "JavaHelper" en Java.
ventana.setMember("jHelper", new JavaHelper(área_texto));
// Esta estructura supuestamente es para ser ejecutada al cargar la página web, pero
// no entiendo bien esta parte.
ingenio.documentProperty().addListener(new ChangeListener<Document>(){
@Override
public void changed(ObservableValue<? extends Document> observable, Document oldDoc, Document newDoc){
// Esto pondrá en la ventana el código inicial HTML.
área_texto.setText((String)ingenio.executeScript("document.documentElement.innerHTML"));
// Esto es para comprobar si al ejecutar el código, realmente es alcanzada esta parte,
// algo que muchas veces no ocurre.
System.out.println("Llegué.");
// Esto capturará el tráfico HTTP con javascript.
ingenio.executeScript("$(document).ajaxSuccess(function(event, xhr, settings){ jHelper.respuesta(xhr.responseText); });");
}
});
ingenio.load("http://www.sportium.es");
escenario.setScene(new Scene(área_texto, 800, 600));
escenario.show();
}
// Esta clase servirá para llamar a Java desde javascript.
public static class JavaHelper{
// 'área_texto' será el objeto donde será mostrado el código HTML inicial, y las
// respuestas capturadas.
final TextArea área_texto;
// 'cont' indicará el número de respuestas que han sido capturadas y mostradas.
private int cont = 0;
public JavaHelper(TextArea área_texto){
this.área_texto = área_texto;
}
// 'texto' contendrá el mensaje de respuesta del servidor.
public void respuesta(String texto){
++cont;
área_texto.setText("\n"+cont+":\n"+texto);
}
}
}
Lo curioso es que unas veces es abierta una ventana y se queda en blanco, otras aparece el código HTML inicial y se queda así, y otras presenta el código y lo cambia por la primera respuesta del servidor, y se queda así también. Necesito
Lo que necesito saber es porqué no me funciona como en el navegador, captando sólo la respuesta primera en el mejor de los casos, y cómo corregirlo, pues no sé cómo resolverlo.