rozszerzenie google chrome :: console.log () ze strony w tle?

173

Jeśli zadzwonię console.log('something');z wyskakującej strony lub dowolnego skryptu, to działa dobrze.

Jednak ponieważ strona w tle nie jest bezpośrednio wyprowadzana ze strony wyskakującej, nie jest uwzględniona w konsoli.

Czy istnieje sposób, w jaki mogę uzyskać console.log()wyświetlenie na stronie w tle w konsoli strony podręcznej?

czy istnieje sposób na wywołanie funkcji ze strony w tle na stronie podręcznej?

Hailwood
źródło
Co dokładnie masz na myśli mówiąc „to działa dobrze”? Gdzie czytasz „coś”? Używanie console.log () w wyskakującym okienku nie powinno być drukowane w konsoli załadowanej strony - skoro pytanie ma 2 lata, czy API się zmieniło?
anddam
14
jeśli klikniesz prawym przyciskiem myszy -> sprawdź wyskakujące okienko działania przeglądarki, uzyskasz stronę narzędzi programistycznych dla swojego rozszerzenia. popup.js wydrukuje do tego logi.
not_shitashi,
Komentarz @ not_shitashi powinien być odpowiedzią na to pytanie.
gabe

Odpowiedzi:

154

Każda strona rozszerzenia (z wyjątkiem skryptów zawartości ) ma bezpośredni dostęp do strony w tle za pośrednictwem chrome.extension.getBackgroundPage().

Oznacza to, że na wyskakującej stronie możesz po prostu:

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

Aby ułatwić korzystanie z:

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

Teraz, jeśli chcesz zrobić to samo w skryptach zawartości , musisz użyć Message Passing, aby to osiągnąć. Powód, że obaj należą do różnych dziedzin, co ma sens. Na stronie Przekazywanie wiadomości znajduje się wiele przykładów, które możesz sprawdzić.

Mam nadzieję, że to wszystko wyjaśnia.

Mohamed Mansour
źródło
1
@MohamedMansour, to rozwiązanie nie działa dla mnie. Jeśli alert() chrome.extension.getBackgroundPage()dostanę null. Czy muszę mieć ustawione uprawnienia lub inną konfigurację?
gwg
@gwg Czy Twoje rozszerzenie ma stronę w tle? Zgodnie z dokumentacją „Zwraca wartość null, jeśli rozszerzenie nie ma strony w tle”. developer.chrome.com/extensions/…
Mohamed Mansour,
Działa to doskonale w przypadku moich własnych wiadomości do konsoli. Dzięki. Jakieś przemyślenia na temat tworzenia wyjątków itp. W pliku popup.js pojawiają się w konsoli background.js?
steven_noble
195

Konsolę strony działającej w tle można otworzyć, klikając łącze „background.html” na liście rozszerzeń.

Aby uzyskać dostęp do strony w tle, która odpowiada Twoim rozszerzeniom, otwórz Settings / Extensionslub otwórz nową kartę i wprowadź chrome://extensions. Zobaczysz coś takiego jak ten zrzut ekranu.

Okno dialogowe rozszerzeń Chrome

Pod rozszerzeniem kliknij link background page. To otwiera nowe okno. Dla próbki menu kontekstowego okno ma tytuł: _generated_background_page.html.

serg
źródło
4
Pozdrawiam, jestem tego świadomy, jednak bezpośrednie otwarcie strony w tle nie wywołuje niczego ze strony wyskakującej.
Hailwood
Otwarcie strony w tle nie wyświetla żadnych informacji logowania konsoli.
Layke
@Hailwood otwarcie strony w tle nie wywołuje niczego, ale pokaże konsolę jako stronę w tle.
anddam
1
@Layke po otwarciu strony w tle nadal musisz do niej pisać, czyli bezpośrednio użyć console.log () ze strony w tle lub, jak powiedział mohamed-mansour, wywołać tę samą metodę na obiekcie zwróconym przez getBackgroundPage ()
anddam
3
Znalazłem to pytanie, szukając sposobu sprawdzenia wyjścia rozszerzenia (takiego jak OP) i uznałem tę odpowiedź za bardzo przydatną, ponieważ pozwoliła mi sprawdzić logowanie konsoli bez przechodzenia przez stronę zawartości.
anddam
66

