谷歌chrome extension :: console.log()来自后台页面?

时间:2010-09-30 08:59:17

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

如果我从弹出页面或其他任何脚本中调用console.log('something');,它可以正常工作。

然而,由于后台页面没有直接从弹出页面运行,因此它不包含在控制台中。

有没有办法在后台页面中显示console.log()以显示在弹出页面的控制台中?

有没有办法,从后台页面调用弹出页面中的一个函数?

13 个答案:

答案 0 :(得分:175)

如果您点击扩展程序列表中的“background.html”链接,则可以打开背景页面的控制台。

要访问与您的扩展程序对应的后台页面,请打开Settings / Extensions或打开新标签页并输入chrome://extensions。你会看到这样的截图。

Chrome extensions dialogue

在您的扩展程序下,点击链接background page。这将打开一个新窗口。 对于 context menu sample ,该窗口的标题为:_generated_background_page.html

答案 1 :(得分:130)

任何扩展程序页content scripts除外)都可以通过chrome.extension.getBackgroundPage()直接访问后台页面。

这意味着,在popup page内,您可以这样做:

chrome.extension.getBackgroundPage().console.log('foo');

使其更易于使用:

var bkg = chrome.extension.getBackgroundPage();
bkg.console.log('foo');

现在,如果你想在content scripts内做同样的事情,你必须使用Message Passing来实现这一目标。原因是,它们都属于不同的领域,这是有道理的。 Message Passing页面中有许多示例供您查看。

希望能清除一切。

答案 2 :(得分:58)

要直接回答您的问题,当您从后台呼叫console.log("something")时,会将此消息记录到后台页面的控制台。要查看它,您可以转到chrome://extensions/,然后点击您分机下的inspect view

单击弹出窗口时,会将其加载到当前页面,因此console.log应在当前页面中显示日志消息。

答案 3 :(得分:22)

您仍然可以使用console.log(),但它会被记录到单独的控制台中。 要查看它 - 右键单击​​扩展图标并选择“检查弹出窗口”。

答案 4 :(得分:11)

最简单的解决方案是在文件顶部添加以下代码。而且你可以像往常一样使用全部Chrome console api

 console = chrome.extension.getBackgroundPage().console;
// for instance, console.assert(1!=1) will return assertion error
// console.log("msg") ==> prints msg
// etc

答案 5 :(得分:6)

如果您想登录活动页面的控制台,请尝试此操作:

chrome.tabs.executeScript({
    code: 'console.log("addd")'
});

答案 6 :(得分:2)

const log = chrome.extension.getBackgroundPage().console.log;
log('something')

打开日志:

  • 打开:chrome:// extensions /
  • 详细信息>背景页面

答案 7 :(得分:1)

关于原始问题,我想补充Mohamed Mansour接受的答案,即还有一种方法可以使这项工作相反:

您可以通过chrome.extension.getViews()调用从后台页面/脚本中的访问其他扩展程序页面(即选项页面,弹出页面)。如上所述here

 // overwrite the console object with the right one.
var optionsPage = (  chrome.extension.getViews()  
                 &&  (chrome.extension.getViews().length > 1)  ) 
                ? chrome.extension.getViews()[1] : null;

 // safety precaution.
if (optionsPage) {
  var console = optionsPage.console;
}

答案 8 :(得分:1)

这是一个很老的帖子,已经有了很好的答案,但我加了两点。我不喜欢使用console.log,我宁愿使用记录到控制台的记录器,或者我想要的任何地方,所以我有一个定义日志功能的模块有点像这个

function log(...args) {
  console.log(...args);
  chrome.extension.getBackgroundPage().console.log(...args);
}

当我调用log(“这是我的日志”)时,它会在弹出控制台和后台控制台中写入消息。

优点是能够更改日志的行为而无需更改代码(例如禁用生产日志等)。

答案 9 :(得分:0)

要从后台页面获取控制台日志,您需要在后台页面background.js中编写以下代码段-

  

chrome.extension.getBackgroundPage()。console.log('hello');

然后加载扩展并检查其背景页面以查看控制台日志。

继续!!

答案 10 :(得分:0)

要在调试chrome扩展程序时查看控制台,应使用chrome.extension.getBackgroundPage(); API,之后您可以照常使用console.log()

chrome.extension.getBackgroundPage().console.log('Testing');

这在您多次使用时很好,因此您可以创建自定义函数:

  const console = {
    log: (info) => chrome.extension.getBackgroundPage().console.log(info),
  };
  console.log("foo");

您只能在任何地方使用console.log('learnin')

答案 11 :(得分:0)

目前使用 Manifest 3 和 Service Worker,您只需转到 Extensions Page / Details 并点击 Inspect Views / Service Worker

答案 12 :(得分:0)

chrome.extension.getBackgroundPage() 我得到 null

并累积 documentation,

<块引用>

背景页面被 MV3 中的 Service Worker 替换。

  • 将 manifest.json 中的 background.pagebackground.scripts 替换为 background.service_worker。请注意,service_worker 字段采用字符串,而不是字符串数组。

manifest.json

{
  "manifest_version": 3,
  "name": "",
  "version": "",
  "background": {
    "service_worker": "background.js"
  }
}

无论如何,我不知道如何使用 getBackgroundPage,但我找到了另一种解决方案,如下所示,

解决方案

使用 chrome.scripting.executeScript

因此您可以注入任何脚本或文件。可以直接点击inspect(F12)进行功能调试。

例如

chrome.commands.onCommand.addListener((cmdName) => {
    switch (cmdName) {
      case "show-alert":
        chrome.storage.sync.set({msg: cmdName}) // You can not get the context on the function, so using the Storage API to help you. // https://developer.chrome.com/docs/extensions/reference/storage/
        chrome.tabs.query({active: true, currentWindow: true}).then(([tab])=>{
          chrome.scripting.executeScript({
            target: {tabId: tab.id},
            function: () => {
              chrome.storage.sync.get(['msg'], ({msg})=> {
                console.log(`${msg}`)
                alert(`Command: ${msg}`)
              })
            }
          })
        })
        break
      default:
        alert(`Unknown Command: ${cmdName}`)
    }
  })

我创建了一个 open-source 供您参考。