当我点击图标时,如何创建自动填充用户名/密码的Google Chrome扩展程序?

时间:2014-03-12 07:42:03

标签: javascript google-chrome google-chrome-extension autofill password-encryption

到目前为止,我无法弄清楚我的代码出了什么问题,因为当我点击图标时,它表示我同时运行了background.js和autofill.js。但是不会自动填充gmail站点。这是我的第一个chrome扩展以及使用javascript。我的最终目标是它可以自动填充所有站点(不仅仅是gmail),并能够存储/读取.txt文件中的所有密码。另一件事是,当我尝试运行此代码时,我的autofill.js文件出现问题,并且给出了错误“未捕获的TypeError:无法设置属性'的值为null。这是针对autofill.js的正确评论//填写您的用户名和密码。 感谢您抽出宝贵的时间帮助我,任何输入都会对我有所帮助,因为我被困在墙上

的manifest.json:

   {
  "name": "Test",
  "manifest_version": 2,    
  "version": "1.0",
  "description": "This is a Chrome extension that will autofill passwords",
  "browser_action": {
    "default_icon": "icon.png",     
    "default_popup":"popup.html",
    "default_title": "PasswordFill" 
  },


//********************************************************************* 
//declaring the permissions that will be used in this extension

 "permissions": ["*://*.google.com/", "tabs", "activeTab", "*://*.yahoo.com/"],

  "background": {
    "scripts": ["background.js", "autofill.js"] 
  },


//********************************************************************* 
/* Content scripts are JavaScript files that run in the context of web pages. By using the standard Document Object Model (DOM), they can read details of the web pages the browser visits, or make changes to them */

"content_scripts": [
    {

//Specifies which pages this content script will be injected into
    "matches": ["https://accounts.google.com/ServiceLoginAuth"], 

//The list of JavaScript files to be injected into matching pages
    "js": ["autofill.js"], //was background.js

//Controls when the files at "js" are being injected
    "run_at": "document_end",

    "all_frames": true
    }
]


}

background.js:

     console.log("Background.js Started .. "); //for debug purpose so i can see it in the console log

    chrome.browserAction.onClicked.addListener(function (tab) { //Starts when User Clicks on ICON



      chrome.tabs.executeScript(tab.id, {file: 'autofill.js'});

      console.log("Script Executed .. "); // Notification on Completion
    });

autofill.js:

console.log("Autofill.js Started .. "); //for debug purpose so i can see it in the console log

//define username and password

var myUsername = 'McAfee.sdp';

var myPassword = 'baskin310';





//finds the fields in your login form

var loginField = document.getElementById('Email');

var passwordField = document.getElementById('Passwd');





//fills in your username and password

loginField.value = myUsername;

passwordField.value = myPassword;





//automatically submits the login form

var loginForm = document.getElementById ('signIn');

loginForm.submit();

1 个答案:

答案 0 :(得分:0)

您应该先花一些时间阅读开发guides。确保您了解debugging扩展的工作原理。

此外,作为一般规则,如果您的脚本在某些代码行崩溃,执行将停止,并且扩展很可能在您想要它做的任何事情上失败(取决于崩溃发生的位置) - 就像任何代码一样其他申请。

  

“未捕获的TypeError:无法将属性'value'设置为null。

该错误告诉您正在尝试“访问”(设置)“缺失”(null)对象的属性。 loginField.value = myUsername;尝试访问value loginField,因此您可以轻松推断loginField为空,这反过来意味着var loginField = document.getElementById('Email');无效。但是不要相信我的话,学会自己调试它。

为什么它失败是一个不同的故事:扩展是“沙盒化的”,并且无论何时他们想要改变页面内容都无法运行 - 你有“内容脚本”。返回文档并阅读overviewcontent scripts sections

在您的具体案例中:

  • 唯一的后台脚本文件应该是background.js;删除autofill.js
  • 尽可能使用事件页面而不是后台页面
  • autofill.js是一个内容脚本,您已将其添加到清单中。无需使用chrome.tabs.executeScript
  • 进行程序注射
  • 了解如何在背景/工具栏和内容脚本之间进行通信 - 您需要它
  • 您的扩展程序需要获得访问`chrome.tabs。*的权限。所以将“标签”添加到扩展程序清单中的权限列表