展开并获取所有答案
(function(){document.querySelectorAll('.handle-show').forEach((ele)=>{ele.click();});const questions=document.querySelectorAll('.store-question-item-container');const result=[];let success=0;let failed=0;questions.forEach((question)=>{const headerEl=question.querySelector('.item-question-header .header-left');if(!headerEl){return}const numberMatch=headerEl.textContent.match(/^\s*(\d+)/);if(!numberMatch){console.warn('无法获取题号:',headerEl.textContent);return}const questionNumber=numberMatch[1];const answerEl=question.querySelector('.answer-content');if(!answerEl){console.warn(`第${questionNumber}题:没有找到参考答案`);failed++;return}const answerText=answerEl.textContent.trim().toUpperCase();if(!answerText){console.warn(`第${questionNumber}题:参考答案为空`);failed++;return}const isMultiple=answerText.length>1;let answerLetters;if(isMultiple){answerLetters=answerText.match(/[A-Z]/g)||[]}else{answerLetters=[answerText]}answerLetters=[...new Set(answerLetters)];if(answerLetters.length===0){console.warn(`第${questionNumber}题:无法解析参考答案「${answerText}」`);failed++;return}const options=question.querySelectorAll('.option-item');const answerContents=[];answerLetters.forEach((answerLetter)=>{let found=false;options.forEach((option)=>{const indexEl=option.querySelector('.option-index');const contentEl=option.querySelector('.option-content');if(!indexEl||!contentEl){return}const letter=indexEl.textContent.trim().toUpperCase();if(letter!==answerLetter){return}const content=contentEl.textContent.trim().replace(/\s+/g,' ');answerContents.push(content);found=true});if(!found){console.warn(`第${questionNumber}题:找不到${answerLetter}对应的选项`)}});if(answerContents.length!==answerLetters.length){console.warn(`第${questionNumber}题:答案匹配不完整`,{参考答案:answerText,答案字母:answerLetters,找到内容:answerContents});failed++;return}const answerContent=answerContents.join('||');result.push(`${questionNumber}:${answerContent}`);console.log(`第${questionNumber}题:${answerLetters.join('、')}→${answerContent}`);success++});const output=result.join(' ');console.log('====================');console.log('答案结果:');console.log(output);console.log('====================');console.log(`完成:成功${success}题,失败${failed}题`);if(navigator.clipboard){navigator.clipboard.writeText(output).then(()=>{console.log('答案已经复制到剪贴板')}).catch(()=>{console.warn('自动复制失败,请手动复制上面的结果')})}else{console.warn('当前浏览器不支持自动复制,请手动复制上面的结果')}return output})();
答案选项对应的详情信息
(function(){const answerText=prompt('请输入答案,例如:\n1:问卷复杂性高||数据量大||样本控制好 2:滚雪球抽样||任意抽样||判断抽样||配额抽样 6:数据库');if(!answerText){console.log('已取消');return}const answers={};answerText.replace(/(\d+)\s*:\s*(.*?)(?=\s+\d+\s*:|$)/g,function(_,questionNumber,answer){answers[parseInt(questionNumber,10)]=answer.trim()});console.log('解析后的答案:',answers);console.log(`共解析出${Object.keys(answers).length}道答案`);const questions=document.querySelectorAll('.store-question-item-container');console.log(`页面找到${questions.length}道题`);let success=0;let failed=0;questions.forEach((question)=>{const headerEl=question.querySelector('.item-question-header .header-left');if(!headerEl){return}const numberMatch=headerEl.textContent.match(/^\s*(\d+)/);if(!numberMatch){console.warn('无法获取题号:',headerEl.textContent);failed++;return}const questionNumber=parseInt(numberMatch[1],10);const correctAnswer=answers[questionNumber];if(correctAnswer===undefined){console.warn(`第${questionNumber}题没有找到答案`);failed++;return}const isMultiple=headerEl.textContent.includes('多选题');const answerList=isMultiple?correctAnswer.split('||').map(item=>item.trim()).filter(Boolean):[correctAnswer.trim()];console.log(`第${questionNumber}题:`+`${isMultiple?'多选':'单选'}→`,answerList);const options=question.querySelectorAll('.option-item');let questionSuccess=true;answerList.forEach((answer)=>{let target=null;options.forEach((option)=>{const contentEl=option.querySelector('.option-content');if(!contentEl){return}const content=contentEl.textContent.trim().replace(/\s+/g,' ');if(content===answer){target=option}});if(!target){console.warn(`第${questionNumber}题:`+`找不到选项「${answer}」`);questionSuccess=false;return}const letterEl=target.querySelector('.option-index');const letter=letterEl?letterEl.textContent.trim():'?';console.log(`第${questionNumber}题→`+`${answer}→找到${letter}`);if(letterEl){letterEl.click()}else{target.click()}console.log(`第${questionNumber}题→`+`${letter}→已执行点击`)});if(questionSuccess){success++}else{failed++}});console.log('====================');console.log(`完成:成功${success}题,失败${failed}题`);console.log('====================')})();
一键执行版本
(function(){console.log('==============================');console.log('🚀 开始智能自动答题');console.log('==============================');function normalizeText(text){return(text||'').trim().replace(/\s+/g,' ')}function waitFor(checkFunction,timeout=10000,interval=200){return new Promise((resolve,reject)=>{const start=Date.now();function check(){try{const result=checkFunction();if(result){resolve(result);return}}catch(e){}if(Date.now()-start>=timeout){reject(new Error('等待超时'));return}setTimeout(check,interval)}check()})}console.log('📖 正在展开参考答案...');const handleButtons=document.querySelectorAll('.handle-show');console.log(`找到${handleButtons.length}个「查看参考答案」按钮`);handleButtons.forEach((ele)=>{ele.click()});waitFor(()=>{const questions=document.querySelectorAll('.store-question-item-container');const answers=document.querySelectorAll('.store-question-item-container .answer-content');return(questions.length>0&&answers.length>0)},10000).then(()=>{console.log('✅ 参考答案已经加载');const questions=document.querySelectorAll('.store-question-item-container');const answers={};let answerSuccess=0;let answerFailed=0;questions.forEach((question)=>{const headerEl=question.querySelector('.item-question-header .header-left');if(!headerEl){console.warn('❌ 找不到题目 Header');answerFailed++;return}const headerText=normalizeText(headerEl.textContent);const numberMatch=headerText.match(/^\s*(\d+)/);if(!numberMatch){console.warn('❌ 无法获取题号:',headerText);answerFailed++;return}const questionNumber=parseInt(numberMatch[1],10);const isMultiple=headerText.includes('多选题');const answerEl=question.querySelector('.answer-content');if(!answerEl){console.warn(`❌第${questionNumber}题:没有找到参考答案`);answerFailed++;return}const answerText=normalizeText(answerEl.textContent).toUpperCase();if(!answerText){console.warn(`❌第${questionNumber}题:参考答案为空`);answerFailed++;return}let answerLetters;if(isMultiple){answerLetters=answerText.match(/[A-Z]/g)||[]}else{answerLetters=[answerText]}answerLetters=[...new Set(answerLetters)];if(answerLetters.length===0){console.warn(`❌第${questionNumber}题:无法解析参考答案「${answerText}」`);answerFailed++;return}const options=question.querySelectorAll('.option-item');const answerContents=[];answerLetters.forEach((answerLetter)=>{let found=false;options.forEach((option)=>{const indexEl=option.querySelector('.option-index');const contentEl=option.querySelector('.option-content');if(!indexEl||!contentEl){return}const letter=normalizeText(indexEl.textContent).toUpperCase();if(letter!==answerLetter){return}const content=normalizeText(contentEl.textContent);answerContents.push(content);found=true});if(!found){console.warn(`❌第${questionNumber}题:找不到${answerLetter}对应的选项`)}});if(answerContents.length!==answerLetters.length){console.warn(`❌第${questionNumber}题:答案匹配不完整`,{参考答案:answerText,答案字母:answerLetters,找到内容:answerContents});answerFailed++;return}answers[questionNumber]={multiple:isMultiple,contents:answerContents};console.log(`第${questionNumber}题:`+`${answerLetters.join('、')}→`+`${answerContents.join(' || ')}`);answerSuccess++});console.log('==============================');console.log(`📖答案获取完成:成功${answerSuccess}题,失败${answerFailed}题`);console.log('答案已经保存到内存:',answers);console.log('==============================');if(answerFailed>0){console.error('❌ 有题目答案获取失败,停止执行。');alert(`答案获取失败:${answerFailed}道题。\n\n`+'为避免错误答题,脚本已停止。');return}const buttons=document.querySelectorAll('.do-topic-header .function-btn button');let actionButton=null;let actionName='';buttons.forEach((button)=>{const text=normalizeText(button.textContent);if(!actionButton&&text==='重新答题'){actionButton=button;actionName='重新答题'}});if(!actionButton){buttons.forEach((button)=>{const text=normalizeText(button.textContent);if(!actionButton&&text==='继续答题'){actionButton=button;actionName='继续答题'}})}if(!actionButton){console.error('❌ 没有找到「重新答题」或「继续答题」按钮');alert('没有找到「重新答题」或「继续答题」按钮。\n\n请确认当前页面处于作业答题页面。');return}console.log(`🔄找到「${actionName}」按钮`);const oldQuestions=Array.from(document.querySelectorAll('.store-question-item-container'));const oldQuestionCount=oldQuestions.length;const oldFirstQuestion=oldQuestions[0]||null;const oldFirstQuestionHTML=oldFirstQuestion?oldFirstQuestion.outerHTML:'';console.log(`📌当前题目数量:${oldQuestionCount}`);actionButton.click();console.log(`✅已点击「${actionName}」`);console.log('💬 等待作业确认 Dialog...');waitFor(()=>{const dialogs=document.querySelectorAll('.el-message-box__wrapper');for(const dialog of dialogs){const message=normalizeText(dialog.textContent);const isContinueDialog=message.includes('继续上次未提交的作业');const isResetDialog=message.includes('是否将作业重置为初始状态,重新答题');if(isContinueDialog||isResetDialog){return dialog}}return false},10000).then((dialog)=>{console.log('💬 检测到作业确认 Dialog');console.log('提示内容:',normalizeText(dialog.textContent));const confirmButton=Array.from(dialog.querySelectorAll('.el-message-box__btns button')).find((button)=>{return normalizeText(button.textContent)==='确认'});if(!confirmButton){console.error('❌ Dialog 中没有找到「确认」按钮');alert('检测到了作业确认弹窗,但没有找到「确认」按钮。');return}console.log('✅ 找到「确认」按钮');console.log('🖱️ 自动点击「确认」');confirmButton.click();console.log('✅ 已确认');console.log('⏳ 等待题目重新加载...');waitFor(()=>{const newQuestions=Array.from(document.querySelectorAll('.store-question-item-container'));if(oldFirstQuestion&&!document.contains(oldFirstQuestion)){console.log('🔄 检测到旧题目 DOM 已被替换');return newQuestions}if(newQuestions.length>0&&newQuestions.length!==oldQuestionCount){console.log('🔄 检测到题目数量发生变化');return newQuestions}if(oldFirstQuestion&&newQuestions[0]){const newFirstQuestionHTML=newQuestions[0].outerHTML;if(newFirstQuestionHTML!==oldFirstQuestionHTML){console.log('🔄 检测到第一题内容发生变化');return newQuestions}}return false},15000).then(()=>{const newQuestions=document.querySelectorAll('.store-question-item-container');console.log(`✅新题目已经加载:${newQuestions.length}道`);setTimeout(()=>{fillAnswers(answers)},500)}).catch((error)=>{console.error('❌ 等待新题目失败:',error);alert('确认后等待新题目加载超时。\n\n请检查页面是否已经重新加载。')})}).catch((error)=>{console.error('❌ 没有检测到作业确认 Dialog:',error);alert('点击答题按钮后,没有检测到确认弹窗。\n\n请检查当前页面状态。')})}).catch((error)=>{console.error('❌ 等待参考答案失败:',error);alert('等待参考答案加载超时。')});function fillAnswers(answers){console.log('==============================');console.log('✏️ 开始自动填充答案');console.log('==============================');const questions=document.querySelectorAll('.store-question-item-container');console.log(`页面找到${questions.length}道题`);let success=0;let failed=0;questions.forEach((question)=>{const headerEl=question.querySelector('.item-question-header .header-left');if(!headerEl){console.warn('❌ 找不到题目 Header');failed++;return}const numberMatch=headerEl.textContent.match(/^\s*(\d+)/);if(!numberMatch){console.warn('❌ 无法获取题号:',headerEl.textContent);failed++;return}const questionNumber=parseInt(numberMatch[1],10);const answer=answers[questionNumber];if(!answer){console.warn(`❌第${questionNumber}题:没有保存的答案`);failed++;return}const options=question.querySelectorAll('.option-item');let questionSuccess=true;answer.contents.forEach((correctContent)=>{let target=null;options.forEach((option)=>{const contentEl=option.querySelector('.option-content');if(!contentEl){return}const content=normalizeText(contentEl.textContent);if(content===correctContent){target=option}});if(!target){console.warn(`❌第${questionNumber}题:找不到选项「${correctContent}」`);questionSuccess=false;return}const letterEl=target.querySelector('.option-index');if(!letterEl){console.warn(`❌第${questionNumber}题:找到答案,但没有找到option-index`);questionSuccess=false;return}const letter=normalizeText(letterEl.textContent);console.log(`第${questionNumber}题→`+`${letter}→`+`${correctContent}`);letterEl.click();console.log(`第${questionNumber}题→`+`${letter}→已点击`)});if(questionSuccess){success++}else{failed++}});console.log('==============================');console.log(`🎉自动填充完成:成功${success}题,失败${failed}题`);console.log('==============================');if(failed===0){console.log('✅ 所有题目均已执行点击')}else{console.warn(`⚠️有${failed}道题填充失败,请检查上面的日志`)}}})();
篡改猴版本
// ==UserScript==
// @name 作业自动答题
// @namespace https://yyliucha.cn/
// @version 1.0.0
// @description 自动读取参考答案、重新答题并自动填写答案
// @author Jacky
// @match *://*/*
// @grant none
// @run-at document-idle
// ==/UserScript==
(function () {
'use strict';
// =========================================================
// 1. 启动前检查
// =========================================================
// 当前页面不存在题目容器,直接结束,不提示、不报错
if (!document.querySelector('.store-question-item-container')) { return; }
console.log('==============================');
console.log('🚀 作业自动答题脚本已启动');
console.log('==============================');
// =========================================================
// 工具:标准化文本
// =========================================================
function normalizeText(text) {
return (text || '')
.trim()
.replace(/\s+/g, ' ');
}
// =========================================================
// 通用等待函数
// =========================================================
function waitFor(
checkFunction,
timeout = 10000,
interval = 200
) {
return new Promise((resolve, reject) => {
const start = Date.now();
function check() {
try {
const result =
checkFunction();
if (result) {
resolve(result);
return;
}
} catch (e) {
// DOM 尚未准备好,继续等待
}
if (
Date.now() - start >=
timeout
) {
reject(
new Error('等待超时')
);
return;
}
setTimeout(
check,
interval
);
}
check();
});
}
// =========================================================
// 第一步:展开所有参考答案
// =========================================================
console.log(
'📖 正在展开参考答案...'
);
const handleButtons =
document.querySelectorAll(
'.handle-show'
);
console.log(
`找到 ${handleButtons.length} 个「查看参考答案」按钮`
);
handleButtons.forEach((ele) => {
ele.click();
});
// =========================================================
// 第二步:等待参考答案加载
// =========================================================
waitFor(() => {
const questions =
document.querySelectorAll(
'.store-question-item-container'
);
const answers =
document.querySelectorAll(
'.store-question-item-container .answer-content'
);
return (
questions.length > 0 &&
answers.length > 0
);
}, 10000)
.then(() => {
console.log(
'✅ 参考答案已经加载'
);
// =====================================================
// 第三步:提取答案
// =====================================================
const questions =
document.querySelectorAll(
'.store-question-item-container'
);
const answers = {};
let answerSuccess = 0;
let answerFailed = 0;
questions.forEach((question) => {
// -------------------------------------------------
// 获取题号和题型
// -------------------------------------------------
const headerEl =
question.querySelector(
'.item-question-header .header-left'
);
if (!headerEl) {
console.warn(
'❌ 找不到题目 Header'
);
answerFailed++;
return;
}
const headerText =
normalizeText(
headerEl.textContent
);
const numberMatch =
headerText.match(
/^\s*(\d+)/
);
if (!numberMatch) {
console.warn(
'❌ 无法获取题号:',
headerText
);
answerFailed++;
return;
}
const questionNumber =
parseInt(
numberMatch[1],
10
);
// -------------------------------------------------
// 判断单选 / 多选
// -------------------------------------------------
const isMultiple =
headerText.includes(
'多选题'
);
// -------------------------------------------------
// 获取参考答案
// -------------------------------------------------
const answerEl =
question.querySelector(
'.answer-content'
);
if (!answerEl) {
console.warn(
`❌ 第${questionNumber}题:没有找到参考答案`
);
answerFailed++;
return;
}
const answerText =
normalizeText(
answerEl.textContent
).toUpperCase();
if (!answerText) {
console.warn(
`❌ 第${questionNumber}题:参考答案为空`
);
answerFailed++;
return;
}
// -------------------------------------------------
// 解析答案字母
// -------------------------------------------------
let answerLetters;
if (isMultiple) {
answerLetters =
answerText.match(
/[A-Z]/g
) || [];
} else {
answerLetters = [
answerText
];
}
// 去重
answerLetters =
[...new Set(answerLetters)];
if (
answerLetters.length === 0
) {
console.warn(
`❌ 第${questionNumber}题:无法解析参考答案「${answerText}」`
);
answerFailed++;
return;
}
// -------------------------------------------------
// 获取所有选项
// -------------------------------------------------
const options =
question.querySelectorAll(
'.option-item'
);
const answerContents = [];
// -------------------------------------------------
// 根据 A/B/C/D 找对应选项内容
// -------------------------------------------------
answerLetters.forEach(
(answerLetter) => {
let found = false;
options.forEach(
(option) => {
const indexEl =
option.querySelector(
'.option-index'
);
const contentEl =
option.querySelector(
'.option-content'
);
if (
!indexEl ||
!contentEl
) {
return;
}
const letter =
normalizeText(
indexEl.textContent
).toUpperCase();
if (
letter !==
answerLetter
) {
return;
}
const content =
normalizeText(
contentEl.textContent
);
answerContents.push(
content
);
found = true;
}
);
if (!found) {
console.warn(
`❌ 第${questionNumber}题:找不到 ${answerLetter} 对应的选项`
);
}
}
);
// -------------------------------------------------
// 检查答案是否完整
// -------------------------------------------------
if (
answerContents.length !==
answerLetters.length
) {
console.warn(
`❌ 第${questionNumber}题:答案匹配不完整`,
{
参考答案: answerText,
答案字母: answerLetters,
找到内容: answerContents
}
);
answerFailed++;
return;
}
// -------------------------------------------------
// 保存答案
// -------------------------------------------------
answers[questionNumber] = {
multiple: isMultiple,
contents: answerContents
};
console.log(
`第${questionNumber}题:` +
`${answerLetters.join('、')} → ` +
`${answerContents.join(' || ')}`
);
answerSuccess++;
});
console.log(
'=============================='
);
console.log(
`📖 答案获取完成:成功 ${answerSuccess} 题,失败 ${answerFailed} 题`
);
console.log(
'答案已经保存到内存:',
answers
);
console.log(
'=============================='
);
// =====================================================
// 答案不完整 → 停止
// =====================================================
if (answerFailed > 0) {
console.error(
'❌ 有题目答案获取失败,停止执行。'
);
alert(
`答案获取失败:${answerFailed} 道题。\n\n` +
'为避免错误答题,脚本已停止。'
);
return;
}
// =====================================================
// 第四步:寻找「重新答题」或「继续答题」
// =====================================================
const buttons =
document.querySelectorAll(
'.do-topic-header .function-btn button'
);
let actionButton = null;
let actionName = '';
// -----------------------------------------------------
// 第一优先级:重新答题
// -----------------------------------------------------
buttons.forEach((button) => {
const text =
normalizeText(
button.textContent
);
if (
!actionButton &&
text === '重新答题'
) {
actionButton = button;
actionName =
'重新答题';
}
});
// -----------------------------------------------------
// 第二优先级:继续答题
// -----------------------------------------------------
if (!actionButton) {
buttons.forEach((button) => {
const text =
normalizeText(
button.textContent
);
if (
!actionButton &&
text === '继续答题'
) {
actionButton = button;
actionName =
'继续答题';
}
});
}
// -----------------------------------------------------
// 两个按钮都不存在
// -----------------------------------------------------
if (!actionButton) {
console.error(
'❌ 没有找到「重新答题」或「继续答题」按钮'
);
alert(
'没有找到「重新答题」或「继续答题」按钮。\n\n' +
'请确认当前页面处于作业答题页面。'
);
return;
}
console.log(
`🔄 找到「${actionName}」按钮`
);
// =====================================================
// 第五步:记录旧题目 DOM 状态
// =====================================================
const oldQuestions =
Array.from(
document.querySelectorAll(
'.store-question-item-container'
)
);
const oldQuestionCount =
oldQuestions.length;
const oldFirstQuestion =
oldQuestions[0] || null;
const oldFirstQuestionHTML =
oldFirstQuestion
? oldFirstQuestion.outerHTML
: '';
console.log(
`📌 当前题目数量:${oldQuestionCount}`
);
// =====================================================
// 第六步:点击答题按钮
// =====================================================
actionButton.click();
console.log(
`✅ 已点击「${actionName}」`
);
console.log(
'💬 等待作业确认 Dialog...'
);
// =====================================================
// 第七步:统一等待作业 Dialog
// =====================================================
waitFor(() => {
const dialogs =
document.querySelectorAll(
'.el-message-box__wrapper'
);
for (const dialog of dialogs) {
const message =
normalizeText(
dialog.textContent
);
const isContinueDialog =
message.includes(
'继续上次未提交的作业'
);
const isResetDialog =
message.includes(
'是否将作业重置为初始状态,重新答题'
);
if (
isContinueDialog ||
isResetDialog
) {
return dialog;
}
}
return false;
}, 10000)
.then((dialog) => {
console.log(
'💬 检测到作业确认 Dialog'
);
console.log(
'提示内容:',
normalizeText(
dialog.textContent
)
);
// =================================================
// 第八步:寻找「确认」
// =================================================
const confirmButton =
Array.from(
dialog.querySelectorAll(
'.el-message-box__btns button'
)
)
.find((button) => {
return normalizeText(
button.textContent
) === '确认';
});
if (!confirmButton) {
console.error(
'❌ Dialog 中没有找到「确认」按钮'
);
alert(
'检测到了作业确认弹窗,但没有找到「确认」按钮。'
);
return;
}
console.log(
'✅ 找到「确认」按钮'
);
console.log(
'🖱️ 自动点击「确认」'
);
confirmButton.click();
console.log(
'✅ 已确认'
);
// =================================================
// 第九步:等待题目重新加载
// =================================================
console.log(
'⏳ 等待题目重新加载...'
);
waitFor(() => {
const newQuestions =
Array.from(
document.querySelectorAll(
'.store-question-item-container'
)
);
// ---------------------------------------------
// 情况1:
// 旧的第一题 DOM 已经被替换
// ---------------------------------------------
if (
oldFirstQuestion &&
!document.contains(
oldFirstQuestion
)
) {
console.log(
'🔄 检测到旧题目 DOM 已被替换'
);
return newQuestions;
}
// ---------------------------------------------
// 情况2:
// 题目数量发生变化
// ---------------------------------------------
if (
newQuestions.length > 0 &&
newQuestions.length !==
oldQuestionCount
) {
console.log(
'🔄 检测到题目数量发生变化'
);
return newQuestions;
}
// ---------------------------------------------
// 情况3:
// 第一题 HTML 发生变化
// ---------------------------------------------
if (
oldFirstQuestion &&
newQuestions[0]
) {
const newFirstQuestionHTML =
newQuestions[0].outerHTML;
if (
newFirstQuestionHTML !==
oldFirstQuestionHTML
) {
console.log(
'🔄 检测到第一题内容发生变化'
);
return newQuestions;
}
}
return false;
}, 15000)
.then(() => {
const newQuestions =
document.querySelectorAll(
'.store-question-item-container'
);
console.log(
`✅ 新题目已经加载:${newQuestions.length} 道`
);
// =================================================
// 第十步:给 Vue 留一点时间
// =================================================
setTimeout(() => {
fillAnswers(
answers
);
}, 500);
})
.catch((error) => {
console.error(
'❌ 等待新题目失败:',
error
);
alert(
'确认后等待新题目加载超时。\n\n' +
'请检查页面是否已经重新加载。'
);
});
})
.catch((error) => {
console.error(
'❌ 没有检测到作业确认 Dialog:',
error
);
alert(
'点击答题按钮后,没有检测到确认弹窗。\n\n' +
'请检查当前页面状态。'
);
});
})
.catch((error) => {
console.error(
'❌ 等待参考答案失败:',
error
);
alert(
'等待参考答案加载超时。'
);
});
// =========================================================
// 第十一步:自动填充答案
// =========================================================
function fillAnswers(answers) {
console.log(
'=============================='
);
console.log(
'✏️ 开始自动填充答案'
);
console.log(
'=============================='
);
const questions =
document.querySelectorAll(
'.store-question-item-container'
);
console.log(
`页面找到 ${questions.length} 道题`
);
let success = 0;
let failed = 0;
questions.forEach((question) => {
// -------------------------------------------------
// 获取题号
// -------------------------------------------------
const headerEl =
question.querySelector(
'.item-question-header .header-left'
);
if (!headerEl) {
console.warn(
'❌ 找不到题目 Header'
);
failed++;
return;
}
const numberMatch =
headerEl.textContent.match(
/^\s*(\d+)/
);
if (!numberMatch) {
console.warn(
'❌ 无法获取题号:',
headerEl.textContent
);
failed++;
return;
}
const questionNumber =
parseInt(
numberMatch[1],
10
);
// -------------------------------------------------
// 获取保存的答案
// -------------------------------------------------
const answer =
answers[questionNumber];
if (!answer) {
console.warn(
`❌ 第${questionNumber}题:没有保存的答案`
);
failed++;
return;
}
// -------------------------------------------------
// 获取当前题目所有选项
// -------------------------------------------------
const options =
question.querySelectorAll(
'.option-item'
);
let questionSuccess = true;
// -------------------------------------------------
// 逐个答案内容寻找对应选项
// -------------------------------------------------
answer.contents.forEach(
(correctContent) => {
let target = null;
options.forEach(
(option) => {
const contentEl =
option.querySelector(
'.option-content'
);
if (!contentEl) {
return;
}
const content =
normalizeText(
contentEl.textContent
);
if (
content ===
correctContent
) {
target = option;
}
}
);
if (!target) {
console.warn(
`❌ 第${questionNumber}题:找不到选项「${correctContent}」`
);
questionSuccess =
false;
return;
}
// -------------------------------------------------
// 获取 A/B/C/D
// -------------------------------------------------
const letterEl =
target.querySelector(
'.option-index'
);
if (!letterEl) {
console.warn(
`❌ 第${questionNumber}题:找到答案,但没有找到 option-index`
);
questionSuccess =
false;
return;
}
const letter =
normalizeText(
letterEl.textContent
);
console.log(
`第${questionNumber}题 → ` +
`${letter} → ` +
`${correctContent}`
);
// -------------------------------------------------
// 点击选项
// -------------------------------------------------
letterEl.click();
console.log(
`第${questionNumber}题 → ` +
`${letter} → 已点击`
);
}
);
// -------------------------------------------------
// 统计
// -------------------------------------------------
if (questionSuccess) {
success++;
} else {
failed++;
}
});
console.log(
'=============================='
);
console.log(
`🎉 自动填充完成:成功 ${success} 题,失败 ${failed} 题`
);
console.log(
'=============================='
);
if (failed === 0) {
console.log(
'✅ 所有题目均已执行点击'
);
} else {
console.warn(
`⚠️ 有 ${failed} 道题填充失败,请检查上面的日志`
);
}
}
})();