当前位置: 首页 > news >正文

3行代码搞定页面截图,Bun.WebView真的简单

就 3 行:

await using view=new Bun.WebView();await view.navigate("https://example.com");await Bun.write("out.png", await view.screenshot());
bun run demo.ts

完事儿。


痛点:装 Puppeteer 太烦

想截个网页图。

npm i puppeteer

300MBChromium 下起来。

Linux 还得装libatk``libnss3一堆系统包。

折腾半小时,截图没拿到。

Bun.WebView就是来治这个的。

Bun v1.3.12 内置,啥都不用装。


简单在哪

macOS:用系统 WKWebView,零配置。

Linux/Windows:自动找本地 Chrome / Edge / Chromium。

事件是原生的。

view.click()view.type()派发的是操作系统级事件。

isTrusted一定为 true。

网站识别不出你是机器人。


装一下 Bun

需要 v1.3.12 以上:

curl-fsSLhttps://bun.sh/install|bashbun--version

完事儿后bun run demo.ts就能跑。


再多 3 行:拿页面数据

const view=new Bun.WebView();await view.navigate("https://example.com");const title=await view.evaluate("document.title");console.log(title);

evaluate在页面里跑 JS。

直接返回 JSON 可序列化的值。

Promise 自动 await。

// 跑个 fetch const data=await view.evaluate(`fetch("/api/list").then(r=>r.json())`);

模拟真人操作

await view.click("input[name='q']");await view.type("Bun WebView 真香");await view.press("Enter");

click会自动等。

等元素挂载、可见、稳定、不被遮挡。

type是真键盘事件。

不是直接改 input.value。

Vue、React 监听器照样能触发。

// 双击 + Shift await view.click("a.link",{button:"left", count:2, modifiers:["Shift"], timeout:5000,});

滚动、改窗口也都简单:

await view.scroll(0,600);// 向下滚600像素 await view.resize(1920,1080);// 改窗口大小

截图的几种姿势

全页截图:

await Bun.write("full.png", await view.screenshot({format:"png", fullPage:true}));

指定元素:

const header=await view.screenshot({format:"jpeg", quality:85, selector:"header.banner",});await Bun.write("header.jpg", header);

支持 png、jpeg、webp。

WebP 通常比 PNG 小 30% 以上。

返回的是 Buffer。

塞进任何地方都行。


后端手动指定

不靠默认查找的话:

const view=new Bun.WebView({backend:{type:"chrome", path:"/usr/bin/google-chrome",},});

调试时连已有 Chrome 更省事:

chrome --remote-debugging-port=9222
const view=new Bun.WebView({backend:{type:"chrome", url:"ws://127.0.0.1:9222/devtools/browser/xxx",},});

启动一次 Chrome,后台挂着。

不必每次跑都新开。


实战:抓一批文章标题

// crawl.ts const urls=["https://bun.sh/blog","https://bun.sh/docs","https://bun.sh/docs/cli/run",];await using view=new Bun.WebView();for(const url of urls){await view.navigate(url);const title=await view.evaluate(`document.querySelector("h1")?.textContent||document.title`);console.log(`${url}->${title}`);}

每个 view 共享一个浏览器子进程。

开多个 view 等于开多个标签页。

比 Puppeteer 启动快多了。


想保存登录态

dataStore一行就够:

const view=new Bun.WebView({dataStore:{directory:"./browser-profile"},});

cookies、localStorage 都存盘。

登录一次,下次直接用。


抓页面日志

前端报错想看?

const view=new Bun.WebView({console:(type,...args)=>{console.log(`[页面 ${type}]`,...args);},});

console.logconsole.error全部捕获。

比开 DevTools 还方便。


需要 CDP 原生命令也行

// 发命令 const result=await view.cdp("Page.getLayoutMetrics");console.log(result);// 订阅事件 const off=view.cdpSubscribe("Network.requestWillBeSent",(params)=>{console.log("请求 URL:", params.request.url);});await view.navigate("https://example.com");off();// 取消订阅

