当前位置: 首页 > 面试题库 >

从Chrome扩展程序获取当前页面的源HTML

潘弘壮
2023-03-14
问题内容

我有一个Chrome扩展程序。我需要从当前页面的HTML源进行分析。我在这里找到了各种带有背景页面和内容脚本的解决方案,但没有一个对我有帮助。这是我到目前为止所拥有的:
manifest.json:

{
  "name": "Extension",
  "version": "1.0",
  "description": "Extension",
  "browser_action": {
    "default_icon": "bmarkred.ico",
    "popup": "Test.html"
  },
  "content_scripts": [
    {
      "matches": ["http://*/*"],
      "js": ["content.js"]
    }
  ],
  "background": {
    "page": "backgroundPage.html"
  },
  "permissions": [
    "cookies",
    "tabs",
    "http://*/*", 
    "https://*/*"
  ]
}

background.html:

<html>
<head>
<script type="text/javascript">
    try {
        chrome.tabs.getSelected(null, function (tab) {
            chrome.tabs.sendRequest(tab.id, {action: "getSource"}, function(source) {
                alert(source);
            });
        });
    }
    catch (ex) {
        alert(ex);
    }
</script>
</head>
</html>

content.js:

chrome.extension.onRequest.addListener(function(request, sender, callback) {
    if (request.action == "getSource") {
        callback(document.getElementsByTagName('html')[0].innerHTML);
    }
});

警报始终警报未定义。即使我在content.js文件中将回调函数更改为:

callback('hello');

结果还是一样。我究竟做错了什么?也许我走错路了。我真正需要的是这个。当用户打开扩展弹出窗口时(只有那时),我需要当前页面的HTML,以便可以对其进行分析。有什么建议么?


问题答案:

将脚本插入您要从中获取源代码的页面中,并将其发送回弹出窗口…。

manifest.json

{
  "name": "Get pages source",
  "version": "1.0",
  "manifest_version": 2,
  "description": "Get pages source from a popup",
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "permissions": ["tabs", "<all_urls>"]
}

popup.html

<!DOCTYPE html>
<html style=''>
<head>
<script src='popup.js'></script>
</head>
<body style="width:400px;">
<div id='message'>Injecting Script....</div>
</body>
</html>

popup.js

chrome.runtime.onMessage.addListener(function(request, sender) {
  if (request.action == "getSource") {
    message.innerText = request.source;
  }
});

function onWindowLoad() {

  var message = document.querySelector('#message');

  chrome.tabs.executeScript(null, {
    file: "getPagesSource.js"
  }, function() {
    // If you try and inject into an extensions page or the webstore/NTP you'll get an error
    if (chrome.runtime.lastError) {
      message.innerText = 'There was an error injecting script : \n' + chrome.runtime.lastError.message;
    }
  });

}

window.onload = onWindowLoad;

getPagesSource.js

// @author Rob W <http://stackoverflow.com/users/938089/rob-w>
// Demo: var serialized_html = DOMtoString(document);

function DOMtoString(document_root) {
    var html = '',
        node = document_root.firstChild;
    while (node) {
        switch (node.nodeType) {
        case Node.ELEMENT_NODE:
            html += node.outerHTML;
            break;
        case Node.TEXT_NODE:
            html += node.nodeValue;
            break;
        case Node.CDATA_SECTION_NODE:
            html += '<![CDATA[' + node.nodeValue + ']]>';
            break;
        case Node.COMMENT_NODE:
            html += '<!--' + node.nodeValue + '-->';
            break;
        case Node.DOCUMENT_TYPE_NODE:
            // (X)HTML documents are identified by public identifiers
            html += "<!DOCTYPE " + node.name + (node.publicId ? ' PUBLIC "' + node.publicId + '"' : '') + (!node.publicId && node.systemId ? ' SYSTEM' : '') + (node.systemId ? ' "' + node.systemId + '"' : '') + '>\n';
            break;
        }
        node = node.nextSibling;
    }
    return html;
}

chrome.runtime.sendMessage({
    action: "getSource",
    source: DOMtoString(document)
});


 类似资料:
  • 问题内容: 我正在尝试从弹出窗口访问activeTab DOM内容。这是我的清单: 我真的很困惑,背景脚本(持久性事件页:false)还是content_scripts是可行的方法。我已经阅读了所有文档和其他SO帖子,但对我来说仍然没有意义。 有人可以解释为什么我可能会用另一个。 这是我一直在尝试的background.js: 我只是从弹出控制台执行此操作: 我越来越: 更新: content.j

  • 问题内容: 我的Chrome扩展程序有小问题。 我只想从另一台服务器获取JSON数组。但是清单2不允许我这样做。我尝试指定,但是JSON数组存储在没有SSL证书的服务器上。 那么,不使用清单1怎么办? 问题答案: 该CSP不能引起你所描述的问题。您很有可能使用的是JSONP而不是纯JSON。JSONP在Chrome中不起作用,因为JSONP通过在文档中插入标签而起作用,该标签的属性设置为Web服务

  • 问题内容: 我正在为Chrome扩展程序。我希望解析“原始” Gmail邮件(当前查看的邮件)的内容。 我试图利用jQuery.load()如下 并将其放置在内容脚本中,但是它也不起作用。我正在使用Chrome的开发人员工具,该工具会在调用时返回以下错误 未被捕获的ReferenceError:未定义GLOBALS 尽管在使用开发人员工具的控制台时,在控制台中键入它会返回一个数组。 有什么线索如何

  • 问题内容: 我有一个HTML页面,其中有一些用Angular配置的DOM。现在,我正在构建一个chrome扩展程序来修改文本框中的值。由于文本框是使用Angular设计的,因此无法使用。阅读一些资源后,我知道需要对元素的范围进行更改。我尝试在扩展程序中执行此操作。 这似乎无法正常工作。当我更深入地研究问题时,我发现窗口范围内的角度没有得到正确的范围。 我还尝试从扩展名中注入angular.js并直

  • 问题内容: 我想创建一个Google Chrome扩展程序。具体来说,我想制作一个打包的应用程序,而不是一个托管的应用程序。我认为这限制了我使用JavaScript(和HTML / CSS)是否正确? 我的问题是我需要做一些复杂的数学运算(奇异值分解,因子分析),并且我不想在javascript中为此编写算法。Python已经有了我需要的功能的库(SciPy),但是我找不到任何可以使用python

  • 问题内容: 我知道如何在Selenium Webdriver中加载Chrome扩展程序。但是我没有看到任何描述如何从Selenium 运行 chrome扩展的帖子/博客。 我需要明确地使chrome扩展程序运行/使其从selenium中执行其功能。例如,我想使用带有Selenium Webdriver的扩展程序清除Chrome浏览器的缓存。 我可以先做吗?还是Selenium WebDriver仅