上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖

编写脚本自动随机答题的一些思路及小成果

[复制链接]
  • TA的每日心情
    擦汗
    2023-4-18 13:55
  • 签到天数: 34 天

    [LV.5]常住居民I

    11

    主题

    38

    回帖

    67

    积分

    初级工程师

    积分
    67
    发表于 2023-2-16 14:04:21 | 显示全部楼层 | 阅读模式

    本帖最后由 ZYMKJ 于 2023-2-17 11:46 编辑

    本帖最后由 ZYMKJ 于 2023-2-16 14:04 编辑

    最近再写一个在线学习的脚本。每一个课程学完,需要做随堂练习,并且需要达到一定分数才能进入下一个课程。手动答题比较比较耽误做其他工作,所以学习了2天,写了一段简单的答题代码,所有答题均随机。

    备注:所有答案选项的ID 都是统一格式:#questions_0_0 (第一题第一个选项),#questions_1_1 (第2题第二个选项)。

    判断题:2选1,比较简单,50%的成功率。代码如下:0

    var pd = function(){return Math.random() < 0.5 ? 0 : 1}  //随机生成0和1
    document.querySelector('#questions_0_'+pd()).click()  //搜索带入变量pd

    单选题:4选1,也还算简单,25%的成功率。代码如下:

    var dx = function(){return Math.floor(Math.random()*4)}  //随机生成一个大于等于0,小于3的数
    document.querySelector('#questions_1_'+dx()).click()

    多选题:比较复杂,在学习2天后,用了1天尝试了多种方法后完成,代码如下:

    var xxgs =document.querySelectorAll('[id^="questions_2_"]').length //xxgs选项个数
    var a= new Array();
    var b = document.querySelectorAll('[id^="questions_1_"]')  //把所有答案选项,放入列表
    //下面代码为,列表b全部元素转为数组a的对象,为随机排序做准备
    for (let i = 0; i < xxgs; i++) {
        var ele = b[i];
        a.push(ele); 
    }   
    //下列代码:给数组a随机排序,并导入数组c。(洗牌算法,排序概率比较平均)
    var c
    function shuffle(array){
        let res = [], random;
        while(array.length>0){
            random = Math.floor(Math.random()*array.length);
            res.push(array[random]);
            array.splice(random, 1);
           }
        return res;
    }
    c=shuffle(a);
    //随机生成多选,选几个答案
    var xjg = function(){return Math.round(Math.random()*(xxgs-2)+2)} 
    //for循环,选择随机排序数组c的前xjg答案
    for(let j=0;j<xjg;j++){
        c[j].click();
    }

    提交答案:这个就简单了。

    setTimeout(document.querySelector('#submitBt').click(),200)

    PS. 把过程进行了封装,直接调用就OK。更新代码如下:

    /*
    说明:
        1、DXT:单选;
        2、PDD:判断题
        3、duoXuan:多项选择题
        4、DJT:第几道题
        5、XXGS:选项个数
        6、MAX:最多选几个答案
        7、MIN:最少选几个答案
        举例:
        duoXuan(3,5,5,2)
        多项选择题,第3道题,一共5个选项,最多选5个,最少选2个
    */
    
    function DXT(DJT,XXGS){
        let XH = DJT-1
        let dx = function(){return Math.floor(Math.random()*XXGS)}  
        document.querySelector('#questions_'+XH+'_'+dx()).click()
    }
    
    function PDD(DJT,XXGS){
        let XH = DJT-1
        let pd = function(){return Math.random() < 0.5 ? 0 : 1}     
        document.querySelector('#questions_'+XH+'_'+pd()).click()
    }
    
    function duoXuan(DJT,XXGS,MAX,MIN){
        let a = new Array();
        let XH = DJT-1;
        for (let m =0;m<XXGS;m++){
            let ele = document.querySelector('#questions_'+XH+'_'+m);
            a.push(ele);
        }
        function shuffle(array){
            let res = [], random;
            while(array.length>0){
                random = Math.floor(Math.random()*array.length);
                res.push(array[random]);
                array.splice(random, 1);
            }
            return res;
        }
        let c = shuffle(a)
        let xjg = function(){return Math.floor(Math.random()*(MAX-MIN+1)+MIN)}
        for(let j=0;j<xjg;j++){
            c[j].click();
        }
    }
  • TA的每日心情
    慵懒
    16 小时前
  • 签到天数: 811 天

    [LV.10]以坛为家III

    31

    主题

    552

    回帖

    1555

    积分

    荣誉开发者

    积分
    1555

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 2023-2-16 14:24:37 | 显示全部楼层
    1. const num=5; //选项数量
    2. const arr=[...Array(5)].map((_,i)=>i) //初始化选项
    3. arr.sort(()=>Math.random()-0.5) //随机排序
    4. const result=arr.slice(0,Math.floor(num*Math.random())) //随机数量
    复制代码

    随便写的多选题随机,没有算法纯随机
    回复

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2023-2-16 14:27:39 | 显示全部楼层
    一般就取选项的element,一般是数组,然后Math.random生成数组下标操作了
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5960

    回帖

    6759

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6759

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-2-16 14:29:04 | 显示全部楼层
    如果题量低可以考虑
    https://bbs.tampermonkey.net.cn/ ... mp;highlight=sqlite
    node+sqlite分词搜索,一个下午就能搭出来服务器
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2023-4-18 13:55
  • 签到天数: 34 天

    [LV.5]常住居民I

    11

    主题

    38

    回帖

    67

    积分

    初级工程师

    积分
    67
    发表于 2023-2-16 14:29:23 | 显示全部楼层
    steven026 发表于 2023-2-16 14:24
    随便写的多选题随机,没有算法纯随机

    这个随机,我看过。随机不平均。所以没用。。
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2023-4-18 13:55
  • 签到天数: 34 天

    [LV.5]常住居民I

    11

    主题

    38

    回帖

    67

    积分

    初级工程师

    积分
    67
    发表于 2023-2-16 14:37:02 | 显示全部楼层
    王一之 发表于 2023-2-16 14:27
    一般就取选项的element,一般是数组,然后Math.random生成数组下标操作了

    <input type="radio" id="questions_0_0" name="examPaper.questions[0].selectionAnswers[0].selected"                                                                                                                                                                                value="true"                                                                                                                                                                                onclick="passValue(this,'questions_0')" />                                                                                                                                                                        产品用料                                                                                                                                                                        <br />

    怎么应该怎么根据element 选择呢?
    回复

    使用道具 举报

  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4189

    回帖

    4056

    积分

    管理员

    积分
    4056

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2023-2-16 14:53:11 | 显示全部楼层
    ZYMKJ 发表于 2023-2-16 14:37
    产品用料                                                                                                                                                                       

    怎么应该怎么根据element 选择呢? ...

    应该都有特征的,可以

    类似 document.querySelector("[type='radio']") 这样,会一个element数组
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2023-4-18 13:55
  • 签到天数: 34 天

    [LV.5]常住居民I

    11

    主题

    38

    回帖

    67

    积分

    初级工程师

    积分
    67
    发表于 2023-2-17 08:04:52 | 显示全部楼层
    王一之 发表于 2023-2-16 14:53
    应该都有特征的,可以

    类似 document.querySelector("[type='radio']") 这样,会一个element数组 ...

    OK 我试试
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表