chrome 插件开发_易语言谷歌浏览器组件-程序员宅基地

技术标签: chrome  其他  chrome插件  

最近在帮老婆做美国签证,需要填DS-160表,做到最后需要有五页的表需要选择yes和no,大部分客户的信息都选择NO,然后就机械的选择no no no~~~,next,no no no next ~~~no no no ~~~~好烦。既然是机械性的工作,那就用代码实现吧,做一个chrome插件,点击插件图标后本页的选择按钮全部选no,并挑到下一页。

1:

如何实现呢?

首先获取该页面的所有显示在页面的radio按钮

然后筛选出值为no的按钮 点击

再获取下一页按钮 点击


从chrome进入DS-160表Security and Background页,然后在页面上右键"审查元素",如下图



























先选择放大镜,当放大镜变色后选择radio按钮,然后在右边就会找到描述这个按钮的代码,发现该按钮的tag为"input",type为"radio",value为"N".

再用相同的方式看看其他no按钮也是这样的,ok,点击Console. 执行下面的代码

v = document.getElementsByTagName('input');
var vshu = [];
for (var i = 0; i < v.length; i++) {
    if (v[i].getAttribute('type') == 'radio' && v[i].getAttribute('value') == 'N')
    vshu.push(v[i]);

}
查看vshu数组里面的内容,会发现里面存放的就是我们要点击的no按钮对象,然后点击每个对象

 for (var i = 0; i < vshu.length; i++){
	 vshu[i].click();

每个no按钮都点击了,成功。然后用相同的方法 (找到该按钮与其他按钮的不同)获取下一页按钮的对象,点击。

	next = document.getElementsByClassName('next')[0];
 	next.click();

跳转到下一页了,成功。

最终代码

var clickFun = function() {
    v = document.getElementsByTagName('input');
    var vshu = [];
    for (var i = 0; i < v.length; i++) {
        if (v[i].getAttribute('type') == 'radio' && v[i].getAttribute('value') == 'N')
        vshu.push(v[i]);

    }

    for (var i = 0; i < vshu.length; i++) {
        vshu[i].click();

    }
    next = document.getElementsByClassName('next')[0];
    next.click();


}


2:

三个箭头指向的就是chrome插件,做哪个?怎么做?通过查询知道五角星的插件是page action,

另外两个属于browser action,browser action长驻浏览器,page action只有根据需要才会显示,很明显咱的需求要选择page action,因为只有那5个页面才会用到这个插件嘛。

要完成咱的需求,最少要用到4个文件manifest.json,icon.png,background.js,content_script.js

icon.png,要显示的图标,就像上面的那个五角星。

background.js 只在插件加载的时候运行一次,在这里可以用来处理插件本身的一些逻辑,比如监听图标的点击事件。

content_script.js 添加的是与页面交互的代码,比如上面的clickFun 函数。

manifest.json 其他文件可以任意起名字,只有manifest.json是唯一指定了文件名和文件格式的文件,程序会通过manifest.json的配置信息来设定相关内容。

首先是能在特定网页显示图标。

manifest.json

{
    "manifest_version": 2,
    "name": "clickNO",
    "version": "1.0",
    "description": "美国DS-160表 点NO工具",
    "permissions": [
        "tabs", "http://*/*"
    ],
    "page_action": {
        "default_icon": "images/icon.png",
        "default_title": "clickNO"
    },
    "background": {
        "scripts": [
            "javascript/background.js"
        ]
    },
    "content_scripts": [
        {
            "matches": [
		"https://ceac.state.gov/GenNIV/General/complete/*"
            ],
            "js": [
                "javascript/content_script.js"
            ]
        }
    ]
}


background.js

function checkForValidUrl(tabId, changeInfo, tab) {

    if (tab.url.indexOf('ceac.state.gov/GenNIV/General/complete') > -1) {
	if(tab.url.indexOf('SecurityandBackground')>-1 ||tab.url.indexOf('workeducation3')>-1){
        chrome.pageAction.show(tabId);//显示插件图标

	}
    }
}

chrome.tabs.onUpdated.addListener(checkForValidUrl);



content_script.js 文件内容可以为空。将四个文件放到同一个文件夹下,比如MyChromeextensions

然后在chrome地址栏,输入chrome://extensions/,会看到
















点击打包扩展程序,会弹出对话框









扩展程序根目录,选择MyChromeextensions,私有秘钥文件 第一次可以不选择。点击 打包扩展程序后,会在 和MyChromeextensions的同级目录下生成pem文件,当下次打包的时候要在 私有秘钥文件中选择 这个pem文件。同时还生成了crx文件,将crx文件拖到 chrome://extensions/ 页面下就会安装你刚刚打包的插件了。


然后就是监听插件图标点击事件 执行clickFun()函数了。

clickFun()函数是要放到content_script.js文件中的,监听点击函数要放在background.js文件中,两文件之间怎么通信?通过消息传递(Message Passing)。

消息分为三种  one-time requests, long-lived connections, cross-extension messages,而我们需要的是第一种.

background.js文件改为

function onClickListener(tab) {

    chrome.tabs.getSelected(null, 
    function(tab) {
        chrome.tabs.sendMessage(tab.id, {
            greeting: "myChromeExtension"

        },
        function(response) {
            console.log(response.farewell);

        });

    });


}

function checkForValidUrl(tabId, changeInfo, tab) {

    if (tab.url.indexOf('ceac.state.gov/GenNIV/General/complete') > -1) {
        if (tab.url.indexOf('SecurityandBackground') > -1 || tab.url.indexOf('workeducation3') > -1) {
            chrome.pageAction.show(tabId);

            chrome.pageAction.onClicked.addListener(onClickListener);//监听图标点击事件

        }

    }

}

chrome.tabs.onUpdated.addListener(checkForValidUrl);

content_script.js 文件中除了添加clickFun()函数外还要添加接受消息代码

chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
    console.log(sender.tab ? "from a content script:" + sender.tab.url: "from the extension");
    var greetin = request.greetin;
    if (document.getElementsByTagName(greetin).length == 0) {
        var newdiv = document.createElement(greetin);
        document.firstElementChild.appendChild(newdiv);
        clickFun();//执行需求逻辑代码
    }

});

