2017-04-26 74 views
1

我正在创建一个自定义的Chrome扩展程序,它将在将其发送到辅助网站之前检索有关活动选项卡的数据。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); 
+0

覆盖控制台功能。 –

+0

@DanielHerr谢谢Daniel!发布后很快就会发现,这似乎是正确的路要走。我必须找到一种方法将它附加到活动标签上,所以还有一点点要去。 – adamj

+0

如果你得到它的工作,我可以建议你发布解决方案作为答案,而不是作为编辑?这样,人们可以看到这个问题有一个答案。他们甚至可能会让你高兴。 –

回答

1

这个问题比看起来要困难得多。

API,如chrome.tabs有一个选项卡的控制台的访问权限。事实上,没有“标准”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,它会产生一个非常可怕的权限警告(出于一个很好的理由!),你的扩展将无法与真正的开发工具打开时同时运行。

总而言之,你试图实现的是一个艰巨的任务与脆弱的解决方案。也许你需要重新思考你的方法。

+0

基本上,正如你所提到的,我已经计划在其他任何开始加载之前注入一个包含上述代码的脚本。表现并不是我所关心的。虽然,我还在尝试一些事情,所以我不确定这是否是最好的方法。我昨天晚上也查看了'chrome.debugger'的文档,但我认为这不是一个好的选择。我很感谢你的回答,并且将会探索更多的东西。不过,我见过扩展/网站提取控制台历史记录,所以我知道这可以完成。 – adamj