使用Node命令行注入Gremlins.js代码时遭遇document未定义错误
解决Node命令行注入gremlins.js时出现的
ReferenceError: document is not defined错误 嘿,这个问题其实很典型——你混淆了浏览器端脚本和Node.js服务器端环境的运行差异啦!
为什么会报错?
- 你写的这段代码是专门给浏览器用的书签脚本(bookmarklet),它依赖浏览器提供的
document、window这类DOM API来操作网页。但Node.js是服务器端运行环境,根本没有这些浏览器专属的对象,直接在Node命令行跑肯定会抛出ReferenceError。 - 再补充下:gremlins.js本身就是为浏览器设计的工具,用来模拟用户随机操作(点击、输入、滚动等)测试网页稳定性,它的运行前提必须是存在完整的浏览器DOM环境。
正确的使用方式
方式一:直接在浏览器里用(最简便)
把这段代码复制到浏览器的书签地址栏,或者创建一个新书签,把代码粘贴到书签的「URL」字段里。之后打开你要测试的网页,点击这个书签,就能自动加载gremlins.js并在当前网页上运行测试了。
方式二:用无头浏览器在Node环境中自动化运行
如果想在Node环境里自动化测试网页,可以借助无头浏览器工具(比如Puppeteer、Playwright)来模拟浏览器环境,再注入你的脚本。这里给你一个Puppeteer的示例:
const puppeteer = require('puppeteer'); (async () => { // 启动无头浏览器,设为false可以看到浏览器窗口 const browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); // 打开你要测试的目标网页 await page.goto('https://your-target-page.com'); // 在浏览器页面中注入并运行gremlins脚本 await page.evaluate(() => { function callback(){gremlins.createHorde().unleash()} var s=document.createElement("script"); s.src="https://rawgithub.com/marmelab/gremlins.js/master/gremlins.min.js"; if(s.addEventListener){ s.addEventListener("load",callback,false) }else if(s.readyState){ s.onreadystatechange=callback } document.body.appendChild(s); }); // 等待10秒让gremlins完成测试,时间可以按需调整 await new Promise(resolve => setTimeout(resolve, 10000)); // 关闭浏览器 await browser.close(); })();
运行前记得先安装Puppeteer:npm install puppeteer
内容的提问来源于stack exchange,提问作者SpadeSeveren
相关产品推荐
相关产品推荐

