Greasy Fork

wsxy_autoExamineTest

网上学院函数库:自动答题

目前为 2020-02-05 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.icu/scripts/395966/770238/wsxy_autoExamineTest.js

// ==UserScript==
// @name          wsxy_autoExamineTest
// @namespace     Vionlentmonkey
// @version       0.6
// @description   网上学院函数库:自动答题
// ==/UserScript==

// 获取各题答案。一次性数据,无存储必要。
const getSubjectData = async subjectPk => {
  let subjectURL = `${location.origin}/sfxzwsxy//jypxks/modules/train/course/subject_view.jsp?subjectPk=${subjectPk}`;
  let response = await fetch(subjectURL, {
    method: 'POST',
    body: 'blob'
  });
  let blob = await response.blob();
  let subjectHtml = await binary2Text(blob);
  let elements = htmlToElements(subjectHtml);
  // https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Map
  let subjectDataMap = new Map();
  // 题目类型:判断题/单选题/多选题
  let questionType = elements
    .querySelectorAll('table')[0]
    .querySelectorAll('tr')[0]
    .querySelectorAll('td')[1]
    .textContent.trim();
  subjectDataMap.set('questionType', questionType);
  // 题目内容:string
  let questionContent = elements
    .querySelectorAll('table')[0]
    .querySelectorAll('tr')[1]
    .querySelectorAll('td')[1]
    .textContent.trim();
  // 判断题答案,选择题此处为空值
  let judgementAnswer = elements
    .querySelectorAll('table')[0]
    .querySelectorAll('tr')[2]
    .querySelectorAll('td')[1]
    .textContent.trim();
  subjectDataMap.set('questionContent', questionContent);

  if (questionType === '判断题') {
    subjectDataMap.set('judgementAnswer', judgementAnswer);
  } else {
    // 选择题答案表格第一行为标题:序号 	 选项内容 	 类型 	 是否为标准答案
    // 此表格中答案选项与试题选项顺序打乱,序号没有意义,类型已获取也没有意义
    let options = elements.querySelectorAll('table')[1].querySelectorAll('tr');
    for (let option of options) {
      let optionContent = option.querySelectorAll('td')[1].textContent.trim();
      let optionAnswer = option.querySelectorAll('td')[3].textContent.trim();
      if (optionContent !== '选项内容' && optionAnswer !== '是否为标准答案') {
        subjectDataMap.set(optionContent, optionAnswer);
      }
    }
  }
  return subjectDataMap;
};

// 打开考卷后自动答题交卷
const autoExamineTest = async () => {
  // 本考试所有试题
  let topics = document.getElementsByClassName('topic-tms');
  for await (let topic of topics) {
    // 题号
    let pkid = topic.querySelector('a[pkid]').getAttribute('pkid');
    // 本题答案
    let subjectDataMap = await getSubjectData(pkid);
    // 本题选项
    let options = topic.querySelectorAll('.tms-Right-wrong > p > a');
    for (let option of options) {
      let optionText = option.textContent.trim();
      if (subjectDataMap.get('questionType') === '判断题') {
        if (option.textContent.trim() === subjectDataMap.get('judgementAnswer')) {
          option.click();
        }
      } else {
        // 选择题选项内容带着序号与空格,如“A ”,故获取第三个字符开始的子串
        if (subjectDataMap.get(optionText.substring(2)) === '是') {
          option.click();
        }
      }
    }
  }
  // 交卷
  if (document.getElementsByClassName('subline _submit').length === 1) {
    document.getElementsByClassName('subline _submit')[0].click();
  }
  // 确认
  if (document.getElementsByClassName('layui-layer-btn0').length === 1) {
    document.getElementsByClassName('layui-layer-btn0')[0].click();
  }
};