js实现按键精灵——尝试前端实现自动化测试(一)上

简介: js实现按键精灵——尝试前端实现自动化测试(一)上

背景


为什么要做这件事?


最近我们在新项目的联调接测阶段遇到了很大的问题,具体的问题我也不在这里过多的描述了,反正最终造成了前端同学们心力憔悴,怨声载道,哈哈哈哈(我这里也不是在抱怨谁谁谁,但是遇到问题我们就要去想怎么样去解决问题~)。于是我就在想如何让我们在这些阶段获得更加舒适的体验。


经过一点点的思考,我打算提供一些自动化的能力,可以让我们自动化过接测用例,并在过接测用例的同时,同时监测接口的信息,在过完接测用例后把有问题的接口调用呈现给我们的开发者。


github:github.com/CodingCommu…


大家别误会,其实并没有开发完成,我也只是在茶余饭后,闲来无事的时候进行了一部分的技术调研,在这里和大家介绍一下我的想法。


怎么做这件事?


在说我的想法之前,我想说一下,我想要去做的事:


  • 提供自动化过接测用例/自动化自测的能力
  • 运行过程中接口监测能力


ok,既然明白了我的需求,那就可以去想一下如何去实现了。


网络异常,图片无法展示
|


在最开始的时候,我做了这样的一个图,图中有上到下分为四层,我逐层为大家介绍:


  • 第一层:我阐述了我们要做的功能,主要是做前端的轻量自动化测试,包括接测自测自动化接口测试
  • 第二层:第二层其实我阐述我把这个需求分成了两部分,一部分是自动化能力,一部分是接口监测能力。当然本文主要介绍的是自动化能力。
  • 第三层:我对第二层中的自动化能力接口监测能力做了拆解(ps:我后面会详细介绍自动化能力部分,接口监测埋个坑吧,下次再说~)
  • 第四层:我希望我这个自动化测试的工具采用的呈现方式为Chrome插件,因为我认为,chrome插件我们使用起来更加方便,而且我可以利用到他提供的webRequest对接口调用,流量信息的观察分析能力(此处待调研)。


自动化能力拆解


首先我对我要做的事情第一感觉就是按键精灵


我希望的是我们可以只操作一遍,便可以对这个操作流程完成录制,之后只需要自动的进行这些操作就好了。ok,既然我们想要的是按键精灵之类的东西,那我就这个需求进行拆解:


  1. 录制(本文重点)


我们应该都可以预想到,我们第一步要做的就是对用户的操作流程进行记录.但是我们这个阶段要思考的问题是如何记录记录哪些信息记录哪些操作怎么记录才能易于自动化复现


  1. 操作流程->中间数据


我们录制的最终目的是要下一次需要自测或者过接测用例的时候进行复现的,所以其实,我们肯定是要对录制的信息转换为某种数据结构,并保存在本地


  1. 中间数据->js脚本


可以将中间数据转换成js脚本,这个理解就比较容易,就是把之前本地存储的中间数据转换为js脚本


  1. 自执行脚本


js脚本自动执行,重现用户操作。这也就是重现用户操作的最后一步。


ok,自动化能力简单的拆解完成之后,我们就开始本文的主要内容,如何录制用户操作?


用户操作录制



把用户操作记录下来其实不算难,但是要考虑我们需要记录哪些信息以方便我们在后续操作中对用户操作记录进行重现。


所以我在这里不仅会介绍我对记录用户操作的想法,也会去介绍我将要如何利用我记录的信息对用户操作进行重现


我这里主要介绍的用户操作包括三种:


  • 点击操作
  • 键盘输入
  • 屏幕滚动


看似只有三个,但是已经覆盖了我们业务中的比较多的场景。


github:github.com/CodingCommu…


可以查看webApi.html包括本博客所有代码~


tip: 所有点击事件,滚动事件,键盘输入事件都需要记录时间点,相对最开始时间偏移,以正确重现.本文后续就不介绍记录时间相关的内容了


鼠标点击

代码


dom:


<button class="btn">
    nihao
</button>


js:


document.onclick = function (ev) {
    const x = ev.clientX;
    const y = ev.clientY;
    setTimeout(() => {
        document.elementFromPoint(x, y).dispatchEvent(clickEvent);
    }, 2000)
}
document.getElementsByClassName('btn')[0].onclick = function () {
    console.log(11, 1)
}


讲解


首先,记录用户的点击事件并不是一件难事,但是我想要的结果是在将前文中的中间数据->js脚本环节更加方便,所以我有这样的一个原则:


