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

Playwright page.setInputFiles()在GitHub Actions Firefox环境上传失败问题

Playwright Firefox在GitHub Actions中调用setInputFiles上传文件失败

问题概述

在GitHub Actions环境运行Playwright测试时,Firefox浏览器使用page.setInputFiles()方法上传文件会触发异常,本地测试无此问题,且Chrome、Safari浏览器下代码运行正常。预期文件可成功上传至页面的文件输入元素,但Firefox执行该方法时报错,导致测试失败。

已尝试的排查操作

  • 更新Playwright与Firefox至最新版本
  • 验证文件输入选择器的准确性
  • 更换测试文件内容及格式
    以上操作均未能解决问题。

测试代码

import { test } from '@playwright/test'

test('Upload', async ({ page }) => {
  await page.goto(`TestURL/login`)
  await page.getByRole('button', { name: 'Ok, accept all' }).click()
  await page.getByLabel('Email address').fill(`userEmail`)
  await page.getByLabel('Password').fill(`${user Pass}`)
  await page.getByRole('button', { name: 'Log In', exact: true }).click()
  await page.getByRole('link', { name: 'Create' }).click()
  await page.getByText('Upload new music').click()

  const metaData = {
    title: 'Mocked Song Title',
    artist: 'Mocked Song Artist',
    album: 'Mocked Song Album',
    picture: {
      mimeType: 'image/jpeg',
      buffer: Buffer.from(
        'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg==',
        'base64'
      ),
    },
  }
  const buffer = Buffer.alloc(1024 * 1024, 'a')
  const fileContent = Buffer.concat([
    Buffer.from('ID3'),
    Buffer.from([4, 0, 0, 0]),
    Buffer.from(JSON.stringify(metaData)),
    buffer,
  ])
  const mockedFilePath = './mockedFile.mp3'
  require('fs').writeFileSync(mockedFilePath, fileContent)

  await page
    .locator('div')
    .filter({ hasText: 'Click to upload music or drag and dropMP3' })
    .nth(1)
    .click()
  await page.setInputFiles('input[type="file"]', mockedFilePath)
  await page.locator('textarea').click()
  await page.locator('textarea').fill('Test upload')
  await page.locator('div').filter({ hasText: 'Change image' }).nth(1).click()
  await page.setInputFiles('input[type="file"]', {
    mimeType: 'image/jpeg',
    name: 'mockedImage.jpg',
    buffer: Buffer.from(
      'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg==',
      'base64'
    ),
  })
  await page.getByLabel('Title', { exact: true }).click()
  await page.getByLabel('Title', { exact: true }).fill('mocked song')
  await page.getByRole('button', { name: 'Upload music' }).click()
  await page.getByText('Song uploaded successfully').click()
})

报错信息

1) [firefox] › upload.spec.ts:3:5 › Upload ───────────────────────────────────────────────────────

frame.setInputFiles: Target closed
=========================== logs ===========================
waiting for locator('input[type="file"]')
============================================================

  37 |     .nth(1)
  38 |     .click()
> 39 |   await page.setInputFiles('input[type="file"]', mockedFilePath)
     |   ^
  40 |   await page.locator('textarea').click()
  41 |   await page.locator('textarea').fill('Test upload')
  42 |   await page.locator('div').filter({ hasText: 'Change image' }).nth(1).click()


Retry #1 ───────────────────────────────────────────────────────────────────────────────────────

frame.setInputFiles: Target page, context or browser has been closed

  37 |     .nth(1)
  38 |     .click()
> 39 |   await page.setInputFiles('input[type="file"]', mockedFilePath)
     |   ^
  40 |   await page.locator('textarea').click()
  41 |   await page.locator('textarea').fill('Test upload')
  42 |   await page.locator('div').filter({ hasText: 'Change image' }).nth(1).click()



Retry #2 ───────────────────────────────────────────────────────────────────────────────────────

frame.setInputFiles: Target closed
=========================== logs ===========================
waiting for locator('input[type="file"]')
============================================================

  37 |     .nth(1)
  38 |     .click()
> 39 |   await page.setInputFiles('input[type="file"]', mockedFilePath)
     |   ^
  40 |   await page.locator('textarea').click()
  41 |   await page.locator('textarea').fill('Test upload')
  42 |   await page.locator('div').filter({ hasText: 'Change image' }).nth(1).click()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:37:53