可以自动点击网页按钮的 Chrome 插件(manifest_v3 20241008)

news2024/11/23 15:42:54

这是我针对一个 vue 单页应用做的自动点击插件。他可以在这个 vue 单页应用的某一个子页面加载时,自动点击页面上的按钮。

分享那个这个案例的意义在于,vue 单页应用不同于一般的网页,他有很多事件是不触发的,需要自己想办法处理。在这里要感谢“智谱清言”,只要问题问的够明确,他就可以帮助写出代码。

本项目包含如下几个文件:

background.js 代码如下:


chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
  if (changeInfo.status === 'complete') {
      console.log(`插件:Tab ${tab.url} has completed loading.`);    
      
      // 发送消息给对应的tab的contentscript
      chrome.tabs.sendMessage(tabId, "插件:background消息", function(response) {
        // 处理来自contentscript的响应(如果需要)
        console.log('插件:Response from contentscript:', response);
      });   
  }
   
});

content-script1.js 代码如下:

// 这个函数的运行过程要去网页端 console 去看
// 获取当前时间
var currentTime = new Date();
var currentHour = currentTime.getHours();
var currentMinute = currentTime.getMinutes();
var currentSecond = currentTime.getSeconds();
console.log('插件------------------');
console.log('插件开始执行。当前时间:' + currentHour + ':' + currentMinute + ':' + currentSecond);

function checkURL(url){
    // console.log('插件:checkURL:'+url);
    var flag = false;
    if(typeof url == "undefined" || null == url)
        url = window.location.href; 
	// var regex = /.*\:\/\/.*\/form.php/;
	// var regex = /https\:\/\/.*pretreatment.*/;
    var regex = /http\:\/\/.*\/#\/basic\/list\?type=1/;
    var match = url.match(regex);
    if(typeof match != "undefined" && null != match) {
        console.log('插件:匹配到待签收页面。');
        flag = true;
    }
    return flag;
}

function getCurrentTab(){
    return window.location.href;
}

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

class XFXS_filter{
    constructor() {
    }

