8

我正在开发一个应用程序,需要在应用程序的 WebView/WebEngine 部分运行调试器,以便更好地调试我的应用程序。但是我在互联网上找到的注入 Firebug Lite 的代码由于某种原因无法正常工作。

如果我在 Firefox 控制台上运行 Javascript 代码本身就可以正常工作,但通过 JavaFX webview/webengine 执行相同的代码时就不行了。netbeans 控制台不会抛出任何其他错误......所以我不确定为什么 FirebugLite UI 没有呈现/加载。

什么可能导致这种情况,还有其他选择吗?

我正在使用 JavaFX 2.2

// 不起作用....

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');}"); 
4

3 回答 3

17

我能够解决这个问题。FirebugLite 的当前稳定版本似乎适用于传统浏览器,但有些不同使得它无法通过 JAVAFX WebView 查看应用程序。

我能够通过使用未压缩版本的 FirebugLite 将 Firebug 添加到我的应用程序中

<script type='text/javascript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>

解决方案来自:Testing IE6 with Firebug Lite

于 2013-06-30T16:34:09.657 回答
15

您在问题中提供的命令对我有用(大部分情况下)。

也许您不会等到 WebView 加载了文档后才尝试触发 Firebug。

例如,以下代码将为我启动 Firebug Lite(JavaFX 8b103,OS X 10.8)。

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import org.w3c.dom.Document;

public class WebViewWithDebugger extends Application {
  public static void main(String[] args) { launch(args); }
  @Override public void start(Stage primaryStage) {
    final WebView webView = new WebView();
    final WebEngine engine = webView.getEngine();
    engine.load("http://docs.oracle.com/javafx/2/get_started/animation.htm");
    engine.documentProperty().addListener(new ChangeListener<Document>() {
      @Override public void changed(ObservableValue<? extends Document> prop, Document oldDoc, Document newDoc) {
        enableFirebug(engine);
      }
    });
    primaryStage.setScene(new Scene(webView));
    primaryStage.show();
  }

  /**
   * Enables Firebug Lite for debugging a webEngine.
   * @param engine the webEngine for which debugging is to be enabled.
   */
  private static void enableFirebug(final WebEngine engine) {
    engine.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');}"); 
  }
}

调试

Firebug Lite 本身在调试网页方面似乎并不是特别好(至少在我的 WebView 下)。控制台、html、css 和 dom 面板以及检查选项似乎都很好。所以那里有一些有用的信息。脚本部分显示了脚本,但我没有看到在脚本中设置断点、监视等。

于 2013-08-23T07:07:30.230 回答
3

我使用 JavaFX Webview 发现快速调试 javascript 的最佳方法是执行以下操作:

webView.getEngine().setOnAlert(new EventHandler<WebEvent<String>>() {
    @Override 
    public void handle(WebEvent<String> event) {
        System.out.println(event.getData());
    }
});  

它通过你所有alert("whatever");的代码片段,这样你就可以看到发生了什么。

于 2013-08-22T19:55:25.317 回答