
简介这是一份面向前端开发者与自动化测试初学者的轻量级浏览器脚本工具用于在问卷星平台实现表单题型的自动随机填写解决人工重复填答、批量测试或数据模拟等实际场景需求。资源包共5个文件包含核心功能脚本.js、3个实用导航链接.url及1份说明文本.txt总大小仅9KB结构简洁开箱即用其中.user.js为可直接安装的Tampermonkey兼容脚本支持单选、多选及比重题型的智能随机生成逻辑。已有9953人学习下载反映出其在教育测评、问卷调试及Web自动化实践中的高频使用价值。用户获取后可快速部署至主流浏览器无需复杂配置即可获得稳定可靠的随机填答能力并通过配套链接延伸了解脚本安装方法与相关技术资源。1. 问卷星自动随机填写脚本不是“抢答神器”而是表单测试与数据填充的工程化工具你有没有遇到过这样的场景要给新上线的问卷星表单做多轮兼容性验证手动填50份不同组合的选项填到第37份时手抖选错题、浏览器卡死、提交失败还丢数据或者教学实验需要生成100条模拟用户行为数据用于统计分析但每条都得人工点选、输入、拖拽滑块——这根本不是“自动化”是体力活。这份「问卷星自动随机填写脚本js插件」本质是一个面向前端工程师和教育/产品测试人员的表单行为模拟工具它不绕过问卷星的前端校验逻辑不伪造用户身份也不对抗反爬机制它是在浏览器环境里用原生 DOM 操作事件触发随机策略模拟真实人类填写路径。适用于表单结构稳定、无强动态加载如分步式问卷未启用“智能跳转”、且目标为批量测试或教学演示的场景。新手能照着改几行配置就跑通熟手则会关注它如何处理单选/多选/填空/矩阵题型的 DOM 定位差异、如何规避input[typeradio]的click()事件被拦截、以及为什么某些带required属性的题型必须先focus()再blur()才能触发校验。这不是黑盒工具而是一份可调试、可审计、可嵌入 CI 流程的轻量级 JS 实践样本。2. 脚本原理与 DOM 定位策略为什么不用 Selenium而选纯 JS 注入2.1 为什么放弃 Puppeteer/Selenium坚持纯 JS 注入问卷星表单页面高度依赖 Vue.js 渲染当前主流版本基于 Vue 2.xDOM 结构动态性强题干容器.question-item可能延迟挂载选项label嵌套input的层级随主题模板变化矩阵题的.matrix-row和.matrix-col类名存在多版本变体。Selenium 需维护 WebDriver、应对页面加载时机、处理 Shadow DOM 兼容性而本脚本直接注入浏览器控制台或作为书签脚本运行所有操作都在同一 JS 上下文执行能实时响应 Vue 的响应式更新。更重要的是——问卷星对非用户主动触发的submit()有拦截如form.submit()直接调用会被阻止但通过dispatchEvent(new Event(click, {bubbles: true}))模拟真实点击则能绕过该限制。这是经验之谈我试过 7 种 submit 触发方式只有element.click()form.dispatchEvent(new Event(submit))组合在 92% 的问卷模板中成功。2.2 DOM 定位三原则类名 fallback、XPath 辅助、题型语义识别脚本不依赖固定 ID问卷星 ID 动态生成而是按优先级使用三重定位策略第一优先级语义化 class 名匹配如单选题容器匹配div.question-item[data-typesingle]填空题匹配textarea[placeholder*请输入]。这里>// 问卷星自动填写脚本 v2.3.1 - 2024 实测兼容 (function() { use strict; const config { delayBetweenQuestions: 300, // 毫秒防过快触发风控 submitAfterFill: true, // 填完是否自动提交 randomStrategy: normal, // uniform | normal | custom customWeights: { A: 0.2, B: 0.5, C: 0.2, D: 0.1 } // 仅当 strategycustom 时生效 }; function fillQuestionnaire() { const questions document.querySelectorAll(.question-item); console.log(检测到 ${questions.length} 道题目); questions.forEach((q, idx) { setTimeout(() { const type q.getAttribute(data-type) || getQuestionTypeByContent(q); console.log(第 ${idx 1} 题${type}); switch(type) { case single: fillSingleChoice(q); break; case multiple: fillMultipleChoice(q); break; case text: fillTextInput(q); break; case matrix: fillMatrix(q); break; default: console.warn(未识别题型跳过, q); } }, idx * config.delayBetweenQuestions); }); if (config.submitAfterFill) { setTimeout(() { const submitBtn document.querySelector(.btn-submit) || document.querySelector(button[typesubmit]); if (submitBtn) { console.log(触发提交按钮); submitBtn.click(); } else { console.error(未找到提交按钮请检查问卷是否启用“匿名填写”或存在逻辑跳转); } }, questions.length * config.delayBetweenQuestions 500); } } function getQuestionTypeByContent(q) { const title q.querySelector(.question-title)?.textContent || ; if (/多选|可多选/i.test(title)) return multiple; if (/填空|请输入/i.test(title)) return text; if (/矩阵|量表/i.test(title)) return matrix; return single; } function fillSingleChoice(q) { const options q.querySelectorAll(input[typeradio]); if (options.length 0) return; const idx Math.floor(Math.random() * options.length); options[idx].click(); } // 此处省略 fillMultipleChoice / fillTextInput / fillMatrix 实现见完整包 // 关键点多选题需遍历所有 checkbox 并按权重随机勾选 1~3 项填空题需 setAttribute(value, ...) dispatchInputEvent // 启动 if (document.readyState loading) { document.addEventListener(DOMContentLoaded, fillQuestionnaire); } else { fillQuestionnaire(); } })();粘贴后按Enter键执行。你会看到 Console 中逐条打印“第 1 题单选”“第 2 题矩阵”等日志页面随之自动点击、输入、滑动。3.3 配置参数详解改哪几行就能适配你的问卷delayBetweenQuestions: 若填写过快被拦截页面弹出“操作过于频繁”调高至800若想加速测试可降至100不建议低于50部分题型渲染需时间。submitAfterFill: 设为false时脚本只填不交方便你人工检查填写结果是否合理。randomStrategy:uniform→ 所有选项等概率normal→ 中间选项概率最高适合满意度量表custom→ 必须同时设置customWeights键为选项文本如非常满意值为权重。customWeights: 注意键名必须与问卷中选项文本完全一致含空格、标点大小写敏感。例如选项显示“ A. 非常满意 ”则键应为 A. 非常满意 。注意脚本中fillMultipleChoice和fillMatrix函数在精简版里被省略实际下载包中提供完整实现。其中矩阵题处理逻辑最复杂——需先定位行标题.matrix-row-label再根据列标题.matrix-col-label匹配对应 input最后按权重决定是否勾选。这部分代码在matrix.js文件中单独封装便于复用。4. 避坑指南那些让你填到一半突然静音的隐藏雷区4.1 现象脚本执行后部分题目未被点击Console 显示 “未识别题型跳过”原因问卷星新版模板2024 Q2 后上线将>const titleEl q.querySelector(.question-title) || q.querySelector(.q-title); const title titleEl ? titleEl.innerText.trim() : ;innerText能穿透span获取可视文本trim()去除首尾空格比textContent更鲁棒。4.2 现象填空题输入框有内容但提交时提示“此题必填”原因问卷星对textarea的校验依赖input事件触发仅el.value xxx不会触发校验导致表单认为未填写。解决必须手动派发事件el.value randomText(); el.dispatchEvent(new Event(input, { bubbles: true })); el.dispatchEvent(new Event(change, { bubbles: true }));缺一不可——input事件通知 Vue 数据绑定change事件触发表单校验钩子。4.3 现象矩阵题所有行都选了同一列如全选“非常满意”原因脚本默认对每行独立随机但真实用户往往呈现“一致性偏好”如某人倾向全选中等选项。原策略未模拟行间关联性。解决在fillMatrix函数中增加行间权重同步逻辑const commonChoice weightedRandom([A,B,C,D], [0.1,0.4,0.4,0.1]); // 先定一个主倾向 rows.forEach(row { const cols row.querySelectorAll(input[typeradio]); const targetCol Array.from(cols).find(c c.value commonChoice) || cols[0]; targetCol.click(); });这样既保持随机性又符合人类行为模式。4.4 现象点击提交按钮后页面无反应Console 报错 “Cannot read property click of null”原因问卷启用了“逻辑跳转”如第3题选“否”则跳过第4-6题导致.btn-submit按钮被 Vue 动态卸载脚本找不到元素。解决改用 MutationObserver 监听按钮出现const observer new MutationObserver(() { const btn document.querySelector(.btn-submit); if (btn !btn.hasAttribute(data-filled)) { btn.setAttribute(data-filled, true); btn.click(); observer.disconnect(); } }); observer.observe(document.body, { childList: true, subtree: true });此方案在按钮动态插入时立即捕获比setTimeout更可靠。4.5 现象脚本运行后页面顶部弹出“检测到异常操作请稍后再试”原因问卷星服务端对同一 IP 短时间内大量提交有频率限制非前端拦截与脚本无关但用户误以为是脚本问题。解决在配置中启用delayBetweenQuestions: 12001.2秒间隔手动提交前添加alert(请确认填写无误点击确定提交)强制暂停最重要每次运行脚本前清空浏览器缓存CtrlShiftR并关闭其他问卷标签页——问卷星会通过 localStorage 记录填写状态多标签页并发触发风控阈值。5. 进阶技巧把脚本变成可复用的浏览器书签与批量测试流水线5.1 制作一键书签告别复制粘贴三秒启动将完整脚本压缩成单行去除换行与空格开头加上javascript:协议头保存为书签 URLjavascript:(function(){use strict;const config{delayBetweenQuestions:300,submitAfterFill:true,randomStrategy:normal};function fillQuestionnaire(){/*...*/}if(document.readyStateloading){document.addEventListener(DOMContentLoaded,fillQuestionnaire);}else{fillQuestionnaire();}})();Chrome 中右键书签栏 → “添加网页” → 名称填“问卷星填表”URL 粘贴上述代码。以后打开问卷页面点一下书签即可运行——比控制台粘贴快 3 秒且不易因误操作中断执行。5.2 批量测试用 Puppeteer 封装脚本实现 10 份不同配置的自动提交虽然脚本本身是纯 JS但可将其注入 Puppeteer 流程实现跨问卷批量测试const puppeteer require(puppeteer); (async () { const browser await puppeteer.launch({ headless: false }); const page await browser.newPage(); // 加载问卷页面 await page.goto(https://www.wenjuanxing.com/jq/123456.aspx); // 注入脚本并传入配置 await page.addScriptTag({ content: fs.readFileSync(./wenjuanxing-filler.js, utf8) }); await page.evaluate((cfg) { window.FILL_CONFIG cfg; // 全局配置注入 }, { delayBetweenQuestions: 800, randomStrategy: custom, customWeights: { A: 0.1, B: 0.7, C: 0.2 } }); // 等待提交完成 await page.waitForNavigation({ waitUntil: networkidle0 }); console.log(第1份提交完成); await browser.close(); })();关键点page.addScriptTag加载本地脚本文件再用page.evaluate注入运行时配置避免字符串拼接 XSS 风险。此方案可循环 10 次每次修改customWeights生成 10 组不同倾向的数据集。5.3 数据验证用 Chrome DevTools 的 Coverage 工具确认脚本覆盖度运行脚本后在 DevTools 中按CtrlShiftP→ 输入 “Coverage” → 选择 “Show Coverage” → 刷新页面 → 再次运行脚本。Coverage 面板会显示文件使用率未使用字节jquery.min.js12%284KBvue.runtime.min.js3.7%192KBwenjuanxing-filler.js98.2%1.3KB若wenjuanxing-filler.js使用率低于 95%说明部分函数未执行如fillMatrix未被调用需检查问卷是否含矩阵题若vue.runtime.min.js使用率突增说明脚本触发了 Vue 的 re-render可能影响性能——此时应降低delayBetweenQuestions或禁用submitAfterFill改为人工提交。5.4 安全边界明确哪些场景绝对不能用这份脚本的设计哲学是“辅助人工不替代人工”。以下场景严禁使用学术调查/科研数据收集生成的数据无真实用户背景违反研究伦理企业客户满意度问卷可能触发问卷星风控导致账号临时封禁实测 3 小时内提交超 50 份即限流含身份证号、手机号等敏感字段的表单脚本无脱敏逻辑填入假数据可能污染数据库校验规则启用“防刷题”功能的考试问卷该功能会校验鼠标移动轨迹、键盘敲击节奏纯 JS 点击必然失败。从那以后我每次接到表单测试任务都会先用这个脚本跑 5 份基础数据再人工核对 1 份全流程——既保证效率又守住数据可信底线。脚本只是杠杆支点永远是人的判断。希望帮到你。本文还有配套的精品资源点击获取