内容脚本未在新窗口中执行

时间:2017-03-11 04:21:07

标签: javascript google-chrome google-chrome-extension

我正在尝试创建一个Chrome扩展程序,单击该扩展程序后会打开一个新的隐身窗口并对其执行一些DOM操作。这些是我使用的文件:

的manifest.json

{
 "manifest_version": 2,

  "name": "SampleExtension",
  "description": "",
  "version": "1.0",
  "incognito": "spanning",

  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },

  "content_scripts": [
    {
      "matches": ["http://www.google.com"],
      "js": ["myscript.js"]
    }
  ],

  "permissions": [
    "tabs",
    "activeTab",
    "http://www.google.com"
  ]
}

popup.js

chrome.windows.create({
    "url": "http://www.google.com", 
    "focused": true, 
    "incognito": true
});

chrome.tabs.executeScript(null, {
    "file": "myscript.js", 
    "run_at": "document_end", 
    "all_frames": true
});

myscript.js

document.querySelector('a[target]').click();

扩展程序会打开新窗口,但我的内容脚本似乎没有执行。有什么想法吗?

修改:在清单中添加了"incognito": "spanning"。但是,仍然无法正常工作。

1 个答案:

答案 0 :(得分:0)

首先,我了解您已启用隐身模式。默认情况下会禁用扩展名,因此不会以其他方式运行。

其次,您的匹配模式需要以斜杠结尾:

"matches": ["http://www.google.com/"],

第三,Google会将您重定向到其https版本,因此我会像这样改进match pattern

"matches": ["*://www.google.com/"],

但是,当我被重定向到我当地的Google域名时,它对我无效。因此,我必须添加更多:

"matches": [
    "*://www.google.com/*",
    "*://www.google.com.sg/*"
  ],

另外,我添加了最终的通配符,因为Google正在添加一些我必须匹配的urlParams。这使它成功了。请注意,我尝试使用其他网页,例如"*://www.stackoverflow.com/*",,这比Google更容易:)

如果您的Google网页只是一个测试,我建议您使用一些较少重定向的网页进行测试。

最后一点:我认为不可能为域使用通配符(我试过)。但是,您可以请求所有主域,或请求all_pages,然后仅在my_script.js上添加Google的逻辑,以决定是否执行操作。 (但是,最后一篇文章并不理想)。

编辑帖子评论:

似乎你的函数失败了,因为元素尚未加载。解决此问题的一种简单方法是通过执行间隔来检查元素是否在页面上。找到它后,单击它并删除间隔。

// Function which clicks element if existing and clears interval after doing it.
var clickLink = function() {
  if (document.querySelectorAll('a[target]').length > 0) {
    clearInterval(waitAndClick); // stop interval
    document.querySelector('a[target]').click(); // click element.
  }
}

// Run click function every second, until it clicks it.
var waitAndClick = setInterval(clickLink, 1000);