Capturar las respuestas del servidor con un objeto WebEngine

Iniciado por Octsam, 11 Junio 2017, 17:58 PM

0 Miembros y 1 Visitante están viendo este tema.

Octsam

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:


$(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:


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.