学校系统在线操作

落子 125 阅读 杂篇站内

展开并获取所有答案

(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} 道题填充失败,请检查上面的日志`
            );

        }


    }


})();