Google Chrome扩展程序和document.getElementbyId()。click()

时间:2019-01-09 23:38:36

标签: javascript google-chrome-extension

长期读者,第一次提问。在尝试解决这个问题时,我遇到了很多类似的问题,但是对于我自己的一生,我只是无法启动并运行它。我并没有做太多的Java脚本,所以当我阅读许多文档链接时,我不能总是把头放在这上面。

我公司的供应商之一在我公司的自定义域上有一个"Sign in with Google"按钮。我们使用Google身份,因此我们总是有一个活动的Google会话,但是供应商说必须单击该按钮。我认为创建一个Chrome扩展程序很容易,只要我们进入供应商页面,该扩展程序就会单击该按钮。

在开发工具的控制台中,我可以运行以下行,这将激活按钮并启动身份验证流程,因此这部分是手动工作的:

document.getElementById('googleSignInButton').click();

我尝试了几种不同的解决方案,所以我的'manifest.json','background.js'和'ClickButton.js'有点跷,抱歉。

manifest.json

{
  "name": "ClickButton",
  "version": "1.0",
  "description": "Clicks Sign in with Google Button",
  "background": {
      "scripts": ["background.js"],
      "persistent": false
   },
  "permissions": ["declarativeContent", "webNavigation", "tabs", "https://www.vendor.com/"],
  "browser_action":{
    "default_title": "Title"
  },
  "content_scripts": [
   {
     "matches": ["http://www.vendor.com/*"],
     "all_frames": true,
     "run_at": "document_end",
     "js": ["ClickButton.js"]
   }
 ],
  "manifest_version": 2
}

background.js

//When I run this code in background.js it works as it requires me to click the plugin button
//Clicking the plugin button will run ClickButton.js and it will activate the "googleSignInButton"
/*
chrome.browserAction.onClicked.addListener(function (tab) {
    chrome.tabs.executeScript(tab.ib, {
        file: 'ClickButton.js'
    });
});
*/

//This is the chunk of code pulled from Google's Getting Started Tutorial https://developer.chrome.com/extensions/getstarted
//This will load ClickButton.js when I am just running alert. It also loads the ClickButton.js when I am actually trying to click the "googleSignInButton"

chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
      chrome.declarativeContent.onPageChanged.addRules([{
        conditions: [new chrome.declarativeContent.PageStateMatcher({
          pageUrl: {hostEquals: 'www.vendor.com'},
        })
        ],
            actions: [new chrome.declarativeContent.RequestContentScript({js: ["ClickButton.js"]})]
      }]);
});

ClickButton.js

document.getElementById('googleSignInButton').click();

//When I am just running an alert, this pops up when I navigate to my vendor's page, so JS should be getting injected
/*alert ("Test");*/

我尝试了许多不同类型的故障排除。从background.js和ClickButton.js可以看到,我已经注释掉了一些测试。当我使用chrome.browserAction.onClicked时,我可以手动启动javascript以单击按钮,但这正是我要避免的事情。

使用chrome.declarativeContent.PageStateMatcher(即不手动单击扩展名)时在扩展名中出现的错误是:

Uncaught TypeError: Cannot read property 'click' of null

据我所知,这意味着扩展尝试运行时可能未加载DOM。这就是为什么我同时尝试了document_idle(按Content Scripts documentation)和document_end的原因,以为DOM尚未准备好。我也尝试过setTimeout只是为了等待它,但是没有以上错误它仍然无法运行。

我还引用了Dan Harper的bare minimum Chrome extension.,当我单击按钮时可以运行他的Javascript:

(function() {

    // just place a div at top right
    var div = document.createElement('div');
    div.style.position = 'fixed';
    div.style.top = 0;
    div.style.right = 0;
    div.textContent = 'Injected!';
    document.body.appendChild(div);

    alert('inserted self... giggity');

})();

但是当我尝试使其在页面上运行时,我得到了错误:

Uncaught TypeError: Cannot read property 'appendChild' of null

这让我认为在这种情况下,document.body.appendChild(div)可能存在问题,并且可能是扩展尝试在加载所有内容之前运行。

这可能是一个权限问题,脚本无法访问页面上的“ googleSignInButton”。据我所知,我试图在manifest.json中设置对供应商网站的权限。

很抱歉,我的提问时间太长!但是,我确实一直在尝试许多不同的方法来使它起作用,并且我已经做了很多Google搜索。我只是想不通。希望有人可以提供帮助。

非常感谢您!

0 个答案:

没有答案