出来看!让前端大幅提效的 Recorder 🐶

前言

众所周知,测试工作是痛苦而乏味的。

举个典型的例子,一个拥有庞大的表单的新功能,如图所示

填写起来着实是费时费力,开发过程中可能需要测试好几遍,就需要反复的填写。

不单单是前端和测试,后端可能也有这种需要测试自己接口的场景

又众所周知,懒惰是人类进步的阶梯,puppeteer 这种无头浏览器 很快就接手了自动化测试的这项工序。

但是遗憾的是,测试脚本还是需要开发人员自己码,但当下以敏捷迭代为主的产品大行其道,而自己编写的选择器没多久就要因为页面变动而失效,所以前端一般也不爱写自动化测试。

这其实是两难的局面,如果能保证页面长期不发生大变动,那其实没什么测试的必要;如果总是变动,那你的脚本写完就报废写完就报废,那还不如自己手动测试。

Recorder 的出现,打破了这一困境。

本篇文章会介绍 Recorder 的使用,以及我自己复刻的 Recorder 的插件

Recorder 是什么

其实很多前端同学应该都有这种想法:要是能自动生成测试脚本就好了,把我的点击、输入记录下来,然后进行回放,这不就大幅降低了我们的开发负担。

是的,Recorder 就干了这件事,请看 gif

可以看到,几乎没有任何额外操作,只需要点击录制和回放就够了,也不需要做什么 puppeteer 脚本,接入 puppeteer 等等麻烦的流程。

更难能可贵的是,这是 chromium 系列浏览器自带的功能,也就是大部分浏览器都可以直接使用,而不用额外安装插件。

Recorder 怎么用

开启 Recorder

有的同学就要问了,imooimoo,这么好用的东西我怎么没有看到。有的兄弟有的,只需要你手动去开启它。

别等,就现在。按下 f12,跟我一起体验一下

想测试常规操作,可以创建一个录制,并进行本篇文章左侧的点赞评论,然后就可以重放看效果了

如果想试试表单类操作,可以在这做测试 arco.design/react/compo...

基本操作

这个工具的基本使用其实很好懂,大家上手操作一下就明白了,包括但不限于:

  • 录像的增删改查
  • 录像的导入导出
  • 录制与回放
  • 调整回放速率

所以我重点说一下一些好用的额外操作

额外操作
  1. 右侧可以在任意节点进行插入、移除、打断点
  1. 自动识别选择器

这里有个小按钮,如果你希望更新选择器,就点击它,随后任意点击网页上的元素,它就能自动获取唯一选择器,并更新你当前的选择器,完全不用自己费劲写选择器,非常好用家人们。

  1. 模拟低网速
  1. 联动性能面板
使用方向
  • 测试工程师减少点点点的操作
  • 前后端调试接口省去填写的时间
  • 用户可以提前填好常用的数据,减少反复的写同样的内容(模版功能)
  • 将其视为草稿箱暂存内容
  • ...

仅供抛砖引玉,理论上浏览器的所有重复性操作都可以靠 Recorder 来解决

复刻一个 Recorder

众所周知,前端一言不合就喜欢自己造轮子,Recorder 虽然好,但是会出现偶发性卡顿的问题,我们也没办法进行调试排查。

所以我又做了一个极简版的插件,之前也没做过浏览器插件,刚好趁这个机会丰富一下自己的工作经历。

说是自己做,其实大半是 ai 生成的 🐶,我们只需要负责决策大体方向即可。

记录一下我的思路

找一个框架

写原生是不可能写原生的,框架这么多,我翻了一下最终选用了 plasmo,它可以用 react + ts 的方式写代码,活跃程度也不错

让 ai 写个简单的方案

主要是看一下各种文件应该怎么写怎么放。

看一下 chrome 是怎么实现的

这步踩了坑了,首先下到了 chromium 的源码,找了许久也没看到录制器相关的逻辑。

ai 在这一步也没有给出有用的帮助,官方文档里也没有说明这一块的 github 链接。当时以为这里没有开源,都准备放弃了。

后来发现 edge 也有相同的录制器,那就不对了,一定是开源的才能复用。

在 github 淘了半天,最后找到了 github.com/ChromeDevTo... ,居然只有 3k star,落魄了家人们。

检查了一下它的大体逻辑,也基本是用 puppeteer 来实现的,但是插件端不太方便用 puppeteer,罢了,兜兜转转到最后还是得靠自己。


其实核心就两部分,录制回放

录制中,我们需要记录当前行为和点击的目标。我找到了一个不错的库,css-selector-generator 可以很方便的生成唯一选择器,再分别监听一下 click 和 keydown 就差不多了。

回放中,利用刚才记录的唯一选择器,触发对应事件即可。

好了 claude 3.7,方案有了,快给我写

修 bug

有个 bug 比较麻烦,难住我很久。有些元素是点击以后自动就变化了 class ,这时候我再记录的 class 会出现不准的问题。

比如某个打勾的组件,点击后会打上勾,这时候自动会添加一个 checked 的 class,录制器这时候去记录,往往就记录上这个 checked。当你重放的时候,这个 checked 实际上是找不到的。

聪明的同学这时候要说了:在捕获阶段进行我们的点击事件

没错,大部分事件是在冒泡阶段才进行处理,我们只需要在捕获阶段做就好了。但是少部分事件呢?

另外,react 项目呢?react 统一做了事件委托,在顶层进行处理,并且在捕获阶段就做了很多事情。

到这一步,我只想到了一个点,我们也做一个事件委托,并且将我们的委托挂在最外层,对于 react 17 之后的项目,它们的捕获是在 root 节点而非 document,就会比我们晚一步,这样一来,我们就会优先触发,记录以后它怎么变更 class 都无所谓了。

写这篇文章其实也是希望有大佬指点一下,有无更好的实现方案

ok,修完bug,我们的插件也开发的差不多了,最后找个 ai-logo 设计个 logo 就搞定了。

如果有兴趣的同学,可以看看我的录制器插件,已经开源:github.com/imoo666/chr...

总结

读完这篇文章,你也许了解到了:

  1. Recorder 的使用,用来提升我们的工作效率

  2. 做一个浏览器插件过程

  3. 一个好用的浏览器插件

  4. 复习了一下捕获与冒泡,以及 react 的事件委托机制

看到这里非常不错了,共勉兄弟们~

相关推荐
极小狐12 分钟前
极狐GitLab 容器镜像仓库功能介绍
java·前端·数据库·npm·gitlab
程序猿阿伟24 分钟前
《Flutter社交应用暗黑奥秘:模式适配与色彩的艺术》
前端·flutter
rafael(一只小鱼)28 分钟前
黑马点评实战笔记
前端·firefox
weifont28 分钟前
React中的useSyncExternalStore使用
前端·javascript·react.js
初遇你时动了情33 分钟前
js fetch流式请求 AI动态生成文本,实现逐字生成渲染效果
前端·javascript·react.js
影子信息1 小时前
css 点击后改变样式
前端·css
几何心凉1 小时前
如何使用 React Hooks 替代类组件的生命周期方法?
前端·javascript·react.js
小堃学编程1 小时前
前端学习(1)—— 使用HTML编写一个简单的个人简历展示页面
前端·javascript·html
hnlucky2 小时前
通俗易懂版知识点:Keepalived + LVS + Web + NFS 高可用集群到底是干什么的?
linux·前端·学习·github·web·可用性测试·lvs
懒羊羊我小弟2 小时前
使用 ECharts GL 实现交互式 3D 饼图:技术解析与实践
前端·vue.js·3d·前端框架·echarts