JavaFX 8 WebEngine: Comment obtenir la console.log() de javascript pour le Système.dans java?

J'utilise JavaFX et le moteur javascript du WebEngine JavaFX pour développer une application. J'aimerais obtenir des commentaires de javascript pour le débogage. Qu'arrive-t-il à la sortie de la console à l'intérieur du WebEngine? Y a-t-il un moyen d'y accéder, ou de rediriger vers le système?dans java?

11
demandé sur Artjom B. 2015-02-24 06:26:05

3 réponses

le code suivant redirige console.log() vers JavaBridge.log() :

import netscape.javascript.JSObject;

public class JavaBridge
{
    public void log(String text)
    {
        System.out.println(text);
    }
}

[...]

webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) ->
{
    JSObject window = (JSObject) webEngine.executeScript("window");
    JavaBridge bridge = new JavaBridge();
    window.setMember("java", bridge);
    webEngine.executeScript("console.log = function(message)\n" +
        "{\n" +
        "    java.log(message);\n" +
        "};");
});
18
répondu Gili 2015-08-31 17:19:14

j'aime aller dans l'autre direction. Nous utilisons log4j, donc j'ai créé un emballage javascript comme suit:

module.exports = {

    levels:[ "ALL", "TRACE", "DEBUG", "INFO", "WARN", "ERROR", "OFF"],

    level:"INFO",

    error:function(msg){
      if(this.isErrorEnabled()){
        console.error(msg)
      }
    },
    warn:function(msg){
      if(this.isWarnEnabled()){
        console.warn(msg)
      }
    },
    info:function(msg){
      if(this.isInfoEnabled()){
        console.log("INFO: "+msg)
      }
    },
    debug:function(msg){
      if(this.isDebugEnabled()){
        console.log("DEBUG: "+msg)
      }
    },
    trace:function(msg){
      if(this.isTraceEnabled()){
        console.log("TRACE: "+msg)
      }
    },

    isErrorEnabled:function(){
      return this.isEnabled("ERROR");
    },
    isWarnEnabled:function(){
      return this.isEnabled("WARN");
    },
    isInfoEnabled:function(){
      return this.isEnabled("INFO");
    },
    isDebugEnabled:function(){
      return this.isEnabled("DEBUG");
    },
    isTraceEnabled:function(){
      return this.isEnabled("TRACE");
    },
    isEnabled:function(statementLevel){
      return this.levels.indexOf(this.level)<=this.levels.indexOf(statementLevel);
    }
  }

puis au début du javascript je vérifie si le log est présent et je le règle:

if(window.log == undefined){
  window.log = require("./utils/log4j-wrapper")
  window.log.level = "INFO"
}

et de cette façon si vous mettez le logger Log4j directement sur le moteur avant même de charger l'url comme:

WebEngine webEngine = webView.getEngine()
JSObject win = (JSObject) webEngine.executeScript("window")
win.setMember("log", log)  //log being the java log4j logger

de cette façon je peux me connecter si j'ouvre directement dans un navigateur ou il est exécuté à partir d'un WebView dans un programme JavaFX. Et a l'avantage supplémentaire d'avoir des niveaux pour la journalisation dans javascript qui correspondent à vos paquets du contrôleur WebView. Juste une alternative pour les vues javascript plus grandes.

4
répondu Green Man 2015-12-07 17:56:21

vous pouvez juste ajouter un écouteur de message aussi voir ce qui se passe dans votre sortie. Vous n'avez pas à injecter js bridge avec redéfinition de fonctions comme console.log pour chaque page chargée

WebConsoleListener.setDefaultListener((webView, message, lineNumber, sourceId) -> {
    System.out.println(message + "[at " + lineNumber + "]");
});
2
répondu dzikoysk 2018-03-02 21:13:17