网站搜索

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。

步骤:

  1. 从 https://nodejs.org/ 下载并安装 nodejs
  2. 选择您是否想使用 puppeteer 或 jsdom(如上所述详细说明)。
  3. 为你的项目创建一个目录并进入该目录:mkdir javascript && cd javascript
  4. 使用 npm(Node 包管理器)初始化目录:npm init -y
  5. 如果你选择 puppeteer:

    • 安装 puppeteer: npm install 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
  6. 如果你选择 jsdom:

    • 安装 jsdom: npm install 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!”。