除了执行clicFun函数外,其他代码是干嘛的呢?在测试的过程中,发现点击图标后,会发来两次点击消息,所以在第一次接收到点击消息后创建一个节点, 在节点的子节点列表末添加新创建的这个子节点,当下次点击消息来得时候发现 已经创建过新节点,所以就不执行clickFun函数。



然后就是打包 安装。

完成~~~



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/langzxz/article/details/46493857

智能推荐

阿里云服务器绑定域名及IIS配置访问网站_阿里云服务器部署iis-程序员宅基地

文章浏览阅读436次。注:阿里云网站申请需要进行IPC备案,如果不通过备案仅可本机IP地址访问,其它IP地址访问失败或是提示未进行备案。解决办法:开始菜单-服务器管理器-管理(M)-添加角色和功能-按步骤添加Web服务器(IIs)注:云服务器选择的阿里云windows系统,同时使用的是IIS进行服务器配置。解决办法:清理浏览器缓存后刷新,或是更换成其它浏览器。问题2:关于更改网站内容,刷新仍然保存旧界面。问题1:关于云服务器中没有IIS管理器。_阿里云服务器部署iis

使用vscode开发C#+unity没有代码提示问题_vs code没有c#的提示-程序员宅基地

文章浏览阅读1.9k次,点赞4次,收藏2次。最近在使用VS Code遇到了 OmniSharp 的各种报错导致没有了代码提示。这个问题是由于本身C#的更新版本造成的。1.在设置里搜索 Use Modern Net,取消勾选,重启 VS Code!2.改了依然有错误,提示或Could not locate MSBuild instance to register with OmniSharp.C# extension插件回到1.24.4,同时把Visual Studio Code Editor包升级到1.2.5又可以了。_vs code没有c#的提示

ChatGPT-3.5-Turbo/4.0服务器搭建详细过程_chatgpt3.5 docker部署-程序员宅基地

文章浏览阅读2.2k次,点赞67次,收藏53次。快速搭建起一个属于自己的ChatGPT,直接跟着教程一步一步做即可。_chatgpt3.5 docker部署

hive(一)hive的安装与基本配置_hive安装与配置详解-程序员宅基地

文章浏览阅读2.7w次,点赞24次,收藏283次。一、前提:安装hive所需要的虚拟机环境为虚拟机安装有Hadoop并且集群成功,同时Hadoop需要在启动状态下,同时需要安装有mysql。不需要有zookeeper和HA,由于HA中含有大量进程,启动会占用很多资源,建议不要有HA二、安装步骤:1、上传jar包至/usr/local/soft将hive-3.1.2上传到虚拟机中的/usr/local/soft目录下2、解压并重命名tar -zxvf apache-hive-3.1.2-bin.tar.gz# 重命名mv ap_hive安装与配置详解

