2012-02-22 115 views
24

有没有什么方法可以调试在Javafx WebView中执行的javascript和html?类似于Firebug或Chrome的开发者控制台?JavaFX WebView中的HTML/Javascript调试

我有一个应用程序在Firefox和Chrome中呈现良好,但在WebView内无法正确呈现。它确实可以是任何数量的东西,但是没有一些调试工具,我不知道如何找出根本原因。

谢谢。

回答

31

以下是一些Java代码,可以在JavaFX WebView中使用Firebug Lite,而无需修改目标页面的HTML。

webView.getEngine().executeScript("if (!document.getElementById('FirebugLite')){E = document['createElement' + 'NS'] && document.documentElement.namespaceURI;E = E ? document['createElement' + 'NS'](E, 'script') : document['createElement']('script');E['setAttribute']('id', 'FirebugLite');E['setAttribute']('src', 'https://getfirebug.com/' + 'firebug-lite.js' + '#startOpened');E['setAttribute']('FirebugLite', '4');(document['getElementsByTagName']('head')[0] || document['getElementsByTagName']('body')[0]).appendChild(E);E = new Image;E['setAttribute']('src', 'https://getfirebug.com/' + '#startOpened');}"); 

您可以使用JavaFX Button或您希望的任何其他机制触发代码。

+4

您需要确保在启动Firebug之前等待文档加载。看到j​​ewelsea的答案在这里如何做到这一点:http://stackoverflow.com/a/18396900/633107 – Splaktar 2013-11-01 19:17:02

+0

console.log(“东西”)为你们工作? – ZiglioUK 2015-06-15 02:34:11

+0

@ZiglioNZ请将新问题作为新问题提出。 – jewelsea 2015-06-15 17:12:45

4

也许有点晚回答,但我认为这种方式很简单。

添加JavaScript监听器在Java

的Java:

webengine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() { 
      @Override 
      public void changed(ObservableValue<? extends State> observable, 
        State oldValue, State newValue) { 
        JSObject jsobj = (JSObject) webengine.executeScript("window");      
        jsobj.setMember("java", new JSListener()); 
      } 
     }); 

然后创建Java中的JS监听器类。

JSListener的java:

public class JSListener { 

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

在HTML文件中添加JavaScript

的Javascript:

var javaReady = function(callback){ 
    if(typeof callback =='function'){ 
     if(typeof java !='undefined'){ 
      callback(); 
     } else { 
      var javaTimeout = 0; 
      var readycall = setInterval(function(){ 
      javaTimeout++; 
       if(typeof java !='undefined' || javaTimeout > 1000){ 
        try{ 
         callback(); 
        } catch(s){}; 
        clearInterval(readycall); 
       } 
      },1); 
     } 
    } 
}; 

      var errorlistener = function(msg, url, line){ 
      javaReady(function(){ 
      java.log(msg +", url: "+url+ ", line:" + line); 
      }); 
     }; 

     //overide onerror 
     var onerror = errorlistener; 

如果你想从外部加载HTML,你不能改变它,你可以使用这样的代码。

var testsss = window.open("http://testError.com"); 
testsss.onerror = errorlistener; 

但是首先你需要添加setCreatePopupHandler在Java中,使它可以在这里看到:webview not opening the popup window in javafx

+0

对不起,我的英语 – Haryanto 2014-05-10 03:24:57

8

我调试了JavaFx的WebView铬DevTools和Safari Web检查。

我创建了最小的项目来帮助人们使用DevTools进行调试。 Get it on GitHub。你可以找到有:创建javaFXWebKitDebugger.jar

  1. 可运行javaFXWebKitDebugger.jar
  2. 源代码样本打开网页视图,使WebSocket的Servlet的。当您运行javaFXWebKitDebugger.jar时,打开Chrome浏览器并加载:dev tools url

+0

我真的很喜欢你在那里取得的成就,但看起来你正在使用一些弃用的API。 – mohamnag 2016-03-05 23:12:49

+1

请将这段代码放在github上,而不是Google Drive。也请在一些开源许可下发布它。 – Leonel 2016-03-21 12:02:37

+0

@ bosko-popovic你能解决这个代码的许可证的奥秘吗?我只是在GitHub上重新发布了你的代码以获得更好的使用,并且我得到了为它定义许可证的请求,但这实际上是你做出回应的决定。看看这里:https://github.com/mohamnag/javafx_webview_debugger/issues/1 – mohamnag 2016-04-11 11:50:46