【发布时间】:2011-03-30 05:42:04
【问题描述】:
我没有找到使用 Firebug 扩展调试 Greasemonkey 脚本的方法。
有人知道怎么做吗?
谢谢。
【问题讨论】:
标签: debugging firebug greasemonkey
我没有找到使用 Firebug 扩展调试 Greasemonkey 脚本的方法。
有人知道怎么做吗?
谢谢。
【问题讨论】:
标签: debugging firebug greasemonkey
更新者:Mene+Shuman 修复程序现在已在 Firefox 30 和 Firebug 2 中被破坏。Firefox 31可能提供解决方法(将调查)。同时,请使用下面列出的“通用解决方法”。
更新:此答案现已过时。
如果您打开about:config 并且
将extensions.firebug.filterSystemURLs 设置为false
那么你就可以像调试其他脚本一样使用 Firebug 来调试 Greasemonkey 脚本了。
无论@grant 模式如何,这都有效。
见Mene's answer -- with an assist from Shuman。
旧答案:
因为 Greasemonkey 在沙盒中运行,Firebug 看不到它。解决这个问题没有简单的方法。
一般变通策略:
首先在 Firebug 的 JavaScript 控制台中测试 GM 脚本中不使用 GM_ 函数的所有部分。尽量减少使用GM_ 函数,完全不要使用GM_log()。
所有Firebug's console functions 在 GM 脚本中都能很好地工作。
【讨论】:
注意: ChromeBug 不再存在。 Firefox 的Developer Edition 是另一种选择。
Chromebug 可以看到沙盒脚本,http://getfirebug.com/wiki/index.php/Chromebug_User_Guide,但我没有在 Greasemonkey 上尝试过。
【讨论】:
注意:此答案指的是旧版本的 Firefox。 Firebug 不再可用,但仍存在于 Firefox 的 Developer Edition 中。
我试过 ChromeBug,它似乎不起作用。
使用 FireBug,我通过在我的 GM 代码中添加“调试器”获得了成功的起点。这会导致一个断点,我可以检查堆栈上的变量,但是没有显示正确的文件,所以我无法执行任何操作。
我在 FirebugMonkey (https:// addons.mozilla.org/en-US/firefox/addon/13623/),我刚刚开始做基本的 由于 a 中的一些解释,GreaseMonkey 脚本的调试 f0rsvinn 最近对扩展页面的评论。以下是我刚刚在http://groups.google.com/group/greasemonkey-users/browse_thread/thread/994cfa58c79d222 发布的说明:
我从来没有想过它的工作方式是创建自己的 围绕脚本而不是使用 Greasemonkey 的沙箱,你 实际上必须关闭GM。有一些通用汽车方面的东西 但不会工作,因为脚本真的不在 GreaseMonkey 中。 例如,GM_getValue 返回 undefined。
不过,它仍然适用于基本调试 - 总比没有好。
使用步骤如下:
您在 ScriptManager 中添加的脚本应该在 FireBug 脚本列表。
【讨论】:
var e = document.createElement("script");
e.src = 'http://www.xxxxxxxx.com/yyyyyyyy.js';
e.type="text/javascript";
document.getElementsByTagName("head")[0].appendChild(e);
你可以把它添加到你的 xxx.user.js 中,然后安装到greasemonkey中。
然后,你就可以随意调试你的js了。
【讨论】:
类似于@bigml 的建议,如果您设置本地网络服务器 (apache) 来提供用户脚本文件,则可以非特权运行它,然后在您的用户脚本中添加以下内容:
if (typeof GM_addStyle == "undefined") {
loadScript("http://localhost/path/to/script.user.js");
}
else {
runScript();
}
function loadScript(url) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
document.getElementsByTagName('head')[0].appendChild(res);
}
function runScript() {
// ... whatever your userscript does ...
}
当然,您不会在特权上下文中运行。但是通过这种方式,您可以像任何其他脚本一样轻松地连续调试脚本。
【讨论】:
-- 此答案已过时,请使用上面的@Brock Adams 解决方案--
在外部加载您的主脚本,而不是通过 GM 运行它。所以你只是在使用 GM 来注入脚本。
这有点混合了@bigml 和@Yuval 的解决方案,它使用jquery。它也适用于框架。
// ==UserScript==
// @name My GM script
// @include The website I want this to run on
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// ==/UserScript==
$(document).ready(function() {
// fetch jquery dependent scripts using $.getScript()
});
【讨论】:
注意:此答案指的是旧版本的 Firefox。 Firebug 不再可用,但仍存在于 Firefox 的 Developer Edition 中。
当前的 Firefox 和 Firebug 现在可以像调试任何其他 javascript 一样调试当前的 Greasemonkey 脚本。只需在下拉菜单中找到您的 *.user.js 脚本即可。控制台也可以工作。
这至少适用于 Firefox 28.0 和 Firebug 1.12.7;我没有尝试过早期版本。
注意:为了让它工作,您可能必须将 extensions.firebug.filterSystemURLs 设置为 false。见"Profiling Greasemonkey scripts" in the Firebug, bug tracker.(感谢Shuman)
【讨论】:
@grant none 模式和/或使用事件侦听器的脚本上。如果您有适用于实际调试的配方,请发布详细信息。
about:config 中将extensions.firebug.filterSystemURLs 设置为false 使其工作,参见this
正如其他人所说,您可以设置一个简单的 HTTP 服务器并使用 Greasemonkey 将其提供给您的页面,如下所示:
function loadScript(url) {
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
document.getElementsByTagName('head')[0].appendChild(script);
}
WEBrick 和 Python -m SimpleHTTPServer 对此很有用。我们还可以通过向 GreaseMonkey 中的文档添加自定义事件处理程序来向脚本公开 GM_... 函数:
function gMHandler(e){
GM_log(e.detail.message);
e.detail.response = "Hi!"
}
document.addEventListener("gM", gMHandler, false);
然后在服务脚本中,在任意 DOM 元素上引发此事件将运行处理程序并修改元素的响应参数:
$(document).ready(function() {
var event = new CustomEvent(
"gM",
{
detail: { message: "Hello World!" }
bubbles: true,
cancelable: true,
}
);
document.getElementById("AnyElement").dispatchEvent(event);
alert("Response was: " + event.detail.response);
});
【讨论】:
这里没有其他解决方案对我有用,但 Jan Odvarko 的 answer 关于如何调试 Firefox 扩展也非常适用于 GreaseMonkey 脚本:
在 Firefox 19 或更高版本上,可以使用内置的 JS 调试器 在浏览器本身。进入 about:config 并设置以下两项 首选项:
devtools.chrome.enabled: true devtools.debugger.remote-enabled: true重启浏览器后,即可访问浏览器调试器 通过工具 > Web 开发人员 > 浏览器工具箱。
(注意必须接受传入的连接)
查看更多信息: https://developer.mozilla.org/en-US/docs/Mozilla/Debugging/Debugging_JavaScript#JavaScript_Debugger
然后只需搜索您的用户脚本的名称并开始调试。
【讨论】:
如前所述,可以使用本机 Firefox 调试器来完成。以下是现代版 Firefox 的使用说明。
在about:config中设置以下首选项:
devtools.chrome.enabled: true
devtools.debugger.remote-enabled: true
devtools.debugger.prompt-connection: false
通过以下方式打开全局脚本调试器窗口 工具 → Web Developer → 浏览器工具箱 → 调试器(或Ctrl+Shift+Alt+I) .
搜索您的用户脚本的名称并开始 debugging。
【讨论】: