You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中如何将fetch获取的二进制数据写入文件?Selenium返回buffer为空如何解决

核心原因:selenium-webdriver的executeScript方法在传递返回值时,会将浏览器上下文的对象做JSON序列化转换,仅支持字符串、数字、布尔值、普通对象、数组这类JSON兼容类型,ArrayBuffer属于二进制类型无法被序列化,因此返回后会变成空对象。

解决方案1:将二进制数据转为Base64字符串回传(适用需要浏览器上下文请求的场景)

如果目标资源需要依赖当前页面的登录凭证、跨域限制只能在当前页面上下文请求,可以在浏览器侧执行fetch的时候直接把ArrayBuffer转成Base64字符串再返回,字符串可以正常序列化传递,Node侧拿到后再转成Buffer写入文件,代码示例如下:

var path = require('path');
var webdriver = require("selenium-webdriver");
var chrome = require('selenium-webdriver/chrome');
var By = webdriver.By;
var until = webdriver.until
const fs = require("fs");
var o = new chrome.Options();
o.addArguments("--disable-web-security");
var browser = new webdriver.Builder().forBrowser('chrome').setChromeOptions(o).build();

var promise1 = browser.executeScript(`
return fetch("https://upload.wikimedia.org/wikipedia/commons/9/9d/Blue_Flower.png")
  .then(res => res.arrayBuffer())
  .then(buffer => {
    // 把ArrayBuffer转成Base64字符串
    return btoa(String.fromCharCode(...new Uint8Array(buffer)));
  });
`)
promise1.then(base64Str => {
  // 把base64转成Node Buffer写入文件
  const buffer = Buffer.from(base64Str, 'base64');
  fs.writeFile("flower.png", buffer, () => console.log("done"))
})

解决方案2:直接在Node侧请求资源(无登陆态/跨域限制时优先用)

最开始报错fetch未定义是因为fetch是浏览器专属API,Node原生环境没有内置,安装node-fetch或者直接用Node内置的http/https模块就能直接请求资源,不需要走浏览器上下文,性能更高逻辑更简单:

  1. 先安装依赖:npm install node-fetch@2(v2版本支持CommonJS规范,适配当前的require引入方式,v3仅支持ESM规范)
  2. 代码示例:
const fs = require("fs");
const fetch = require("node-fetch");

fetch("https://upload.wikimedia.org/wikipedia/commons/9/9d/Blue_Flower.png")
  .then(res => res.arrayBuffer())
  .then(buffer => fs.writeFile("flower.png", Buffer.from(buffer), () => console.log("done")))

内容的提问来源于stack exchange,提问作者David Lui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:45:01