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

0 阅读6分钟

前言

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

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

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

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

又众所周知,懒惰是人类进步的阶梯,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 生成的 🐶,我们只需要负责决策大体方向即可。

记录一下我的思路

  1. 找一个框架

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

  1. 让 ai 写个简单的方案

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

  1. 看一下 chrome 是怎么实现的

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

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

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

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

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


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

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

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

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

  1. 修 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 的事件委托机制

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