有一些类似的问题,但它们都归结为chrome.tabs.getSelected
或chrome.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才能继续按预期工作。
答案 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