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

如何在Playwright中绕过或自动接受window.showDirectoryPicker()触发的Chrome文件编辑权限弹窗?

如何在Playwright中绕过或自动接受window.showDirectoryPicker()触发的Chrome文件编辑权限弹窗?

嘿,刚好我之前碰到过类似的测试场景,给你几个实用的方案,你可以根据自己的需求来选:

1. 模拟File System Access API(最推荐,可控性强)

你核心是要测试websocket接收压缩块、客户端重建文件的逻辑,其实完全没必要真的触发系统的文件选择弹窗——直接在页面加载前注入脚本,覆盖原生的window.showDirectoryPicker()方法,返回一个模拟的目录句柄就行。这样既绕开了权限弹窗,还能直接捕获写入的文件数据,方便做测试断言。

示例代码(JavaScript):

// 在创建页面或上下文时注入初始化脚本
await page.addInitScript(() => {
  // 模拟一个目录句柄,适配你的文件写入逻辑
  const mockDirHandle = {
    getFileHandle: async (fileName) => ({
      createWritable: async () => ({
        // 这里可以捕获写入的二进制数据,直接做断言验证
        write: async (chunk) => {
          // 比如把chunk存到全局变量,后面在测试里取出来断言
          window.testDownloadedChunk = chunk;
        },
        close: async () => {}
      })
    })
  };

  // 覆盖原生的showDirectoryPicker方法
  window.showDirectoryPicker = async () => mockDirHandle;
});

用这个方法的话,你甚至不需要依赖真实的文件系统,就能验证文件重建的核心逻辑,在CI环境里也能稳定运行,比用AutoIt这种外部工具靠谱多了。

2. 配置Playwright权限+Chrome启动参数(真实操作文件系统时用)

如果你必须验证文件是否真的写入到本地目录,那可以通过Playwright的权限配置和Chrome启动参数来自动放行权限:

  • 第一步,创建浏览器上下文时,授予fileSystem权限:
    const context = await browser.newContext({
      permissions: ['fileSystem']
    });
    
  • 第二步,启动Chrome时添加允许文件系统访问的参数:
    const browser = await chromium.launch({
      args: [
        '--allow-file-access-from-files',
        '--enable-features=FileSystemAccessAPI'
      ]
    });
    

不过要注意,不同Chrome版本的启动参数可能有小变化,你可以根据自己用的版本调整。另外如果是测试本地页面,可能还需要加--unsafely-treat-insecure-origin-as-secure=http://localhost:你的端口来放行权限。

3. 拆分测试逻辑(兼顾效率和覆盖)

既然你的核心是验证websocket接收+文件重建的逻辑,不如把这部分逻辑从前端页面中抽成独立的工具函数,先写单元测试直接覆盖这部分逻辑;然后E2E测试只需要验证用户触发下载、调用这个工具函数的流程就行——这样E2E部分完全不用碰文件系统权限的问题,测试速度更快,也更稳定。

备注:内容来源于stack exchange,提问作者Alan Barrientos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:18:15