如何使用Firebug扩展调试Greasemonkey脚本?

时间:2010-08-16 01:32:13

标签: debugging firebug greasemonkey

我没有找到使用Firebug扩展程序调试Greasemonkey脚本的方法。

有谁知道怎么做?

感谢。

10 个答案:

答案 0 :(得分:24)

更新: Mene + Shuman修复现在被Firefox 30和Firebug 2破坏。火狐31 可能提供解决方法(将调查)。在此期间,请使用下面列出的“常规解决方法策略”。


更新:此答案现已过时。

如果您打开about:config
extensions.firebug.filterSystemURLs设为false
然后你可以使用Firebug来调试Greasemonkey脚本,就像任何其他脚本一样。

无论@grant模式如何,这都有效。

请参阅Mene's answer -- with an assist from Shuman



旧回答:

因为Greasemonkey在沙箱中运行,所以Firebug无法看到它。没有简单的方法。

一般解决方案策略:

  1. 首先在Firebug的JavaScript控制台中测试不使用GM_函数的GM脚本的所有部分。最大限度地减少GM_功能的使用,根本不使用GM_log()

  2. 所有Firebug's console functions在GM脚本中运作良好。

答案 1 :(得分:8)

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。

答案 2 :(得分:8)

目前的Firefox和Firebug现在可以调试当前的Greasemonkey脚本,就像其他任何javascript一样。只需在下拉菜单中找到您的*.user.js脚本即可。控制台也可以工作。

这至少适用于Firefox 28.0和Firebug 1.12.7;我没有尝试过早期的版本。

Screenshot of limited-case debugging

注意:为了使其正常工作,您可能必须将extensions.firebug.filterSystemURLs设置为false。请参阅"Profiling Greasemonkey scripts" in the Firebug, bug tracker.(感谢Shuman

答案 3 :(得分:4)

这里没有其他解决方案适用于我,但是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/docs/Debugging_JavaScript

然后只需搜索用户名称并开始调试。

答案 4 :(得分:4)

可以使用之前提到的原生Firefox调试器来完成。以下是现代版Firefox的说明。

about:config中设置以下首选项:

 devtools.chrome.enabled: true
 devtools.debugger.remote-enabled: true
 devtools.debugger.prompt-connection: false

打开全局脚本调试器窗口: Open Menu - > Developer - > Browser Toolbox - > Debugger(或 Ctrl + Shift + Alt + I )。

搜索您的用户名称并启动debugging

答案 5 :(得分:3)

Chromebug可以看到沙盒脚本http://getfirebug.com/wiki/index.php/Chromebug_User_Guide,但我没有在Greasemonkey上试过它。

答案 6 :(得分:2)

- 这个答案已经过时,请使用上面的@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()
});

答案 7 :(得分:1)

我已经尝试过ChromeBug,它似乎无法正常工作。

使用FireBug我通过在GM代码中添加“调试器”来获得成功的起点。这会导致断点,我可以检查堆栈上的变量,但是没有显示正确的文件,所以我不能步骤或任何东西。

我使用FirebugMonkey获得了最大的成功(https:// addons.mozilla.org/en-US/firefox/addon/13623/),我刚刚做了基本工作 调试GreaseMonkey脚本得益于一些解释 f0rsvinn最近对扩展页面的评论。以下是我刚刚在http://groups.google.com/group/greasemonkey-users/browse_thread/thread/994cfa58c79d222发布的说明:

我从未想过它的工作方式是创造自己的方式 脚本周围的沙箱,而不是使用Greasemonkey,你 实际上必须关闭GM。有一些转基因方面的事情 虽然因为脚本真的不在GreaseMonkey中,所以不会起作用。 例如,GM_getValue返回undefined。

尽管如此,它仍适用于基本调试 - 并且总比没有好。

使用步骤如下:

  1. 安装FireBug 1.5.4(以后的版本似乎不起作用)
  2. 安装FireBugMonkey
  3. 使用FireBugMonkey中的脚本管理器选择要调试的文件
  4. 禁用GreaseMonkey(脚本将在FireBugMonkey中运行,而不是
  5. 的GreaseMonkey)
  6. 启用FireBugMonkey
  7. 在FireBug中启用脚本
  8. 您在ScriptManager中添加的脚本应该在 FireBug脚本列表。

答案 8 :(得分:1)

与@ 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 ...
}

当然,您不会在特权环境中运行。但是这样你可以像任何其他脚本一样轻松地连续调试脚本。

答案 9 :(得分:0)

正如其他人所说的那样,您可以设置一个简单的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);
});