0%

实验室安全考试系统自动答题

前言

学校要求在实验室安全考试系统上学习实验室安全相关的知识,然后完成一个考试。我就想着借这个机会把python selenium自动化测试模块的知识再学一下以前只稍微用过那么一两下,反正就是乱搞嘛,学习这么枯燥当然要自己找点乐子了。完成了一个自动答题的一个脚本,输入自己的学号和密码,程序就会自动答题,最后结果应该是满分,仅此记录一下学习过程,不是为了答题才写的,实验室安全还是要好好了解一下的😄,具体代码如下

代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# -*- codeing = utf-8 -*-
# @Time : 2020/10/24
# @Author : loadding...
# @File : lab_safety.py
# @Software : jupyter

from lxml import etree
import requests
from selenium import webdriver
import re

def getQuestionBank():
# url="http://aqks.neu.edu.cn/redir.php?catalog_id=6&cmd=dajuan_chakan&huihuabh=69338&mode=test"
url="http://aqks.neu.edu.cn/"
response=requests.get(url)
page_source=response.text
#print(page_source)
tree=etree.HTML(page_source)
arr=tree.xpath('//*[@class="shiti"]/strong')
#print(arr)

def search_answer(answer_source,question):
#匹配判断题答案
#s=question+'</strong>(分值1.0)<br/>你未作答标准答案:(.{2,4}?)</div>'

#查了好久,终于知道为什么有的答案搜索不到了,比如某些问题里带有?,而?在正则里是有含义的,需要转义
question=question.replace('?','\\?')
question=question.replace('(','\\(')
question=question.replace(')','\\)')
#.*?非贪婪模式匹配,匹配判断题、选择题

s=question+'.*?你未作答标准答案:(.{1,2}?)</div>'
#s='灾初起阶段是扑救火灾()的阶段。.*?你未作答标准答案:(.{1,2}?)</div>'
#print(s)
pattern=re.compile(s)
#获取答案
answer=re.findall(pattern,answer_source)
#返回搜索到的答案列表,注意可能为空列表
#print(answer)
return answer

if __name__=='__main__':

while(1):
#登录网站
print("****************************欢迎来到实验室安全考试系统,本程序是自动答题脚本,祝您玩的愉快!!!*************************")
username=input('请输入学号:')
password=input('请输入密码:')
#实例化出一个Firefox浏览器
dr=webdriver.Chrome()
dr.get("http://aqks.neu.edu.cn/")
dr.find_element_by_id('u1').send_keys(username)
dr.find_element_by_id('password').send_keys(password)
#点击提交登录
dr.find_element_by_xpath('//*[@id="web_login"]/div/form/div[3]/input').click()
if dr.current_url=='http://aqks.neu.edu.cn/':
print("用户名或密码错误!请重新登录!!!")
else:
break

#点击导航栏安全考试
dr.find_element_by_xpath('/html/body/div[1]/div[2]/ul/li[3]/a').click()
while(1):
type=input('模拟考试/开始考试(输入1或2):')
if type=='1':
#点击模拟考试
dr.find_element_by_xpath('//*[@id="article"]/div[4]/div[2]/div/a[1]').click()
break
elif type=='2':
#点击开始考试
dr.find_element_by_xpath('//*[@id="article"]/div[4]/div[2]/div/a[2]').click()
break
else:
print("输入错误,请重输!!!")

#提取问题,定位的是第一个元素不是一个列表,改用其他方法
#question=dr.find_element_by_class_name('shiti').text[2:-4]

#获取答案
url="http://aqks.neu.edu.cn/redir.php?catalog_id=6&cmd=dajuan_chakan&huihuabh=69338&mode=test"
response=requests.get(url)
response.encoding='gbk'#网页是gbk编码
answer_source=response.text
#去掉所有的空白符,包括换行符和空格、制表符
answer_source=re.sub('\s','',answer_source)
#print(answer_source)
#共有10页,每页10题
page=0
while(page<10):
#获取当前页面源码(答题页)
page_source=dr.page_source
tree=etree.HTML(page_source)
question_list=tree.xpath('//h3')
for i in range(10):
question=question_list[i]
#因为最大题号是100,再加上符号,所以从4开始截取
question=question.xpath('string(.)')[4:]
#有的问题也会带有空格,先处理掉
question=re.sub('\s','',question)
#搜索答案
answer=search_answer(answer_source,question)
#print(answer)
if(len(answer)==0):
print("第"+str(10*page+i+1)+"题未搜索到答案!")
print("问题是:"+question)
continue
answer=answer[0]
#拼接按钮元素的id
id='ti_'+str(10*page+i+1)
if answer=='错误' or answer=='A':
id=id+'_0'
elif answer=='正确' or answer=='B':
id=id+'_1'
elif answer=='C':
id=id+'_2'
elif answer=='D':
id=id+'_3'
else:
print("搜索答案失败!!!")
continue
dr.find_element_by_id(id).click()
if page==0:
#第一页时,点击下一页是input[1],其它页面是input[2]
path='//*[@id="dati"]/div[11]/input[1]'
else:
path='//*[@id="dati"]/div[11]/input[2]'
dr.find_element_by_xpath(path).click()
page=page+1
#答题页面共有10页
for i in range(10):
pass
结果

程序运行过程中会调出chrome浏览器,可以看到程序自动答题过程,答题结束会询问是否提交需要手动确定提交,另外需要用到一个Chrome浏览器驱动程序需要和自己的chrome浏览器版本匹配,点我下载,下载后要配置环境变量或者直接放到已经在环境变量里的目录中。如果没有python环境用我打包好的exe程序,点击下载,不需要python环境就可运行,不过还是需要下载上面chrome浏览器驱动😎

下面这张图是程序自动答题提交后的结果,满分。。。因为已经答过题了所以是用模拟考试测试的🙂

image-20201026145032142

下面是程序自动答题的运行过程,插入视频的dplayer插件也整了好久不过还好成功了😝,浏览器播放不了MP4,需要使用格式工厂把mp4格式视频的编码转换成H264编码。。。

仅此记录一下,以后如果有其他类似的需求可以参考一下,比如网课答题??😂

------------- THE END! THANKS! -------------