¿Cómo puedo obtener la URL de la pestaña actual de una extensión de Google Chrome?

Respuestas:

219

Usar chrome.tabs.query()así:

chrome.tabs.query({active: true, lastFocusedWindow: true}, tabs => {
    let url = tabs[0].url;
    // use `url` here inside the callback because it's asynchronous!
});

Esto requiere que solicite acceso a la chrome.tabsAPI en su manifiesto de extensión :

"permissions": [ ...
   "tabs"
]

Es importante tener en cuenta que la definición de su "pestaña actual" puede variar según las necesidades de su extensión.

La configuración lastFocusedWindow: trueen la consulta es apropiada cuando desea acceder a la pestaña actual en la ventana enfocada del usuario (generalmente la ventana superior).

La configuración le currentWindow: truepermite obtener la pestaña actual en la ventana donde el código de su extensión se está ejecutando actualmente. Por ejemplo, esto podría ser útil si su extensión crea una nueva ventana / ventana emergente (cambio de enfoque), pero aún quiere acceder a la información de la pestaña desde la ventana donde se ejecutó la extensión.

Elegí usar lastFocusedWindow: trueen este ejemplo, porque Google menciona casos en los que currentWindow no siempre están presentes .

Puede refinar aún más su consulta de pestañas utilizando cualquiera de las propiedades definidas aquí: chrome.tabs.query

thauburger
fuente
27
¿Por qué la URL siempre está indefinida?
nnm
2
Si la URL no está definida, intente volver a cargar su extensión desde chrome: // extensiones Esto recargará la configuración de la extensión y aplicará el permiso de "pestañas" recién agregado.
flashbackzoo
2
url no está definida porque stackoverflow.com/questions/28786723/… (respuesta: cierre la ventana de herramientas de desarrollo o cambie a currentWindow en lugar de lastFocusedWindow)
kspearrin
2
Me quedé indefinido cuando mi ventana de herramientas de desarrollo estaba desacoplada. Al acoplarlo se solucionó el problema indefinido.
Fisu
Esto no devuelve la URL variable a la persona que llama. Me gustaría una función simple url = GetCurrentTabUrl () que devuelve la URL de la pestaña actual a la persona que llama. Aquí la variable está dentro de la función de devolución de llamada. Puedo pasarlo a otra función pero hace que la estructura del código sea incómoda. También me gustaría evitar el uso de variables globales. alguna idea @thauburger?
Thierry Dalon
78

¡Advertencia! chrome.tabs.getSelectedestá en desuso . Utilice chrome.tabs.querycomo se muestra en las otras respuestas.


Primero, debe establecer los permisos para la API en manifest.json:

"permissions": [
    "tabs"
]

Y para almacenar la URL:

chrome.tabs.getSelected(null,function(tab) {
    var tablink = tab.url;
});
Axiol
fuente
1
La razón por la cual es solo para la ventana emergente (acción de página, acción del navegador) es porque está enviando un "nulo" al primer parámetro. code.google.com/chrome/extensions/tabs.html#method-getSelected Los documentos indican que el primer parámetro es el windowId, si desea usarlo en las opciones o en la página de fondo, necesitaría poner el id de la ventana o Obtendrá la pestaña actual de su visualización que está indefinida, opciones respectivamente.
Mohamed Mansour
1
sí, funciona, pero no estoy seguro de por qué el método chrome.tabs.getSelected no se puede encontrar en el documento de referencia.
natación
Esto no me funciona, chrome.tabs.getSelectedno está definido, ¿debería hacerlo en otra pregunta?
Mostafa Shahverdy
11
El chrome.tabs.getSelectedmétodo ha quedado en desuso, el método correcto aparece en la siguiente respuesta .
Rob W
1
Y cómo obtener enlaces de todas las pestañas abiertas
Enve
48

Otras respuestas suponen que desea saberlo desde una ventana emergente o un script de fondo.

En caso de que desee conocer la URL actual de un script de contenido , se aplica la forma estándar de JS:

window.location.toString()

Puede usar las propiedades de window.locationpara acceder a partes individuales de la URL, como el host, el protocolo o la ruta.

