得到这个'内容脚本选项卡(未选中,非活动选项卡)?

时间:2018-03-26 16:03:20

标签: javascript google-chrome-extension

有一些类似的问题,但它们都归结为chrome.tabs.getSelectedchrome.tabs.query API,这在我的情况下并不合适。

基本上我需要做的是获取运行脚本的选项卡的id - 所以它不一定是活动或选定的标签。

根据the doc

  

getCurrent chrome.tabs.getCurrent(函数回调)

     

获取此脚本调用的选项卡。也许   如果从非选项卡上下文调用(例如:背景),则为undefined   页面或弹出视图)。

这意味着它应该在内容脚本中工作,但在内容脚本中未定义chrome.tabs。为什么会这样?有没有办法知道this标签数据(内容脚本运行的位置,而不是选定或活动标签)?

即使文档说tabs权限对大多数API都不是强制性的,但我还是把它添加到清单中而没有运气:

{
  "manifest_version": 2,
  "name": ...
  "permissions": [
    ...
    "tabs",
    ...
}

非常感谢任何想法

get current/this tab的用例是,当扩展程序完成其工作时,它需要重新加载它作为工作流程的一部分运行的页面,并且用户可以位于不同的选项卡上或不同的窗口。扩展程序的脚本仍需要获取正确的tabId才能继续按预期工作。

2 个答案:

答案 0 :(得分:2)

实际上,您只能在"""This script will open URLs and IP addresses in the default web browser. Please store all URLs and/or IPs in a file called 'port80.txt'. Please ignore errors that appear in the terminal upon closing your web browser (may only affect Firefox on Kali Linux). Thanks.""" import webbrowser import time import sys import os #sys.tracebacklimit = 0 counter = 0;port = "0" while port != "80" and port != "443": port = raw_input("Port 80 or Port 443?\n") try: fileOfURLs = open("port"+port+".txt","r") except: print("Could not open file. Check if it exists. Exiting...") exit() urls = [] readFile = fileOfURLs.readlines() for line in readFile: urls.append(line.strip()) fileOfURLs.close() #get how many urls/IPs are in the file amountOfURLs = len(urls) print("There are " + str(amountOfURLs) + " URLs in this text file.") print("Please ignore error messages upon exit of a FireFox tab/window.\ I have no idea how to stop these...") """Open the tabs. Opens 10 at a time over a 10 second span. Change 'maxtabs' to a different number if more tabs at a time is preferred.""" maxtabs = 10 while amountOfURLs > 0: os.system("firefox &> /dev/null"); time.sleep(1) if amountOfURLs > maxtabs: counter = maxtabs;amountOfURLs -= maxtabs elif amountOfURLs > 0 and amountOfURLs < maxtabs: counter = amountOfURLs; amountOfURLs = 0 while counter > 0: webbrowser.open("http://" + urls.pop(0) + ":" + port,new=2) counter-=1 print("There are " + str(counter) + " tabs left to open in this batch.") time.sleep(1) raw_input("Press enter to continue...") print("Done.") raw_input("Press enter to exit...") 计划的页面上使用chrome.tabs.getCurrent(打开为扩展程序的“选项”页面或通过chrome-extension://chrome.tabs.create),或者如果您使用chrome.windows.create '正在使用chrome_url_overrides。后台,弹出窗口和嵌入选项页面没有当前选项卡,并且内容脚本中不存在API。

答案 1 :(得分:1)

好吧,好像我已经找到了问题的答案。

诀窍是向后台脚本发送消息并从那里提取sender数据。发件人将包含运行脚本的tab对象。

我正在使用ports,所以这就是我将在下面举例说明的内容:

在内容脚本方面:

    var port = chrome.extension.connect({
        name: "some name"
    });

    port.postMessage({"key":"some json here"})

背景方面:

chrome.extension.onConnect.addListener(function (port) {
    console.log(port.sender.tab)
})

port.sender是一个MessageSender对象,它将包含tabId(如果&#34;标签&#34;权限已添加到清单中,则为tabUrl)

在我的情况下,我只是将tabId从后台发送回内容脚本:

port.postMessage({"tabId":port.sender.tab.id})

有关详情,请参阅messaging doc和this api doc