【问题标题】:Content script not executing in new window内容脚本未在新窗口中执行
【发布时间】:2017-03-11 13:04:03
【问题描述】:

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

ma​​nifest.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" 添加到清单中。但是还是不行。

【问题讨论】:

  • 你必须在chrome://extensions上以隐身模式启用你的扩展
  • 谢谢。试过了。似乎仍然没有执行。
  • 尝试在清单中添加密钥:developer.chrome.com/extensions/manifest/incognito
  • 在清单中添加了"incognito": "split"。还是不行。
  • 从头开始。成功了"incognito": "spanning"。但是没有区别。

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


【解决方案1】:

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

其次,你的匹配模式需要以斜线结尾:

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

第三,谷歌会将你重定向到它的 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 的逻辑,以决定是否执行该操作。 (不过,这最后一块并不理想)。


编辑帖子 cmets:

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

// 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);

【讨论】:

  • 谢谢。我打开的实际 URL 不是 Google。 :P 我确实在匹配模式的末尾添加了斜杠,但它仍然无法正常工作。而且该页面肯定不会被重定向到其他地方。
  • 这对我有用。您正在打开哪个页面,您的匹配模式是什么?您是否在隐身模式下启用了扩展程序?我还建议你做一个 alert('hello');以确保它不会触发:)
  • 优秀。内容脚本似乎正在执行。但是 DOM 元素上的 click 似乎不起作用 - 我收到 Uncaught TypeError: Cannot read property 'click' of null 错误。这可能是因为脚本在 DOM 完全加载之前执行。但这不应该由chrome.tabs.executeScript()"run_at": "document_end" 键来处理吗? click 在页面加载后在控制台上手动尝试时有效。
  • 是的,如果您在命令行上运行该选择器,则存在一个元素,这意味着该元素未加载。一种方法是执行 setInterval(); // Function which clicks element if existing and clears interval after doing it. var clickLink = function() { if (document.querySelectorAll('a[target]').length > 0) { document.querySelector('a[target]').click(); // click element. clearInterval(waitAndClick); } } // Run click function every second, until it clicks it. var waitAndClick = setInterval(clickLink, 1000);
  • 是的,我做了一个类似的 hacky setTimeout 以确保页面完全加载。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多