Chrome:获取活动标签控制台输出?

时间:2017-04-26 01:55:58

标签: javascript jquery google-chrome google-chrome-extension

我正在创建自定义Chrome扩展程序,该扩展程序会在将活动标签发送到辅助网站之前检索有关活动标签的数据。

我一直在尝试找到一种方法,用于检索活动选项卡的控制台输出。 chrome.tabs.getSelected一开始似乎很有希望,但是,它不提供控制台文本的输出。我一直在挖掘几个小时没有成功找到一种可以给我这个信息的方法。

有人能指出我正确的方向吗?

修改

作为跟踪我迄今为止尝试过的所有内容的一种方式,对于我自己和其他人,我将在下面添加信息。

我找到了一个可能对我有用的解决方案。下面的代码将扩展控制台方法日志,错误和警告。我正在研究一种方法,可能会将此代码附加到活动选项卡,因此我可以收集阵列中的控制台输出,然后在我的扩展上将这些输出发送到辅助网站。

随着我的进展,我会发布更多信息。

var logs = [],
    cLogs = [],
    cErrors = [],
    cWarns = [],
    _log = console.log,
    _error = console.error,
    _warn = console.warn;

console.log = function () {
    for (var i = 0; i < arguments.length; i++) {
        logs.push(arguments[i]);
        cLogs.push(arguments[i]);
    }

    _log.apply(this, arguments);
};

console.error = function () {
    for (var i = 0; i < arguments.length; i++) {
        logs.push(arguments[i]);
        cErrors.push(arguments[i]);
    }

    _error.apply(this, arguments);
};

console.warn = function () {
    for (var i = 0; i < arguments.length; i++) {
        logs.push(arguments[i]);
        cWarns.push(arguments[i]);
    }

    _warn.apply(this, arguments);
};

console.log('welcome');
console.error({'foobar': ['foo','bar']});
console.warn({'foo':'bar'});

_log(logs);

1 个答案:

答案 0 :(得分:1)

这个问题比看上去要困难得多。

chrome.tabs这样的API无权访问标签的控制台。事实上,没有&#34;标准&#34; API确实。

可以预期在页面上下文中运行的content script能够访问它。但是,无法从JavaScript上下文访问控制台的先前输出。

您在更新中引用的方法(创建console.*函数的包装器)只能捕获这些函数的未来调用,并且不会从JS运行时本身捕获错误(例如未处理的异常或网络错误)。因此,要从任意选项卡访问控制台,您需要在加载之前将此代码注入每个选项卡,即使您很少使用它。

内容脚本do not, in fact, run in the same context更加复杂。要覆盖页面本身的console,您需要inject the script in the page context

所以,总结一下:

  1. 您可以通过覆盖console.*函数来实现,但必须通过document_start上下文脚本将代码注入每个页面来完成。从页面上下文will be a challenge in itself中提取此数据。

    这会损害整体浏览器性能,并且无法捕获console.*来电未启动的控制台输出。

  2. 您可以使用大锤并使用chrome.debugger API。此API与开发工具本身具有相同的页面访问级别 - 因此,可以获得完整的控制台输出历史记录。

    缺点:你需要学习remote debugging protocol,它会产生一个非常可怕的许可警告(有充分的理由!),你的分机将无法在同一时间运行真正的开发工具是开放的。

  3. 总而言之,您尝试实现的目标是脆弱的解决方案。也许你需要重新思考你的方法。