注,如果不想看分析过程可以直接拉到下面或者右边导航直接跳转至第四节

1.需求以及目标

URP教务系统是一个部分高校还在使用的一个教务系统,该系统中有一个设定是每学期快结束的时候想要查询自己的成绩前需要完成当期的教学评估。

然而当你一脸无语的打开教学评估准备提交评估的时候,网页底部的红字又给你产生了一件大无语事件——提交还有限时。看了看近十几份评估需要填,然后每一份还要等上三分钟,于是需求就这么出来了。

那么我们的目标也就很简单了,实现全自动填写教学评估,并且跳过等待时间,直接提交。

2.实现分析

1.整体分析

首先我们可以直观的可以看到整个网页结构是一个框架,由topFrame、bottomFrame、menuFrame、mainFrame、barFrame组成,而我们要看的就是mainFrame了。

通过查看源代码我们可以发现控制网页表单提交的js代码被直接卸载了网页中,因此我们可以直接查看并分析对应的代码。

2.JS分析

js代码第一眼看上去很乱,然后整体看了一遍,找到了几个可能的突破点:

  • 首先是代码的刚开始定义了三个看起来比较重要的变量,分别是Flag、startTime、EndTime

  • 其次是三个看起来比较重要的方法,分别是GetRTime()、setFlag()、check()

  • 经过简单的分析,可以看出,那个控制倒计时的元素的函数应该就是 GetRTime()

于是,一套简单、看似可行的思路就出来了:那就是Flag变量应该是控制着这个表单是否提交,然后setFlag()方法则应该就是倒计时结束以后调用的函数用来控制按钮的可使用。

但是,这个天意并不如此,当我在控制台调用该函数以后发现依然还是不可以提交评估。这个时候我立马转换思路,我给他把Endtime调前,这样子就可以提前结束倒计时了。然后我就在控制台中把EndTime改成了0,此时页面也马上改变,倒计时也结束了。但是偏偏提交按钮还是不能够点击。

这个时候我就比较蒙了,为什么会这样子。然后我就突然注意到了testbutt()函数,这个函数由于和Flag变量、计时的相关变量等毫无任何关联,所以一开始就被忽视了。然后我简单的分析了一个这个函数,具体代码如下:

function testbutt(){
    var d = new Date();
    setTimeout("testbutt1()",180000);
}
function testbutt1(){
    var a = document.getElementById("submit1").onclick=check;		
}

然后就发现了这个计时器和这个按钮能不能用完全没有关系,这个按钮是单独计时的,但是总算,在控制台中调用了以后我们的按钮就能够正常提交了。

3.需求实现

1.自动选中

本来这个其实没什么好说的,直接getElements就行了,但是,由于系统过于老旧,写的代码规范性不是很好。于是,当你准备利用选择器选择的时候,你会发现所有的radio只有idname,其中id代表了选项、name代表了题号。于是乎所有的A选项id都是1,所以当你getElementById的时候,永远只能拿到第一个题目的A选项。因此我们需要通过别的标签,然后for循环一个一个去判断。

2.答案不能一样

这个比较好解决,因为当你所有的选择题都选择了同一个选项的时候,就会这样子提示你,但是个人认为全选同一个也没问题。于是乎我就找了个作业量的题目来使其不一样。

4.实现代码

JS代码

var input = document.getElementsByTagName('input');  // 获取所有的input
for(var i = 0;i<input.length;i++){
	if(input[i].getAttribute('id') == '1'){    // 找到所有id为1的选项,即A选项
		input[i].setAttribute("checked","checked");    // 选中
	}
}
document.getElementsByName('0000000018')[2].setAttribute("checked","checked");  // 作业量选项选择适中
document.getElementsByTagName('textarea')[0].value = '老师讲的很好,我很喜欢!';  // 主观评价填写
document.getElementById("submit1").onclick=check;  // 使按钮能够使用,从而提交
check();  //提交,若不想自动提交可以删去

使用方式

首先我们打开并进入到评估的页面,然后F12打开我们的开发者页面,来到我们的控制台页面,复制并粘贴上方的代码(注意,复制时会有额外的内容,注意删去),然后就可以提交了,当然你也可以通过代码的注释来修改成自己想要的效果!

如果使用的时候发生报错,如Uncaught TypeError: Cannot read properties of undefined (reading 'setAttribute'),注意在控制台选择正确的框架页面,如下图: