0

我正在构建一个 Chrome 扩展程序,它需要查看 Google 网上论坛主题搜索的结果(页面 URL 是https://groups.google.com/forum/?fromgroups=#!searchin/opencomments-site-discussions/subject :{some topic} 我可以通过查找某个类名来判断是否存在匹配项)。不幸的是,它正在寻找的字段直到页面的 Javascript 运行后才被创建,所以我不能简单地查看来自页面的原始 HTML

try {
  var request = new XMLHttpRequest();
  request.open("GET", url, false);
  request.send(null);
} catch (e) {
  ....
}
if (request.status == 200) {
  var rawText = request.responseText;
  ...
}

有谁知道是否可以在不显示页面的情况下加载整个页面,包括执行 Javascript?在这个问题上一直在拉我的头发。

4

1 回答 1

1

看看offscreenTabsAPI(目前是实验性的)。
使用 创建选项卡后chrome.experimental.offscreenTabs.create,您可以使用chrome.tabs.sendMessagechrome.tabs.executeScript做任何您想做的事情。

如果您需要灵感,请查看此完整演示

根据规范,只能在真实选项卡中创建离屏选项卡(否则,您将收到“Experimental.offscreenTabs.create 期间出错:未找到当前选项卡”)。在我的另一个演示中,我为此使用了一个选项页面。如果您不想使用这样的页面,请使用 创建一个新选项卡chrome.tabs.create,做任何您想做的事情,然后使用window.close()关闭选项卡。

因此,您毕竟将打开一个(隐藏的)选项卡(尽管页面本身不可见)。使用当前的 API,没有其他方法可以在不打开选项卡的情况下呈现隐藏选项卡(除非您想在后台页面的 iframe 中呈现页面......)。如果您不介意实际的选项卡显示在选项卡栏中,请使用chrome.tabs.create({active:false, url:'...'}). 如果保持标签对用户真正不可见很重要,请继续以下演示:

使用 offscreenTabs API 进行演示

在此示例中,我将显示一个包含不可见选项卡标题的警报。我可以立即从内容脚本中显示此警报,但是,我将把数据传递到后台页面,以演示该功能:

后台脚本(background.js):

 chrome.extension.onMessage.addListener(function(message, sender, sendResponse) {
     var tab = sender.tab;
     if (tab && tab.index === -1) { // <-- Detect offscreen tab
         if (message.method == 'title') {
             // Close helper tab:
             chrome.extension.sendMessage({method: 'finishedTab', id: tab.id});
             alert('Got title from ' + tab.url + ' :\n' + message.result);
         }
     }
 });

 chrome.browserAction.onClicked.addListener(function() {
     chrome.tabs.create({
        active: false,
        url: chrome.extension.getURL('launcher.html')
     });
 });

内容脚本(contentscript.js):

chrome.extension.sendMessage({
    method: 'title',
    result: document.title
});

launcher.html包含<script src="launcher.js"></script>. launcher.js

var offscreenTabId;
// Close the tab when the stuff is done
chrome.extension.onMessage.addListener(function(message) {
    if (message.method == 'finishedTab' && message.id === offscreenTabId) {
        window.close();
    }
});
// Create invisible tab
var createProperties = {url: "https://stackoverflow.com/"};
chrome.experimental.offscreenTabs.create(createProperties, function(offscreenTab) {
    offscreenTabId = offscreenTab.id;
});

清单文件:

{
    "name": "Get information from DOM in an invisible tab",
    "description": "See https://stackoverflow.com/q/13714002",
    "version": "1",
    "manifest_version": 2,
    "permissions": ["experimental", "<all_urls>"],
    "background": {"scripts": ["background.js"] },
    "content_scripts": [{
        "js": ["contentscript.js"],
        "matches": ["<all_urls>"]
    }],
    "browser_action": {}
}
于 2012-12-05T00:04:55.460 回答