网络拦截、性能监控、Cookie 操控这些,CDP 能干的全能干。


注意事项

Bun.WebView 还在实验阶段。

API 以后可能变。

用前确认 Bun ≥ 1.3.12。

Linux 上要装 Chrome:

sudoaptinstallgoogle-chrome-stable

macOS 自带 WebKit,零配置。

还有个坑:

每次跑完会留临时目录。

Linux 在/tmp/bun-chrome-xxx

await using自动释放。

否则磁盘可能爆掉。


总结一下

Bun.WebView 就干了这一件事:

让截图和浏览器自动化变简单。

  • • 3 行代码截图

  • • macOS 零配置

  • • 原生事件,反爬不了

  • • 跟 Playwright 像的 API

Puppeteer、Playwright 不是不能装。

但能少装就少装,能少配就少配。

用 Bun.WebView 就图个省事儿。


觉得有用?点个在看、转发

评论区聊聊,你拿 Bun.WebView 干了啥?

下篇写Bun.S3 全家桶

下篇见。👋

http://www.jsqmd.com/news/1111072/

相关文章:

  • 好的,这是一个符合您所有要求的CSDN标题:GEO服务技术解析与行业应用
  • Loop Engineering 实战拆解:Andrew Ng的三大产品开发循环如何让AI Agent真正“造对”产品
  • WordPress+WooCommerce跨境电商独立站主题选择与维护
  • Playnite:免费开源的多平台游戏库管理器终极解决方案
  • 摸清AI下属的特性,让他向你汇报工作
  • APKMirror安卓客户端:如何安全获取历史版本APK的终极指南
  • 用ChatGPT批量处理Excel数据,真的不用写一行代码?——2024最新Prompt工程实战手册(含12类财务/HR/销售场景)
  • 终极指南:如何用gdsdecomp轻松解密Godot游戏资源
  • 15个VTube Studio插件开发工具:从零开始打造虚拟主播互动体验
  • 第09章:Docker Compose 编排
  • C++23新特性在CLion中的实战体验:从语法糖到生产力提升
  • 如何准确研判企业技术需求,避免伪需求和低效匹配?
  • 2026Word文档压缩实操指南:带图文文档轻量化、官方瘦身完整操作教程
  • 10分钟搞定Joy-Con手柄连接电脑:从蓝牙配到游戏畅玩的完整方案
  • CentOS 7.9 64位 PostgreSQL安装和配置指南
  • 2026多端AI抠图工具指南:免费付费网页电脑手机软件实操教程
  • 杰理之获取设备总数【篇】
  • 【BMS上位机UI(C#)】
  • 如何利用AI图像分层工具将单张插画秒变PSD分层文件:设计师的终极效率革命
  • StepCI:统一API测试框架,高效覆盖HTTP与GraphQL协议
  • 计算机Java毕设实战-基于 SpringBoot 的高校学生部门资料归档管理系统的设计与实现 校园学生会组织活动运维管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 2026免费音频转文字工具全解:电脑手机在线离线工具实操指南
  • 100_VSCOLD常用安装插件(持续更新)
  • 5分钟快速上手!NHSE动物森友会存档编辑器完整指南
  • 智能音频处理实战:Audacity AI效果插件如何革新专业工作流
  • 1979年7月1日:索尼 Walkman 问世——砍掉核心功能的“半残系统”,如何跑成数码史上最伟大的 Feature?
  • 【鸿蒙ArkTS】极简登录注册页面+页面跳转+密码校验
  • 2026年最新英语单词学习APP 很多老师都在用适合学生日常练词汇
  • 2026Word文件压缩至10M完整实操指南,含官方步骤、图片瘦身与清理隐藏内容技巧
  • 如何三步搞定网易云QQ音乐歌词?163MusicLyrics终极免费工具完整指南