使用 nutjs实现前端RPA需求

news2024/9/24 17:10:34

nutjs 相关概念

nut.js 是 Node.js 的桌面自动化框架,我们可以使用 js / ts 来控制鼠标和键盘,来模拟人的操作完成一系列动作。它主要分为以下三块内容:

  • Keyboard
  • Mouse
  • Screen

Keyboard 常用 API

  • type: 它允许我们输入 键 或 字符串:下面我们通过代码 调用 全局搜索框 打开 `calculator.app。

代码也比较简单,相信大家也都能看懂,下面给大家看下 Key 里面都有哪些值:

  • pressKey && releaseKey:两者需要搭配使用,表示 按下不放 --> 释放 的一个过程,联动起来就跟 type 一样了:下面我们通过代码 模拟 command + tab 键 切换应用程序。

它允许通过移动光标、点击鼠标按钮或执行拖动手势来模拟鼠标输入。

下面代码运行效果在屏幕录制时显示不出来鼠标移动,就不能给大家贴图演示了

  • move:控制鼠标移动,我比较常用它里面的入参 有以下几个方法:1、straightTo:它接收一个目标点,类似这样:straightTo(new Point(500, 350)),所以 鼠标轨迹也就是从当前位置到目标位置点的直线距离,可以通过 mouse.config.mouseSpeed 设置 鼠标移动的速度:const { mouse, straightTo, Point } = require("@nut-tree/nut-js");(async () => {mouse.config.mouseSpeed = 2000;const fast = new Point(500, 350);await mouse.move(straightTo(fast));mouse.config.mouseSpeed = 300;const slow = new Point(100, 150);await mouse.move(straightTo(slow));})(); 2、left right up down:表示 以当前鼠标位置向【左】【右】【上】【下】移动 x 个像素。const { mouse, left, right, up, down } = require("@nut-tree/nut-js");(async () => {await mouse.move(left(500));await mouse.move(up(500));await mouse.move(right(500));await mouse.move(down(500));})(); 3、click:模拟鼠标的点击,类似这样:await mouse.click(Button.LEFT)Screen 常用 API

它允许 搜索和等待屏幕上的图像,以验证某些条件,或者进一步使用它们 处理后续逻辑。比如:等目标图片 识别成功后,就可以认为页面已经加载出来了,就可以执行后续的操作了。

  • config 的一些配置:1、confidence:指定识别并匹配目标图片的百分比,当设置的值低于匹配值的时候,就意味着匹配成功了,像这样:screen.config.confidence = 0.98 表示匹配度高达 98% 才意味是成功的。2、resourceDirectory:可以设置 所要识别目标图片的路径前缀,例如:screen.config.resourceDirectory = "/path/to/my/template/images"3、capture && captureRegion :截取当前屏幕保存为截图,两者的区别就是 后者可以设置 截取 的区域;我常把它用在抛出异常或报错后,生成以 报错信息和时间 命名的图片到指定目录,方便我们以后定位排查问题;使用起来也比较简单,这里以 captureRegion 为例:<img src=“https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ca61ec3a9a294e658fd1468c69ac3920~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image?)4、find:查找目标图片,第一个参数就是 调用 imageResource 去解析图片资源,第二个参数是一个配置项 OptionalSearchParameters,里面可以设置 searchRegion, confidence 等参数。await mouse.move(straightTo(centerOf(screen.find(imageResource("image.png"), new OptionalSearchParameters(searchRegion, confidence, searchMultipleScales, signal))))) 5、waitFor:和 find 功能相似,它允许我们匹配失败后重试,如下面代码 意思是 失败后 会在 3s 内 每隔 500ms 重试一次,直到 3s 过后才返回匹配结果(成功/失败)await mouse.move(straightTo(centerOf(screen.waitFor(imageResource("image.png"), 3000, 500)))); 6、highlight:当我们 使用上面方法匹配到目标元素后,可以调用 此方法来显示高亮;可见 匹配度还是比较低的,当 Best match > your config confidence 会匹配失败报错,所以大家在用这块的时候要调好匹配值QQ20221118-191715-HD_1.gif小试牛” style=“margin: auto” />
    ====

上面已经介绍了一些常用的API,下面我们实现一个小需求:执行代码打开 备忘录,新建一个备忘录,写入一些文案

这是我们提前准备好要识别的截图,检测成功后便于后续操作

const { screen, keyboard, straightTo, sleep, centerOf, mouse, imageResource, Key } = require("@nut-tree/nut-js");
require("@nut-tree/template-matcher");

(async () => {keyboard.config.autoDelayMs = 150;screen.config.autoHighlight = true;screen.config.highlightDurationMs = 1000; await mouse.move(straightTo(centerOf(screen.waitFor(imageResource("./log/notes.jpg"), 20e3, 5e2))));await mouse.leftClick();await mouse.move(straightTo(centerOf(screen.waitFor(imageResource("./log/createNote.png"), 20e3, 5e2))));await sleep(1e3);await mouse.leftClick();await keyboard.type("今日学习 nutjs 相关知识点") ;await keyboard.type(Key.Return);await keyboard.type("1、screen 相关的API");await keyboard.type(Key.Return);await keyboard.type('2、Mouse 相关API');await keyboard.type(Key.Return);await keyboard.type('3、Keyboard 相关API');
})(); 

上面代码运行效果如下:

在这里还想再写一个案例就是自动打开浏览器,使用 百度搜索引擎 搜索相关内容,跟上面代码也比较类似,所以这块就不写了。

最后

个案例就是自动打开浏览器,使用 百度搜索引擎 搜索相关内容,跟上面代码也比较类似,所以这块就不写了。

最后

上面只是小玩一下,真正开发需求要比这个复杂的多,在错误捕获这块要下很大的功夫,这也是我们在踩坑的😖,下次给大家再分享些。

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

linux013之文件和目录的权限管理

用户、组、文件目录的关系&#xff1a; 简介&#xff1a;用户和组关联&#xff0c;组合文件目录关联&#xff0c;这样就实现了用户对文件的权限管理。首先来看一下&#xff0c;一个文件或目录的权限是怎么查看的&#xff0c;ls -l&#xff0c; 如下&#xff0c;这个信息怎么看呢…

71. Python 库与模块

71. 库与模块 文章目录71. 库与模块1. Python 就是一个解释器2. 什么模块3. 什么是包5. 什么是库6. 形象理解模块与库7. 库的分类1. 标准库2. 第三方库8. 总结1. Python 就是一个解释器 我们把程序员编写的代码形象理解为写了一个纯文本文件。 我们希望这个文本文件能被计算机…

锁相环(1)

PLL代表相位锁定环。顾名思义&#xff0c;如下图所示&#xff0c;PLL是一种具有反馈循环的电路&#xff0c;可将反馈信号的相/频率保持与参考输入信号的相/频率相同&#xff08;锁定&#xff09;。 如下图所示&#xff0c;如果参考输入和反馈输入之间存在相位差&#xff0c;则…

是德Keysight E4991A/e4991B射频阻抗/材料分析仪

Keysight E4991A 射频阻抗/材料分析仪提供终极阻抗测量性能和强大的内置分析功能。它将为评估 3 GHz 范围内组件的组件和电路设计人员的研发提供创新。E4991A 使用 RF-IV 技术&#xff0c;而不是反射测量技术&#xff0c;可在宽阻抗范围内进行更精确的阻抗测量。基本阻抗精度为…

在屎山代码中快速找到想要的代码法-锁表法(C#)

由于本人水平有限&#xff0c;文中有写得不对的地方请指正&#xff0c;本文的方法有些投机取巧&#xff0c;实在是没招的情况下可以酌情使用&#xff0c;如有侵权&#xff0c;请联系删除。 前几天接到一个需求&#xff0c;要在医嘱签署时对检验项目进行分方操作&#xff0c;分…

Linux Socket Buffer介绍

一. 前言 Linux内核网络子系统的实现之所以灵活高效&#xff0c;主要是在于管理网络数据包的缓冲器-socket buffer设计得高效合理。在Linux网络子系统中&#xff0c;socket buffer是一个关键的数据结构&#xff0c;它代表一个数据包在内核中处理的整个生命周期。 二. Socket Bu…

2.5|iot|第1章嵌入式系统概论|操作系统概述|嵌入式操作系统

目录 第1章&#xff1a; 嵌入式系统概论 1.嵌入式系统发展史 2.嵌入式系统定义* 3.嵌入式系统特点* 4.嵌入式处理器的特点 5.嵌入式处理分类 6.嵌入式系统的应用领域及嵌入式系统的发展趋势 第8章&#xff1a;Linux内核配置 1.内核概述 2.内核代码结构 第1章&#xf…

[安装之3] 笔记本加装固态和内存条教程(超详细)

由于笔记本是几年前买的了&#xff0c;当时是4000&#xff0c;现在用起来感到卡顿&#xff0c;启动、运行速度特别慢&#xff0c;就决定换个固态硬盘&#xff0c;加个内存条&#xff0c;再给笔记本续命几年。先说一下加固态硬盘SSD的好处&#xff1a;1.启动快 2.读取延迟小 3.写…

Java每日一练——Java简介与基础练习

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 目录 系列文章目录 文章目录 前言 一、简述解释型语言与编译型语言 二、Java语言的执行流程 2.1、…

电子技术——CS和CE放大器的高频响应

电子技术——CS和CE放大器的高频响应 在绘制出MOS和BJT的高频响应模型之后&#xff0c;我们对MOS和BJT的高频响应有了进一步的认识。现在我们想知道的是在高频响应中 fHf_HfH​ 的关系。 高频响应分析对电容耦合还是直接耦合都是适用的&#xff0c;因为在电容耦合中高频模式下…

智能小车红外避障原理

红外避障电路红外避障电路由电位器R17&#xff0c;R28&#xff1b;发光二极管D8&#xff0c;D9&#xff1b;红外发射管 D2&#xff0c;D4和红外接收管D3&#xff0c;D5和芯片LM324等组成,LM234用于信号的比较&#xff0c;并产生比较结果输出给单片机进行处理。智能小车红外避障…

作为一名开发工程师,我对 ChatGPT 的一些看法

ChatGPT 又又火了。 ChatGPT 第一次爆火是2022年12月的时候,我从一些球友的讨论中知道了这个 AI 程序。 今年2月,ChatGPT 的热火更加猛烈,这时我才意识到,原来上次的热火只是我们互联网圈子内部火了,这次是真真正正的破圈了,为大众所熟悉了。 这个 AI 程序是一个智能问…

(考研湖科大教书匠计算机网络)第四章网络层-第八节:网际控制报文协议ICMP

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;网际控制报文协议ICMP&#xff08;1&#xff09;ICMP差错报告报文A&#xff1a;终点不可达B&#xff1a;源点抑制C&#xff1a;时间超过D&#xff…

C#的委托原理刨析and事件原理刨析和两者的比较

什么是委托委托是一种引用类型&#xff0c;表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时&#xff0c;你可以将其实例与任何具有兼容参数和返回类型的方法进行绑定。 你可以通过委托实例调用方法。简单的理解&#xff0c;委托是方法的抽象类&#xff0c;它定…

L2-033 简单计算器

本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示&#xff0c;计算器由两个堆栈组成&#xff0c;一个堆栈 S1​ 存放数字&#xff0c;另一个堆栈 S2​ 存放运算符。计算器的最下方有一个等号键&#xff0c;每次按下这个键&#xff0c;计算器就…

RabbitMQ相关问题

文章目录避免重复消费(保证消息幂等性)消息积压上线更多的消费者&#xff0c;进行正常消费惰性队列消息缓存延时队列RabbitMQ如何保证消息的有序性&#xff1f;RabbitMQ消息的可靠性、延时队列如何实现数据库与缓存数据一致&#xff1f;开启消费者多线程消费避免重复消费(保证消…

字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码、解码问题等

编码解码一、背景二、字符的相关概念三、字符集3.1 ASCII[ˈski]3.1.1 ASCII的编码方式3.1.2 EASCII3.2 GBK3.2.1 GB 2312-803.2.2 GBK的制订3.2.3 GBK的实现方式3.3 Unicode&#xff08;统一码、万国码&#xff09;3.3.1 Unicode的出现背景3.3.2 Unicode的编写方式3.3.3 Unico…

Verilog 学习第四节(从计数器到可控制线性序列机——LED实验进化六部曲)

从计数器到可控制线性序列机——LED实验进化六部曲一&#xff1a;让LED灯按照亮0.25s&#xff0c;灭0.75s的状态循环亮灭二&#xff1a;让LED灯按照亮0.25s&#xff0c;灭0.5s&#xff0c;亮0.75s&#xff0c;灭1s的状态循环亮灭三&#xff1a;让LED灯按照指定的亮灭模式亮灭&a…

Java程序员线上排查问题神器-Arthas

文章目录前言一、Arthas是什么&#xff1f;二、快速入门1.下载2.如何运行三、常用命令1.dashboard2.trace总结前言 最近公司项目版本迭代升级&#xff0c;在开发新需求导致没什么时间写博客。 在开发需求的过程中&#xff0c;我写了一个接口&#xff0c;去批量调内部已经写好…

浏览器工作原理详解

浏览器工作原理 以打开百度官网为例 在浏览器地址栏输入网址www.baidu.com &#xff0c;回车 这一过程发生了什么&#xff1f; 首先我们要知道www.baidu.com 这是个域名&#xff0c;需要通过DNS去解析为IP地址&#xff08;也就是服务器地址&#xff09;&#xff0c;然后返回…