浅谈Java NIO

了解Java NIO

Redis底层数据结构之quicklist

QuickList是由多个 ziplist 组成的双向链表,每个 ziplist 存储一定数量的元素。优点:结合了 ziplist 和双向链表的优点,既节省空间,又提升了修改操作的性能。使用场景: 在列表键元素较多或包含较大元素时使用。ziplist补充(ziplist缺点-链式扩容&级联更新)当一个entry被插入的时候,我们需要设置下一个entry中的prevlen字段为新插入entry的长度。

随便推点

项目——交通灯管理系统_城市道路十字路口信号灯控制系统,模拟实现十字路口的信号控制功能。要实现基-程序员宅基地

文章浏览阅读2.1k次。---------------------JavaEE+Android开发、Java培训、期待与您交流! ---------------------- 交通灯管理系统一.交通灯管理项目的需求 模拟实现十字路口的交通灯管理系_城市道路十字路口信号灯控制系统,模拟实现十字路口的信号控制功能。要实现基

Java中的一些编程规范_java代码编写怎么才能看起来不乱 好多大括号-程序员宅基地

文章浏览阅读667次。除此之外,值得强调的是,不管是用两格缩进还是四格缩进,在使用 tab 键进行缩进时要注意缩进格数,因为在不同的IDE,tab键的缩进格数是不一致的,当然IDE也提供了设置tab键的缩进格数来帮助我们解决此问题,所以到底使用空格还是tab可以根据个人习惯选择。但是,将大括号另起一行,也有它的优势,那就是,左右括号可以垂直对齐,哪些代码属于哪一个代码块,更加一目了然。一般可以借助类的信息来简化属性、函数的命名,利用函数的信息来简化函数参数的命。作用域小的变量(比如临时变量),可以适当地选择短一些的命名方式。_java代码编写怎么才能看起来不乱 好多大括号

MySQL数据库分片技术调研_什么是分片技术 mysal-程序员宅基地

文章浏览阅读6.3k次,点赞3次,收藏10次。将这段时间了解的MySQL分片技术和主从复制只是整理一下画了思维导图记录一下,希望能给需要的人一些帮助P.S.:个人整理,可能会有错误之处,还望指出~要解决的问题1、海量数据的操作超出单表、单库的最大限制2、访问压力超出数据库系统限制,性能下降3、数据库复制、容灾等问题解决方案一、采用数据分表分库提高数据库的性能限制1、可选Sharding策略2、Sharding实现的层面可以为: (1)数据访问_什么是分片技术 mysal

tomcat热部署_什么工具可以热部署tomcat-程序员宅基地

文章浏览阅读465次。一、何为热部署目的:少应用程序打包和发布的时间。当一个应用发布在tomcat或者Jboss等容器上时,如果应用程序升级,此时不需要关闭和启动服务器,只需要加载更新之后的jar/war包,就可以更新应用程序。做法:这是Java应用程序是使用classLoader来加载的,在有升级后的应用后,服务器会断开与旧的应用程序的连接,和新的应用重新建立classLoader连接。此时不会影响其他应用的正常..._什么工具可以热部署tomcat

10大Firefox浏览器必备插件[转]-程序员宅基地

文章浏览阅读595次。Firefox浏览器是 目前最好用的浏览器产品,当微软IE浏览器因为安全问题补丁不断,当Google Chrome浏览器因为云计算太超前而生不逢时,Firefox就成了最好的选择。但是,没装插件的Firefox就如同不穿衣服的美女,上网冲浪总觉得 少点什么。所以,再此整理并隆重推荐10大Firefox浏览器必备插件,这些插件源自于Mozilla官方附加组件网站,都经过实际测试并使用半年以上,适用范..._火狐十大必用插件

解决Could not find com.android.tools.build:aapt2:3.2.0问题-程序员宅基地

文章浏览阅读4.9k次,点赞2次,收藏4次。前言:在导入一个demo出现该问题,问题点是Android studio3.2版本以后,AAPT2 (Android Asset Packaging Tool 2)的源代码就是谷歌的Maven存储库。要使用AAPT2,请确保构建中有一个谷歌()依赖项gradle文件如下:buildscript { repositories { jcenter() ma..._could not find com.android.tools.build:aapt2:3.2.0-4818971.

推荐文章

热门文章

相关标签