firefox - 我如何在没有浏览器的情况下执行 JavaScript 命令?
我如何在无头模式下运行 JavaScript?
我正在寻找一个类似于 Scratchpad(存在于 Firefox 中)的选项,它可以在特定网站上运行 JavaScript 并执行 DOM 操作,而无需浏览器,并且最好可以从命令行执行。
答案#1
我找到了一篇类似的帖子,其中对你的问题有一个相对最新的回答——从命令行运行基于 DOM 的 JavaScript
主要问题是浏览器实际上是创建你想要交互的 DOM 的工具。所以如果没有某种“浏览器”运行,我们就没有 DOM。但是有一些可用的工具(比如 Selenium)可以自动化/模拟启动浏览器、创建 DOM 并运行你的 JavaScript。
答案#2
我在这里经常看到提到 scratchpad(以及像 scratch js 这样的替代品),但你的问题特别是询问替代方案。Node.js 对此目的很适用,但默认情况下无法操作 DOM。目前有两个包可以稍微不同方式地处理这个问题。一个叫做 jsdom,它允许你从给定的源代码操作 DOM。既然你说你在寻找像 scratchpad 这样的解决方案,puppeteer 也可能适用。它使用无头 Chromium,并且允许你以编程方式控制 Chromium。我认为你想用 puppeteer,但技术上它使用的是浏览器,所以你可能会想使用 jsdom。
步骤:
- 从 https://nodejs.org/ 下载并安装 nodejs
- 选择您是否想使用
puppeteer或jsdom(如上所述详细说明)。 - 为你的项目创建一个目录并进入该目录:
mkdir javascript && cd javascript - 使用
npm(Node 包管理器)初始化目录:npm init -y 如果你选择
puppeteer:- 安装 puppeteer:
npm install puppeteer
- 安装 puppeteer:
创建并编辑 index.js,使其具有以下内容:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); await page.addScriptTag({content:` document.querySelector('div>h1').textContent = 'Example Puppeteer' `}) await page.evaluate(() => { document.querySelector('div>p').textContent = "Just another way to do things." }); // this ^ is slightly different because in the // first the javascript is being injected as a // script tag, while in the second the div>p is // actually being manipulated. The first would // probably be closer to scratchpad though. await page.screenshot({path: 'screenshot.png'}); await browser.close(); })();- 运行
node index.js - screenshot.png 中的截图应该是被操作过的 DOM
如果你选择
jsdom:- 安装 jsdom:
npm install jsdom
- 安装 jsdom:
创建并编辑 index.js:
const { JSDOM } = require('jsdom') const { document } = (new JSDOM(`<!DOCTYPE html><html><head></head><body><p>Hello</p></body></html>`)).window document.querySelector('p').textContent = 'Hello World!' console.log(document.querySelector('p').textContent) // Will output 'Hello World!'- 运行
node index.js - 你应该在你的控制台中看到“Hello World!”。