不使用记录class,id等标识再去通过其查找dom元素的方式进行复现操作。

期望直接通过坐标点寻找元素


所以向大家介绍一个Api,大家可能没有用过,但是在我们这个场景下特别好用:

document.elementFromPoint(x, y)


大家看我的代码,我给document绑定点击事件,记录下clientXclientY

简单介绍一下clientX:


网络异常,图片无法展示
|


这里我使用一下别的文章中对于clientX的介绍。


MDN:MouseEvent.clientX 是只读属性, 它提供事件发生时的应用客户端区域的水平坐标 (与页面坐标不同)。例如,不论页面是否有水平滚动,当你点击客户端区域的左上角时,鼠标事件的 clientX 值都将为 0 。


我们记录了点击的位置之后我们在复线操作阶段,只需要通过document.elementFromPoint(x, y)获取元素之后再为它dispatchEvent点击事件就ok了。


相关知识:

mouseEvent:developer.mozilla.org/zh-CN/docs/…

dispatchEvent: developer.mozilla.org/zh-CN/docs/…


更多测试:


<!-用于测试多种类型的点击事件可否派发-->
<label><input name="Fruit" type="radio" value="" class="aaa" />苹果 </label>
<label><input name="Fruit" type="radio" value="" class="bbb" />桃子 </label>
<label><input name="Fruit" type="radio" value="" />香蕉 </label>
<label><input name="Fruit" type="radio" value="" />梨 </label>
<label><input name="Fruit" type="radio" value="" />其它 </label>


// 测试radio的点击事件是否可以派发
document.getElementsByClassName('bbb')[0].dispatchEvent(clickEvent)
document.getElementsByClassName('aaa')[0].dispatchEvent(focusEvent)


键盘输入

代码


// 测试键盘输入事件
// 做法:假定,持续的键盘输入都是对同一个 input的输入,
// 那我需要做的就是保存输入顺序,并记录上一刻点击的元素,并改变其value!!判断是不是input(有没有value属性来判断),如果不是用innerHtml/innerText去塞!!!为了支持富文本
document.onkeydown = function (ev) {
    console.log(ev)
}
const keyTestEl = document.getElementsByClassName('inputTest')[0];
keyTestEl.value = '11111'


讲解


其实键盘输入记录我的想法就很简单,我上面代码中的测试内容已经可以描述我的想法了。


用户操作流程:

网络异常,图片无法展示
|


用户会点击某个元素,之后会进行持续输入,知道下一个点击事件触发则表示用户输入结束,就是对该dom元素的键盘操作事件结束。


复现键盘输入事件:

网络异常,图片无法展示
|


其实就是按照流程图的思路来,就可以完成建议的键盘事件的录制与复现。


借助的只是:document.onkeydown和按照元素类型修改value或者innerHtml属性。当然也需要借助前文的document.elementFromPoint(x, y)获取并缓存点击的元素。


于是点击事件到此为止了~

相关文章
|
28天前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
1月前
|
前端开发 JavaScript 测试技术
前端测试技术中,如何提高集成测试的效率?
前端测试技术中,如何提高集成测试的效率?
|
25天前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
18天前
|
前端开发 JavaScript 测试技术
前端自动化测试
前端自动化测试是通过使用工具和脚本自动执行测试用例的过程,旨在提高测试效率、减少人为错误,并确保Web应用的功能在不同环境和设备上的一致性与稳定性。
|
29天前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
35 4
|
1月前
|
数据采集 存储 监控
实现自动化数据抓取:使用Node.js操控鼠标点击与位置坐标
本文介绍了如何使用Node.js和Puppeteer实现自动化数据抓取,特别是针对新闻网站“澎湃新闻”。通过设置代理IP、User-Agent和Cookie,提高爬虫的效率和隐蔽性,避免被网站封锁。代码示例展示了如何模拟鼠标点击、键盘输入等操作,抓取并整理新闻数据,适用于需要规避IP限制和突破频率限制的场景。
88 10
|
1月前
|
前端开发 JavaScript 测试技术
前端小白逆袭之路:如何快速掌握前端测试技术,确保代码质量无忧!
【10月更文挑战第30天】前端开发技术迭代迅速,新手如何快速掌握前端测试以确保代码质量?本文将介绍前端测试的基础知识,包括单元测试、集成测试和端到端测试,以及常用的测试工具如Jest、Mocha、Cypress等。通过实践和学习,你也能成为前端测试高手。
51 4
|
1月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
111 1
|
1月前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
40 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
1月前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
47 1