    find_inputButton(){        
        this.XFXS_input = document.evaluate('//label[contains(text(),"形")]/following-sibling::div/div/div/input', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
        if (this.XFXS_input == null){
            // console.log('插件:XFXS_input为空。');
            return null;
        } else {
            // console.log('插件:XFXS_input不为空。');
            // console.log(this.XFXS_input);
            return this.XFXS_input;
        }
    }

    changeColor_XFXS() {
        // 修改背景色
        // 查找所有具有指定类名的div
        var divs = document.querySelectorAll('div.el-form-item.el-form-item--mini');
        // 过滤出包含innerText为"事项"的label的div
        var targetDiv = Array.from(divs).find(function(div) {
            return Array.from(div.querySelectorAll('label')).some(function(label) {
                return label.innerText.includes("xing");
            });
        });
        // console.log('插件:targetDiv:');
        // console.log(targetDiv); // 输出找到的div元素,如果没有找到则为undefined
        targetDiv.style.backgroundColor = "red";
        
        var labels = document.querySelectorAll('label.el-form-item__label');
        for (var i = 0; i < labels.length; i++) {
            // 检查 innerText 是否为“形”
            if (labels[i].innerText === '形') {
                // 如果是,则执行相应操作,例如打印出来或者修改样式
                // console.log('插件:targetlabel:');
                // console.log(labels[i]);
                // 例如,将找到的 label 文本颜色设置为蓝色
                labels[i].style.color = 'yellow';
            }
          }
    }

    async click_to_find_listnode(){
        this.XFXS_input.click();
        let sleep_gap = 150;
        await sleep(sleep_gap);
        
        this.XFXS_dropdown_w = document.evaluate('//div[contains(@style, "position: absolute")]/div[@class="el-scrollbar"]/div/ul/li/span[text()="网"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
        this.ChaXun = document.evaluate('//span[@class="btn matters" and text()="询"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
        
        this.XFXS_dropdown_w.click();
        await sleep(sleep_gap);
        console.log('插件:已点击。');
        this.ChaXun.click();
        await sleep(sleep_gap);
        console.log('插件:点选按钮结束。');
    }
}

function inputValue(dom, st) { 
    var evt = new InputEvent('input', { 
        inputType: 'insertText', 
        data: st, 
        dataTransfer: null, 
        isComposing: false 
    }); 
    dom.value = st; 
    dom.dispatchEvent(evt); 
} 

chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
    console.log('插件:Received details:'+message);
    sendResponse({msg: "插件:content_script_response"});   
    console.log('插件:check_action 开始。');
    if (checkURL(getCurrentTab())) {
        var XFXS_filter_instance = new XFXS_filter();
        XFXS_filter_instance.find_inputButton();
        if ( null != XFXS_filter_instance.XFXS_input && XFXS_filter_instance.XFXS_input.value == '' ){
            console.log('插件:XFXS_filter_instance.XFXS_input 找到了且值为空。');
            // console.log(XFXS_filter_instance.XFXS_input);
            XFXS_filter_instance.changeColor_XFXS();
            XFXS_filter_instance.click_to_find_listnode();
        } else {
            console.log('插件:XFXS_filter_instance.XFXS_input 没找到或有值。');
        }
    }
 });
  
  
document.addEventListener("DOMContentLoaded", function() {
    var xpathExpression = "//*[contains(@style, 'position: absolute')]";
    var result = document.evaluate(xpathExpression, document, null, XPathResult.ANY_TYPE, null);
    var node;
    while (node = result.iterateNext()) {
        // 这里可以对找到的每个节点进行处理
        console.log("插件:发现一个可见节点。"); // 例如,打印节点
    }
});

manifest.json 的代码如下:


{
  "manifest_version": 3,
  "name": "助手",
  "description": "辅助",
  "version": "1.0",
  "host_permissions": [ "http://11.11.11.11/" ],
  "permissions": [
    "tabs",
    "activeTab",
    "scripting",
    "webRequest",
    "webRequestBlocking"
  ],
  "background": {
    "service_worker": "background.js"
  },
  "content_scripts": [
    {
      "matches": ["http://11.11.11.11/"],
      "js": ["content-scripts1.js"]
    }
  ],
  "action": {
    "default_icon": "Bw.png",
    "default_title": "辅助",
    "default_popup":"usr_input.html"
  }  
}

写几点经验:

1、调试时 background.js 的 console.log 的输出可以在浏览器插件页面(如下图的按钮点进去)中看到。content-script1.js 的日志输出是在网页打开后,打开“开发者工具”的控制台,里面可以看到。因为content-script1.js 是注入到特定网页的。


2、本项目涉及到的这个 vue 单页应用的网址中是包含“#”号的。但是子网页变化时,它并不触发onoad、onhashchange 事件。所以这里使用了 onUpdated 事件。在 manifest.json 配置文件中,想在网址中填带“#”的网址也是没用的,插件不支持。所以就直接填“#”前面的网址了。

3、学习插件最快的方式还是看官方 文档 。先了解全貌,然后才能向 AI 问出有针对性的问题,AI 才能直接给出准确的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2197977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

下一个赛场见!从中网看海尔智家的全球化布局

下一个赛场见&#xff01; 我想这是每个看完中国网球公开赛女子决赛后&#xff0c;清晰又坚定的约定。正如国庆假期后&#xff0c;下一个假期见成为很多人的期待。 10月6日&#xff0c;备受瞩目的中国网球公开赛女子决赛迎来了最高光时刻并落下帷幕。 美国选手高芙获得冠军&…

aws(学习笔记第四课) AWS的IAM服务,用于授权的策略,用户和组以及角色

aws(学习笔记第四课) AWS的IAM服务&#xff0c;用于授权的策略&#xff0c;用户和组以及角色 学习内容&#xff1a; AWS的IAM服务用于AWS授权的策略用于认证AWS的用户和组用于认证AWS的角色 1. AWS的IAM服务 IAM用户&#xff0c;角色的区别 IAM用户服务 Identity and Access…

5.k8s:helm包管理器,prometheus监控,elk,k8s可视化

目录 一、Helm 包管理器 1.什么是 Helm 2.安装Helm &#xff08;3&#xff09;Helm常用命令 &#xff08;4&#xff09;目录结构 &#xff08;5&#xff09;使用Helm完成redis主从搭建 二、Prometheus集群监控 1.监控方案 2.Prometheus监控k8s 三、ELK日志搜集 1.el…

快速学习开源 Docker 镜像仓库 Harbor

Harbor 是由 VMware 公司开源的企业级容器镜像仓库&#xff0c;用于存储、管理和分发 Docker 容器镜像。它构建在开源的 Docker Registry 之上&#xff0c;通过添加一系列企业级功能&#xff0c;如安全、身份验证、访问控制和审计等&#xff0c;满足企业在容器化应用部署中的复…

gaussdb hccdp理论考试总结

判断题1分&#xff0c;单选题2分&#xff0c;多选题3分 共50道题&#xff0c;满分100分&#xff0c;60分通过。 理论考试知识点占比&#xff1a; 理论考试参考策略&#xff1a; 1.7张PPT看一遍 2.思考题做一遍 3.模拟题做一遍 4.7张PPT再看一遍 5.考题知识点过一遍 6.考试前一…

【LeetCode: 1436. 旅行终点站 | 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【动态规划-最长递增子序列(LIS)】力扣673.最长递增子序列的个数

给定一个未排序的整数数组 nums &#xff0c; 返回最长递增子序列的个数 。 注意 这个数列必须是 严格 递增的。 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列&#xff0c;分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。 示例 2: 输入: [2,2,2,2,2] 输出: 5 解释:…

基于SpringBoot在线拍卖系统【附源码】

基于SpringBoot在线拍卖系统 效果如下&#xff1a; 网站首页界面 用户登录界面 竞拍商品界面 管理员登录界面 管理员功能界图 竞拍商品界面 系统界面 订单界面 研究背景 随着社会的发展&#xff0c;信息化时代带来了各行各业的变革。电子商务已成为人们日常生活不可或缺的一…

ES(Elasticsearch)SSL集群部署

8.x后ES不在需要自行准备JDK环境&#xff0c;部署的服务包含ES、Kibana、Logstash&#xff0c;使用二进制方式部署&#xff0c;为了提高安全性&#xff0c;加密logstash、kibana及其他客户端到ES间的通信。 1、准备工作 1.1、 es无法使用root用户启动 useradd -m -s /bin/bas…

搭建安全的分析环境

分析恶意软件&#xff0c;动态行为分析是必不可少的一步&#xff0c;所有样本都必须在虚拟环境中执行&#xff0c;不可在主机上执行。因此&#xff0c;我们要需要搭建供动态分析的环境以及防止在主机运行的环境。 动态分析环境搭建 工具 虚拟机 虚拟机软件有很多&#xff0…

前端面试:项目细节重难点问题分享(17)

更多详情&#xff1a;爱米的前端小笔记&#xff08;csdn~xitujuejin~zhiHu~Baidu~小红shu&#xff09;同步更新&#xff0c;等你来看&#xff01;都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们…

案例分享—国外ui设计优秀案例

国外企业更注重用户体验设计&#xff0c;倾向于简洁清晰的设计风格&#xff0c;以提高用户的使用体验和操作效率。他们注重“简约至上”的设计理念&#xff0c;认为简洁的设计可以减少用户的认知负担&#xff0c;提高用户的工作效率。 设计师在界面设计中往往更加注重创意性和个…

Stable Diffusion绘画 | IP角色多视图生成技巧

在游戏设计、小说推文、角色设计里面&#xff0c;很多场景都运用到IP角色的多视图。 人物角色多视图 第1步&#xff0c;输入提示词&#xff1a; 第2步&#xff0c;由于要在同一张图片中生成多角度的并排展示&#xff0c;需要修改图片的分辨率&#xff08;尤其是宽度&#xff…

Vue 3 + TypeScript + Vite + Echarts

Vue 3 TypeScript Vite Echarts 1、创建工程 npm create vitelatestcd echarts npm install npm run dev2、安装项目依赖模块 npm install types/node --save-devnpm install vue-router4npm install animate.css --save npm install gsap --savenpm install fetch --save…

LayaAir3.2正式版来了:支持鸿蒙Next系统、程序蓝图(可视化编程)等重要的功能模块...

LayaAir3.2-beta.1的版本中&#xff0c;我们已介绍了3.2是真正的全平台发布版本《LayaAir3.2来了&#xff1a;性能大幅提升、一键发布安装包、支持WebGPU、3D导航寻路、升级为真正的全平台引擎》。 在其后的beta版本迭代中&#xff0c;我们不仅及时修复了开发者们反馈的BUG&…

知识改变命运 数据结构【java对象的比较】

0&#xff1a;前言 在基本数据类型中&#xff0c;我们可以直接使用号比较是否相等&#xff0c;还记的学堆哪里时候&#xff0c;插入一个数据&#xff0c;就会与其他数据进行比较&#xff0c;当时我们传入的是Integer类型&#xff0c;在Integer类里面已经实现了compare。 如果…

Ubuntu22.04 获取docker 镜像失败如何处理

最近在使用docker 获取镜像发现 如下错误 无法正常的访问 如果能正常上网的情况下&#xff0c;可以尝试如下操作 首先进入/etc/docker/daemon.json文件 然后在里面加入下面的配置 { "registry-mirrors": ["https://docker.registry.cyou", "htt…

探索杨辉三角形的奥秘:C#实现

文章目录 杨辉三角形简介特点 C#实现杨辉三角形环境准备代码实现代码解释1. 用户输入2. 输入验证3. 初始化第一行4. 生成杨辉三角形5. 打印杨辉三角形 结论 杨辉三角形&#xff0c;也被称为帕斯卡三角形&#xff0c;是一个历史悠久且充满数学魅力的数字模式。它不仅在数学领域有…

论文速读:基于概率教师学习的域自适应目标检测

原文标题&#xff1a;Learning Domain Adaptive Object Detection with Probabilistic Teacher 中文标题&#xff1a;基于概率教师学习的域自适应目标检测 代码地址&#xff1a; GitHub - hikvision-research/ProbabilisticTeacher: An official implementation of ICML 2022 p…

【计算机毕设】springboot-家具销售电商平台(附源码)

摘 要 Abstracts 目 录 第1章 绪论 1.1课题背景 1.2研究意义 1.3研究内容 第2章 技术介绍 2 2.1相关技术 3 2.2 Java技术 3 2.3 MySQL数据库 4 2.4 Tomcat介绍 4 2.5 Spring Boot框架 5 第3章 需求分析 5 3.1需求分析概述 6 3.2可行性分析 6 3.2.1经济可行性 6 3.2.2技…