Расширение Google Chrome :: console.log () с фоновой страницы?

173

Если я звоню console.log('something');со всплывающей страницы, или любой другой скрипт включен, он работает нормально.

Однако, поскольку фоновая страница не запускается непосредственно из всплывающей страницы, она не включается в консоль.

Есть ли способ, которым я могу получить console.log()на фоновой странице, чтобы показать в консоли для всплывающей страницы?

есть ли способ, с фоновой страницы вызвать функцию на всплывающей странице?

Hailwood
источник
Что именно вы имеете в виду, говоря «все работает хорошо»? Где читают "что-то"? Использование console.log () во всплывающем окне не должно печатать в консоли загруженной страницы - поскольку вопросу исполнилось 2 года, изменился ли API?
Anddam
14
Если вы щелкнете правой кнопкой мыши -> проверить всплывающее окно в своем действии браузера, вы получите страницу инструментов разработчика для вашего расширения. popup.js распечатает логи для этого.
not_shitashi
Комментарий @ not_shitashi должен быть ответом на этот вопрос.
Гейб

Ответы:

154

Любая страница расширения (кроме скриптов контента ) имеет прямой доступ к фоновой странице через chrome.extension.getBackgroundPage().

Это означает, что на всплывающей странице вы можете просто сделать:

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

Чтобы сделать его проще в использовании:

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

Теперь, если вы хотите сделать то же самое в контентных скриптах, вы должны использовать Message Passing для достижения этого. Причина в том, что они оба принадлежат к разным доменам, что имеет смысл. На странице « Передача сообщений» есть много примеров, которые вы можете проверить.

Надеюсь, что все прояснит.

Мохамед Мансур
источник
1
@MohamedMansour, это решение не работает для меня. Если я alert() chrome.extension.getBackgroundPage(), я получу null. Нужно ли мне установить разрешения или какую-то другую конфигурацию?
GWG
@gwg у вашего расширения есть фоновая страница? Согласно документации «Возвращает ноль, если у расширения нет фоновой страницы». developer.chrome.com/extensions/...
Mohamed Mansour
Это прекрасно работает для моих собственных сообщений в консоли. Спасибо. Любые мысли о том, как сделать исключения и т.д. из popup.js, появляются в консоли background.js?
steven_noble
196

Вы можете открыть консоль фоновой страницы, щелкнув ссылку «background.html» в списке расширений.

Для доступа к фоновой странице, которая соответствует вашим расширениям, откройте Settings / Extensionsили откройте новую вкладку и введите chrome://extensions. Вы увидите что-то вроде этого скриншота.

Диалог расширений Chrome

Под вашим расширением нажмите на ссылку background page. Это открывает новое окно. Для образца контекстного меню окно имеет заголовок: _generated_background_page.html.

Serg
источник
4
Приветствия, я знаю об этом, однако открытие фоновой страницы напрямую не вызывает ничего из всплывающей страницы.
Hailwood
Открытие фоновой страницы не выводит никакой информации о регистрации в консоли.
Layke
@Hailwood, открывающий фоновую страницу, ничего не вызывает, но покажет консоль для фоновой страницы.
Anddam
1
@Layke, как только вы открыли фоновую страницу, вам все равно придется писать в нее, т.е. напрямую использовать console.log () из фоновой страницы или, как сказал mohamed-mansour, вызывать тот же метод для объекта, возвращаемого getBackgroundPage ()
anddam
3
Я нашел этот вопрос в поиске, как проверить вывод расширения (например, OP), и нашел этот ответ очень полезным, так как он позволял мне проверять журналы консоли, не проходя через страницу контента.
Anddam
66

Чтобы ответить на ваш вопрос напрямую, когда вы звоните console.log("something")из фона, это сообщение регистрируется в консоли фоновой страницы. Чтобы просмотреть его, перейдите по chrome://extensions/ссылке и нажмите на нее inspect viewпод своим расширением.

Когда вы нажимаете всплывающее окно, оно загружается на текущую страницу, поэтому console.log должен показывать сообщение журнала на текущей странице.

songyy
источник
Я тоже! Это самый простой и прямой.
SaidbakR
мое расширение не имеет этого, другие расширения, однако! как мне это включить
Ахмед Ид
Если у вас есть 3 монитора, как я ... поверните голову. Он открывал ChromeDevTools на противоположном конце моего массива мониторов, и я его не видел.
Апен
26

Вы все еще можете использовать console.log (), но он регистрируется в отдельной консоли. Чтобы просмотреть его - щелкните правой кнопкой мыши значок расширения и выберите «Проверить всплывающее окно».

Лачо Томов
источник
12

Простейшим решением было бы добавить следующий код вверху файла. И тогда вы можете использовать все полноценные консольные API Chrome, как обычно.

 console = chrome.extension.getBackgroundPage().console;
// for instance, console.assert(1!=1) will return assertion error
// console.log("msg") ==> prints msg
// etc
день
источник
9
const log = chrome.extension.getBackgroundPage().console.log;
log('something')

Открыть журнал:

  • Открыть: chrome: // extensions /
  • Подробности> Фоновая страница
О Фаланте
источник
Не могли бы вы дать больше объяснений вашим командам?
inetphantom
7

Попробуйте это, если хотите войти в консоль активной страницы:

chrome.tabs.executeScript({
    code: 'console.log("addd")'
});
Faz
источник
1
Требует разрешения хоста для текущей вкладки.
Ксан
Вы можете добавить его для тестирования и удалить, если освободите аддон.
Фаз
1

Относительно исходного вопроса я хотел бы добавить к принятому ответу Мохамеда Мансура, что есть также способ сделать эту работу наоборот:

Вы можете получить доступ к другим страницам расширения (т. Е. Странице параметров, всплывающей странице) из фоновой страницы / сценария с chrome.extension.getViews()вызовом. Как описано здесь .

 // 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;
}
WoodrowShigeru
источник
1

Это старый пост с уже хорошими ответами, но я добавляю свои два бита. Я не люблю использовать console.log, я бы предпочел использовать регистратор, который регистрирует данные на консоли или где угодно, поэтому у меня есть модуль, определяющий функцию журнала, немного похожую на эту.

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

Когда я вызываю журнал («это мой журнал»), он пишет сообщение как во всплывающей консоли, так и в фоновой консоли.

Преимущество заключается в возможности изменять поведение журналов без необходимости изменения кода (например, отключение журналов для производства и т. Д.)

Денис Г.
источник
0

Чтобы получить консольный журнал с фоновой страницы, вам нужно написать следующий фрагмент кода на фоновой странице background.js -

chrome.extension.getBackgroundPage () console.log ( 'Привет').

Затем загрузите расширение и осмотрите его фоновую страницу, чтобы увидеть журнал консоли.

Преуспевать!!

Анушка Рай
источник