Sé que ha habido muchas preguntas relacionadas con este tema, pero ninguna de ellas hasta ahora me ha permitido resolver esto en V3. Cuando ejecuto el siguiente background.js, solo obtengo indefinido.
El objetivo de mi extensión, al menos para esta etapa, es raspar el DOM de la pestaña activa y extraer el contenido de texto de todos los elementos div.
Mi página background.js:
function getDOM() { let htmlarr = []; const pageDOM = document.getElementsByTagName('div'); for (i = 0; i < pageDOM.length; i++) { htmlarr += pageDOM.innerHTML; } return Object.assign({}, htmlarr) } chrome.tabs.onActivated.addListener(activeInfo => { let domRes = chrome.scripting.executeScript({ target: { tabId: activeInfo.tabId }, func: getDOM }) console.log(domRes); });mi manifiesto.json:
{ "name": "HTML Sourcer", "description": "Extract HTML source code", "version": "1.0", "minimum_chrome_version": "10.0", "manifest_version": 3, "permissions": ["scripting", "tabs", "activeTab"], "host_permissions": [ "*://*/*" ], "background": { "service_worker": "background.js" } }Cualquier ayuda sería muy apreciada. ¡Gracias!
Según la documentación, este método API devuelve una Promesa cuando no hay un parámetro de devolución de llamada.
Para obtener el valor de Promise, agregue await y marque la función como async :
chrome.tabs.onActivated.addListener(async info => { let domRes = await chrome.scripting.executeScript({ target: {tabId: info.tabId}, func: getDOM, }).catch(console.error); if (!domRes) return; console.log(domRes); }); Hay un catch porque algunas pestañas no admiten la inyección, por ejemplo, la pestaña de inicio o las pestañas chrome:// .
En JavaScript += no funciona con matrices, sino solo con números/cadenas. Utilice htmlarr. empujar () en su lugar. Tampoco es necesario convertir la matriz en un objeto a través de Object.assign.
En realidad, reescribamos getDOM usando Array.from :
function getDOM() { return Array.from( document.getElementsByTagName('div'), el => el.innerHTML ); }