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

No one assigned

    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