Xan
fuente
1
Gran respuesta. Todo lo que quería era window.location.hostver si estoy en "stackoverflow.com" o no.
Salyangoz
1
Esto es realmente lo que estaba buscando. Estaba tan atrapado en la mecánica de la extensión que olvidé que puedes tomar la URL de la página con window.location.href.
Felwithe
Esto requiere una match:"<all_urls>"situación en la sección content_script y Chrome no se recomienda <all_urls>.
mcan
@Tahtakafa No, no lo hace. Se supone que ya se está ejecutando un script de contenido (ya sea a través de un permiso de host para esa página o activeTab).
Xan
Asegúrese de ejecutar esto contentScript.jsy no en el background.js. Simplemente pase cualquier información que haya filtrado de la URL al mensaje background.js. Ejemplo: let message = { type: "fetchVideoDate", id: getVideoId() };donde getVideoId()contiene una ejecución de window.location.toString(). De lo contrario, obtendrá algunos chrome://temp_background_file.htmldatos. También tenga en cuenta que a veces messagese llama request.
DavidHulsman
25

El problema es que chrome.tabs.getSelected es asíncrono. Este código a continuación generalmente no funcionará como se esperaba. El valor de 'tablink' seguirá sin definirse cuando se escriba en la consola porque getSelected aún no ha invocado la devolución de llamada que restablece el valor:

var tablink;
chrome.tabs.getSelected(null,function(tab) {
    tablink = tab.url;
});
console.log(tablink);

La solución es envolver el código donde usará el valor en una función y hacer que se invoca getSelected. De esta manera, se garantiza que siempre tendrá un valor establecido, ya que su código tendrá que esperar a que se proporcione el valor antes de ejecutarse.

Intenta algo como:

chrome.tabs.getSelected(null, function(tab) {
    myFunction(tab.url);
});

function myFunction(tablink) {
  // do stuff here
  console.log(tablink);
}
Nyk Cowham
fuente
Gracias por el código, esto funcionó para mí, se deben agregar "pestañas" a los permisos en el archivo manifest.json "permisos": ["pestañas"]
Doug Molineux
También esto funciona a las
mil maravillas
Y cómo obtener enlaces de todas las pestañas abiertas
Enve
2
Intenté esto, pero la URL no está definida ¿por qué es esto?
nnm
1

Hola, aquí hay una muestra de Google Chrome que envía por correo electrónico el sitio actual a un amigo. La idea básica detrás es lo que quieres ... en primer lugar, busca el contenido de la página (no es interesante para ti) ... luego obtiene la URL (<- buena parte)

Además, es un buen ejemplo de código de trabajo, que prefiero con mucho entusiasmo a leer Documentos.

Se puede encontrar aquí: envíe esta página por correo electrónico

bastianneu
fuente
1

Esta solución ya está PROBADA.

establecer permisos para API en manifest.json

"permissions": [ ...
   "tabs",
    "activeTab",
    "<all_urls>"
]

En la primera carga llama a la función. https://developer.chrome.com/extensions/tabs#event-onActivated

chrome.tabs.onActivated.addListener((activeInfo) => {  
  sendCurrentUrl()
})

En función de cambio de llamada. https://developer.chrome.com/extensions/tabs#event-onSelectionChanged

chrome.tabs.onSelectionChanged.addListener(() => {
  sendCurrentUrl()
})

la función para obtener la URL

function sendCurrentUrl() {
  chrome.tabs.getSelected(null, function(tab) {
    var tablink = tab.url
    console.log(tablink)
  })
Sandra Rl
fuente
0

Para aquellos que usan el context menu api, los documentos no tienen claro de inmediato cómo obtener información de la pestaña.

  chrome.contextMenus.onClicked.addListener(function(info, tab) {
    console.log(info);
    return console.log(tab);
  });

https://developer.chrome.com/extensions/contextMenus

lfender6445
fuente
-2

Tienes que verificar esto .

HTML

<button id="saveActionId"> Save </button>

manifest.json

  "permissions": [
    "activeTab",
    "tabs"
   ]

JavaScript
El siguiente código guardará todas las URL de la ventana activa en el objeto JSON como parte del clic del botón.

var saveActionButton = document.getElementById('saveActionId');
saveActionButton.addEventListener('click', function() {
    myArray = [];
    chrome.tabs.query({"currentWindow": true},  //{"windowId": targetWindow.id, "index": tabPosition});
    function (array_of_Tabs) {  //Tab tab
        arrayLength = array_of_Tabs.length;
        //alert(arrayLength);
        for (var i = 0; i < arrayLength; i++) {
            myArray.push(array_of_Tabs[i].url);
        }
        obj = JSON.parse(JSON.stringify(myArray));
    });
}, false);
Kanagavelu Sugumar
fuente
Mi extensión de Chrome para guardar URL en ventanas activas es chrome.google.com/webstore/detail/tabstore-plugin/…
Kanagavelu Sugumar