Aby odpowiedzieć bezpośrednio na twoje pytanie, gdy dzwonisz console.log("something")z tła, ta wiadomość jest rejestrowana w konsoli strony w tle. Aby go zobaczyć, możesz przejść do chrome://extensions/i kliknąć to inspect viewpod swoim rozszerzeniem.

Po kliknięciu wyskakującego okienka jest ono ładowane na bieżącą stronę, dlatego console.log powinien wyświetlać komunikat dziennika na bieżącej stronie.

songyy
źródło
Ja też! To jest najprostsze i bezpośrednie.
SaidbakR
moje rozszerzenie tego nie ma, ale inne rozszerzenia mają! jak to włączyć
Ahmed Eid
Jeśli masz 3 monitory takie jak ja ... obróć głowę. Otwierał ChromeDevTools na drugim końcu tablicy monitorów i nie widziałem tego.
mpen
26

Nadal możesz używać console.log (), ale zostanie ona zalogowana w osobnej konsoli. Aby go zobaczyć - kliknij prawym przyciskiem myszy ikonę rozszerzenia i wybierz „Sprawdź wyskakujące okienko”.

Lacho Tomov
źródło
12

Najprostszym rozwiązaniem byłoby dodanie następującego kodu na początku pliku. Poza tym możesz normalnie korzystać z pełnego interfejsu konsoli Chrome .

 console = chrome.extension.getBackgroundPage().console;
// for instance, console.assert(1!=1) will return assertion error
// console.log("msg") ==> prints msg
// etc
dd.
źródło
9
const log = chrome.extension.getBackgroundPage().console.log;
log('something')

Otwórz dziennik:

  • Otwórz: chrome: // extensions /
  • Szczegóły> Strona w tle
O Fallante
źródło
Czy mógłbyś podać więcej wyjaśnień do swoich poleceń?
inetphantom
7

Spróbuj tego, jeśli chcesz zalogować się do konsoli aktywnej strony:

chrome.tabs.executeScript({
    code: 'console.log("addd")'
});
Faz
źródło
1
Wymaga uprawnień hosta dla bieżącej karty.
Xan,
Możesz dodać go do testów i usunąć, jeśli wydasz dodatek.
Faz
1

W odniesieniu do pierwotnego pytania chciałbym dodać do zaakceptowanej odpowiedzi Mohameda Mansoura, że ​​istnieje również sposób na odwrócenie tego działania:

Możesz uzyskać dostęp do innych stron rozszerzeń (tj. Strony opcji, strony wyskakującej) z poziomu strony / skryptu w tle z chrome.extension.getViews()wywołaniem. Jak opisano tutaj .

 // 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
źródło
1

To stary post, z już dobrymi odpowiedziami, ale dodaję dwa bity. Nie lubię używać console.log, wolę raczej loggera, który loguje się do konsoli, lub gdziekolwiek chcę, więc mam moduł definiujący funkcję dziennika trochę taką jak ta

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

Kiedy wywołuję dziennik („to jest mój dziennik”), zapisze wiadomość zarówno w wyskakującej konsoli, jak i w tle.

Zaletą jest możliwość zmiany zachowania dzienników bez konieczności zmiany kodu (np. Wyłączanie dzienników na potrzeby produkcji itp.)

Denis G.
źródło
0

Aby uzyskać dziennik konsoli ze strony działającej w tle, musisz napisać następujący fragment kodu na swojej stronie tła background.js -

chrome.extension.getBackgroundPage (). console.log („witaj”);

Następnie załaduj rozszerzenie i sprawdź jego stronę w tle, aby wyświetlić dziennik konsoli.

Śmiało!!

Anushka Rai
źródło