Skip to content

Feature Request: 支持文件上传和下载命令 (DOM.setFileInputFiles / Page.setDownloadBehavior) #70

Description

@cherishorz

使用场景

在实际的 AI Agent 自动化工作流中,经常需要让 bsk 帮用户上传本地图片到网页(如 Google Flow / 各类生图平台),或者下载网页生成的高清图片到本地。

当前问题

bsk 目前没有 uploaddownload 命令,导致:

  1. 上传:点击网页的"上传"按钮后,系统弹出原生文件选择对话框,bsk 无法操控系统级窗口。只能用 request-help 让用户手动操作。
  2. 下载:网页触发的下载(如 Google Flow 的 2K upsample 下载)会保存到 Agent Window 的隔离 Chrome profile 中,用户本地的 Downloads 目录拿不到文件。Canvas 提取 + base64 变通方案受限于显示分辨率和 CORS。

提出的方案

利用 Chrome DevTools Protocol 的标准命令,在 bsk 中新增两个命令:

bsk upload

bsk upload --session <SID> --selector "input[type=file]" --file /path/to/image.png

底层调用 CDP DOM.setFileInputFiles,直接向 <input type="file"> 元素注入本地文件路径,完全绕过系统文件选择对话框。这是 Playwright (page.setInputFiles)、Puppeteer (elementHandle.uploadFile)、Selenium CDP 等所有主流浏览器自动化框架的标准做法。

实现逻辑:

  1. 通过 CSS selector 或 ref 定位 <input type="file"> 元素
  2. 获取元素的 backendNodeId
  3. 调用 chrome.debugger.sendCommand({tabId}, "DOM.setFileInputFiles", {files: [absolutePath], backendNodeId})
  4. 派发 change 事件通知页面

bsk download

bsk download --session <SID> --dir /path/to/downloads

底层调用 CDP Browser.setDownloadBehavior,将下载目录重定向到用户指定的本地路径,这样 Agent Window 中的下载就能直接保存到用户的文件系统。

技术可行性

bsk 的浏览器扩展已经在使用 chrome.debugger API 来实现现有的 click/fill/navigate 等命令。DOM.setFileInputFilesBrowser.setDownloadBehavior 是同一 CDP 命名空间下的标准命令,扩展已有 "debugger" 权限即可直接调用,无需新增权限。

我在 WorkerBuddy + bsk v0.1.9 的 Agent Window 中测试过,chrome 对象在页面上下文中不可直接访问 chrome.debugger,但这在扩展的 background/service worker 上下文中是完全可以的——bsk 现有的所有命令本身就是在这个上下文中通过 CDP 实现的。

影响范围

这两个命令将显著提升 bsk 在以下场景中的自动化能力:

  • AI 生图平台(Google Flow、Midjourney、Stable Diffusion WebUI 等)
  • 文档/附件上传类工作流(邮件、表单、CMS 等)
  • 任何需要"上传本地文件到网页"或"从网页下载生成物到本地"的 AI Agent 场景

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions