【问题标题】:JavaFX and Firebug Lite in web page inspector mode网页检查器模式下的 JavaFX 和 Firebug Lite
【发布时间】:2015-04-10 20:15:28
【问题描述】:

我使用WebView 创建了一个带有JavaFX 的简单浏览器。我还添加了 Firebug Lite 来检查网站。为了启用 Firebug Lite,我使用了 WebEngine 和方法 executeScript()

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

如何截取JavaFX中Firebug Lite的inspector函数的返回值(我想是一个字符串)?

【问题讨论】:

  • 您显然是在谈论 Firebug Lite。请注意,Firebug Lite 和 Firebug 是两种不同的工具。

标签: javascript javafx firebug-lite


【解决方案1】:

只要把它放在一个变量中:

Object result = 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');}"
);

返回值的实际类型取决于Javascript的执行结果,你可以向下转换为合适的类型。例如,如果你知道它是String,你可以这样做

String result = (String) engine.executeScript(...);

documentation 明确列出了不同的 Javascript 类型如何映射到返回的 Java 类型。

【讨论】:

  • 感谢 James_D,我已经尝试使用字符串提取方法返回。特别是,之前的脚本在字符串变量中返回未定义。但该脚本仅用于启动 firebug。它应该运行另一个脚本?直接运行检查员动作的脚本......你能帮帮我吗?谢谢
  • 不确定我是否了解足够多的 Javascript/firebug 以提供更多帮助
  • 您的问题似乎还没有得到回答,所以您应该撤消对这个答案的接受。
【解决方案2】:

我对 JavaFX 没有任何经验,但我知道 Firebug Lite 不会公开您使用它检查的元素,也不会触发任何与此相关的事件。因此,您无法直接访问该信息。请参阅related source code

Firebug Lite 的基本作用是创建一个<div> 作为荧光笔的覆盖层,并为mousemovemousedown 设置两个事件处理程序以处理鼠标点击,您也可以收听您的目的。

要通过 JavaScript 通过 Firebug Lite 检查元素,您可以使用以下代码:

document.addEventListener("mousedown", function(e) {
  if (e.target.id === "fbInspectFrame") {
    var inspectedElement = Firebug.browser.getElementFromPoint(e.clientX, e.clientY);

    // Here goes the code, which processes the inspected element
  }
});

说明:

要获得被检查的元素,你必须监听mousedown 事件。但该操作应该只在检查器启用时发生,当检查的元素实际上是覆盖 <div> 称为 'fbInspectFrame' Firebug Lite 在检查时注入时才会发生。

为了获取实际检查的元素(注意它是一个对象,而不是一个字符串),Firebug Lite 提供了一个名为 Firebug.browser.getElementFromPoint() 的函数,它使用事件中的鼠标坐标调用。

然后您的 JavaFX 代码需要访问此 JavaScript 元素。

【讨论】:

  • 非常感谢塞巴斯蒂安。我想要创建的是一种自动化的检查器:一个网页元素的分析器,但是是前端。在打开网页(JavaFX 中的简单浏览器)时,通过启动检查器(Firebug Lite 检查器已启用并处于活动状态)并获取各种元素,鼠标在页面上以点 (x;y) 网格移动构成页面。
  • 我需要澄清以下几点: - 对于我创建的网格的每个点 (x, y),我必须运行您向我展示的脚本? - 如果我使用mousedown,意味着我正在单击点(x,y),我会用鼠标将脚本运行到该点的简单段落,我该如何更改它? - 返回是指定位置的元素(x,y):当鼠标在TextNode元素上时,返回的对象是TextNode的父元素。对吗?
  • 塞巴斯蒂安,你能帮我解决我写的东西吗?
  • 页面加载后只需要执行一次脚本。然后,每当您通过 Firebug Lite UI 检查元素时,都会调用侦听器。主要问题是,您是使用 Firebug Lite UI 来检查元素还是想以编程方式触发事件?您的问题背后的实际用例是什么?
  • 我要做的就是你问我的两件事。我想以编程方式控制萤火虫检查器。 1)取网页的坐标(X,Y)。 2)在坐标(X,Y)处运行检查器脚本并获取返回项。 3)重复循环,改变坐标;当我找到网页的所有可见对象时结束。有可能吗?
猜你喜欢
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 2014-12-13
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多