Расширение Chrome: получение содержимого DOM для анализа

Я разрабатываю расширение Chrome, которое просто сканирует DOM на наличие фраз.

Единственное, с чем мне нужна помощь, это захват содержимого DOM с помощью всплывающего окна, я не могу найти способ вернуть содержимое текущей вкладки.


person Korvin Szanto    schedule 03.10.2011    source источник


Ответы (1)


Проверено и работает корректно:

помещать

"permissions": [
    "tabs"
  ],

в вашем манифесте.

Затем в вашем background.js

chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {
    // LOG THE CONTENTS HERE
    console.log(request.content);
  });

chrome.tabs.getSelected(null, function(tab) {

  // Now inject a script onto the page
  chrome.tabs.executeScript(tab.id, {
       code: "chrome.extension.sendRequest({content: document.body.innerHTML}, function(response) { console.log('success'); });"
     }, function() { console.log('done'); });

});

По сути, мы получаем текущую вкладку, запускаем на ней некоторый javascript, который получает innerHTML и передает его нам. Мы интерпретируем ответ в обратном вызове соответствующим образом.

Учтите, что при этом выполняется очень небольшая проверка ошибок, поэтому вы можете освежить в памяти передачу сообщений и API вкладок.

Изменить: я пробовал это, и он работает так, как ожидалось. Чтобы легко попробовать это самостоятельно, просто создайте новое пустое расширение и дайте ему разрешение «вкладки» и фоновую страницу. Затем проверьте background.html из chrome://extensions и перейдите в консоль. Скопируйте приведенный ниже код, установив вложенность chrome.tabs.getSelected на тайм-аут в несколько секунд. Когда вы нажимаете Enter, чтобы выполнить JS, быстро перейдите на другую вкладку. Дождитесь своего тайм-аута. Затем вернитесь к проверке background.html. HTML-код страницы, на которую вы щелкнули, будет напечатан на консоли.

Другое редактирование: в общем, доступ к текущей вкладке DOM как к событию кажется плохой моделью (вероятно, поэтому нет отличного собственного способа сделать это). Рассматривали ли вы возможность использования chrome.tabs.onUpdated или скрипты контента, чтобы универсально что-то делать при загрузке/изменении DOM?

person Alex Churchill    schedule 03.10.2011
comment
Все коммуникации обрабатываются; вы сначала добавляете слушателя к событиям. Затем вторая часть получает выбранную вкладку, внедряет скрипт, который перезванивает на вашу страницу. Слушатель onRequest интерпретирует его (под LOG THE CONTENTS HERE). - person Alex Churchill; 04.10.2011
comment
JS также можно разместить в popup.html :) - person giorgio79; 26.11.2011
comment
Вы сделали tab = tab.id, а затем снова tab.id — правильно? - person Nakilon; 22.04.2012
comment
Вы должны упомянуть все manifest.json, так как большинство людей прибегают к поиску в Google и понятия не имеют, с чего начать, Ссылка 1 , Ссылка 2 { "manifest_version": 2, "name": "MyExtension", "version": "1", "permissions": [ "tabs" ], "background": { "scripts": ["background.js"] }, "content_scripts": [ { "matches": ["https://*.stackoverflow.com/*"],"js": ["contentScript.js"] } ], "browser_action": { "default_icon": "icon.png", "default_popup": "popup.html" } } - person Salem; 03.09.2020