Cypress 在请求正文中使用文件进行 HTTP POST 时出错

2024-03-19

我从 Cypress 6.8.0 升级到 7.0.1。升级后,当 Cypress 测试之一调用此函数时

async saveTask (task, file) {
  const requestBody = new FormData()
  requestBody.append('file', file)

  return await http.post('/api/endpoint', requestBody, {
    headers: {
      'Content-Type': 'multipart/form-data'
    }
  })
},

我收到以下错误

TypeError [ERR_INVALID_ARG_TYPE] [ERR_INVALID_ARG_TYPE]: 
The first argument must be of type string or an instance of Buffer or Uint8Array. Received type number (45)
    at write_ (_http_outgoing.js:696:11)
    at ClientRequest.write (_http_outgoing.js:661:15)
    at Request.write (/Users/donal/Library/Caches/Cypress/7.0.1/Cypress.app/Contents/Resources/app/packages/server/node_modules/@cypress/request/request.js:1496:27)
    at /Users/donal/Library/Caches/Cypress/7.0.1/Cypress.app/Contents/Resources/app/packages/server/node_modules/@cypress/request/request.js:546:20
    at Array.forEach (<anonymous>:null:null)
    at end (/Users/donal/Library/Caches/Cypress/7.0.1/Cypress.app/Contents/Resources/app/packages/server/node_modules/@cypress/request/request.js:545:23)
    at Immediate._onImmediate (/Users/donal/Library/Caches/Cypress/7.0.1/Cypress.app/Contents/Resources/app/packages/server/node_modules/@cypress/request/request.js:578:7)
    at processImmediate (internal/timers.js:461:21)
 {
  code: 'ERR_INVALID_ARG_TYPE'
}

The http我用来发出 POST 请求的对象是 Axios 实例,file我附加到请求正文的对象是File https://developer.mozilla.org/en-US/docs/Web/API/File。文件对象是问题的原因,因为如果我不将其附加到请求正文,则不会发生错误。

仅当该函数由 Cypress 测试运行时才会发生该错误。 Cypress 使用 Node.js,从上面的错误消息来看,似乎File类型是不允许的。此外,Axios 请求配置文档 https://github.com/axios/axios#request-config表明当axios运行在Node下时,File不允许。

  // `data` is the data to be sent as the request body
  // Only applicable for request methods 'PUT', 'POST', 'DELETE , and 'PATCH'
  // When no `transformRequest` is set, must be of one of the following types:
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - Browser only: FormData, File, Blob
  // - Node only: Stream, Buffer
  data: {
    firstName: 'Fred'
  },

所以我想我需要转换File反对别的东西,这样该函数既可以在应用程序本身内运行,也可以在由 Cypress 运行时运行。

在服务器端(Spring Boot 应用程序),此文件绑定到MultipartFile

public void handlePost(
    RequestPart(value = "file") MultipartFile file) {

    // controller action body       
}

如果我的理论File类型是问题,我应该使用什么来代替,我应该如何进行转换?


仅当该函数由 Cypress 测试运行时才会发生该错误。 Cypress 使用 Node.js,从上面的错误消息来看似乎 不允许的文件类型。此外,axios请求配置 文档指出,当axios在Node下运行时,不允许使用File。

默认情况下Cypress starts Electron在无头模式下,即测试始终可以访问浏览器 API。您可以控制要在哪个浏览器上运行测试。更多细节here https://docs.cypress.io/guides/guides/launching-browsers#Electron-Browser.

现在我们看一下文件上传的解决方案

假设file你在函数中引用saveTask is an input现场type=file and name=file.

比方说,您需要上传一个名为的 png 图片email.png这是在cypress/fixtures/images/email.png.

使用以下代码块上传文件。

 cy.fixture('images/email.png').as('emailImage')
   cy.get('input[name=file]').then(function (el) {
     const blob = Cypress.Blob.base64StringToBlob(this.emailImage, 'image/png')
     const file = new File([blob], 'email.png', { type: 'image/png' })
     const list = new DataTransfer()
     list.items.add(file)
     el[0].files = list.files
     el[0].dispatchEvent(new Event('change', { bubbles: true }))
 })
 

现在您可以根据调用您的上传 api (/api/endpoint) 来触发操作,并最终验证上传是否成功。

 // Trigger the action which causes the upload api to be invoked e.g. clicking on a button
 cy.get('input[type=button]').click();
 
 // Verify the api invocation is successful (The below code checks a div with id result to have the String 'Success')
 cy.get('#result').should('contain', 'Success');

您可以上传任何类型的文件,并且不必是图像。欲了解更多信息,请查看fixture https://docs.cypress.io/api/commands/fixture and Blob https://docs.cypress.io/api/utilities/blob。这个答案是基于这个example https://docs.cypress.io/api/utilities/blob#Using-an-image-fixture-for-upload关于 Blob 文档。

此存储库使用 GitHub Actions 在 CI 上运行测试https://github.com/GSSwain/file-upload-cypress-test https://github.com/GSSwain/file-upload-cypress-test服务器是一个 Spring boot 应用程序(在 CI 服务器上作为 Docker 容器运行)代码位于https://github.com/GSSwain/file-upload-ajax-sample https://github.com/GSSwain/file-upload-ajax-sample

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cypress 在请求正文中使用文件进行 HTTP POST 时出错 的相关文章

  • 需要使用 iFrame API 隐藏 YouTube 品牌

    我正在使用 YouTube iFrame API 在我的自定义播放器 javascript 播放器 中加载视频 我需要隐藏 Youtube 品牌 但是在 iOS 设备上 它显示带有以下参数的徽标 playerVars fs 1 autopl
  • 转义 \u200b(零宽度空格)和其他非法 JavaScript 字符

    我有一组 JavaScript 对象 我引导到后端模板 以在页面加载时初始化我的 Backbone js 集合 它看起来像这样 作为 Twig 模板 我遇到的问题是某些文本字段包含 u200b 零宽度空格 这会破坏
  • 如何调试超时等待异步 Angular 任务?无法在角度页面上找到元素

    编辑 请注意 在 ernst zwingli 的帮助下 我找到了问题的根源 因此 如果您遇到相同的错误 他指出的修复之一可能会帮助您 我的问题是量角器本身的一个已知问题 如果您认为这可能是您 我已经扩展了我的步骤 以在我最初的问题之后查明问
  • 函数不会等到 Promise 得到解决

    我正在开发一个简单的不和谐机器人 我正在尝试打印有关某个玩家的一些一般数据 我最近了解了 async await 并尝试将其实现到我的代码中 然而 它似乎不起作用 因为当我第一次触发此代码时 它会打印 null 但在后续触发时 它将打印正确
  • 如何根据另一个下拉列表中的选择动态填充下拉列表中的选项?

    我有一个表 其中包含类别信息 例如产品 我已将它们列在下拉菜单中 现在 我需要做的是 在下一个下拉菜单中列出所选类别的子类别 我希望 javascript 是必需的 但我对 javascript 还不太熟悉 将非常感谢您的帮助 你应该使用
  • Socket IO 服务器到服务器

    服务器是否可以使用 Socket IO 连接到另一个服务器并被视为客户端 并让它加入房间 接收 io sockets in lobby emit 和更多 第一个服务器也在监听连接 消息 嘿 Brad 下面是我的完整 js 应用程序 供参考
  • Aurelia 中的角度服务?

    我还没有找到详细说明如何从 Angular 1 x 迁移到 Aurelia 的详细文档 到目前为止 我只看到人们详细介绍了 Angular 的概念directive可以在 Aurelia 中使用重制 customElement 好吧 足够简
  • 嵌套 DIV 的类似斑马的 CSS 样式

    我嵌套了 DIV 元素 但我不知道嵌套的级别 我需要每个都有与其父级不同的背景 创建类似斑马的颜色 我只使用两种背景 深色和白色 效果需要类似于在容器中设置奇数和偶数子级的样式 但在我的例子中 子级是嵌套的 我可以使用每个嵌套元素的规则来做
  • D3 向对象添加超链接?

    我正在尝试制作 D3 图 它将代表我网站的菜单 我尝试按照此处的其他指南添加超链接 但它们都不起作用 每个对象都会有一个不同的 URL 指向 主页 关于 联系方式等 如果添加超链接 我可以拖动对象吗 这意味着如果我按住单击 如果我单击该对象
  • 引用自身的 Javascript 对象...有问题吗?

    由于 Javascript 允许通过引用分配复合值 因此如果 Javascript 对象引用自身 它将创建无限的引用集 如控制台中所示 这看起来像是某种无限循环 但 Chrome 似乎没有问题 这样做是否存在任何内存问题或其他风险 就记忆力
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 如何使用 GreaseMonkey 让浏览器恢复“/”键?

    Lots of web pages seem to use the key for searching I d like to disable that because 100 of the time I want to use to se
  • Angularjs : $locationProvider.hashPrefix("!") ;

    我想将网址显示为 www test com 因为我正在使用 locationProvider hashPrefix 但它显示网址为 www test com 我想 哈希之前而不是哈希之后 Thanks var app angular mod
  • 在 Nodejs 中,如何停止 FOR 循环直到 MongoDB 调用返回

    我正在研究下面的代码片段 我有一个名为 stuObjList 的 JSON 对象数组 我想循环遍历数组以查找具有特定标志集的特定 JSON 对象 然后进行数据库调用以检索更多数据 当然 FOR 循环不会等待数据库调用返回并到达 j leng
  • 在javascript中创建图像的缩略图方块(不丢失纵横比)

    我正在制作一个客户端拖放文件上传脚本作为书签 在上传之前 我使用 File API 将图像读取为 base64 格式并将其显示为缩略图 This is how my thumbnails look like I want them to l
  • 如何为 jQuery 插件设置私有变量?

    我想创建一个简单的插件 它使用元素的文本作为默认值 或者您可以在调用插件时设置此值 但是 如果我不设置该值 并为多个元素调用插件 则默认值会成倍增加 function fn reText function options var setti
  • 使圆圈与 d3.js 上的多线匹配相同的颜色过滤?

    我有一个多线图 当按每种水果过滤时会更新 每条线条颜色对应不同的销售年份 在 的帮助下Shashank https stackoverflow com users 5569282 shashank 每个数据点线上的圆圈已添加到组中 而不是直
  • Jquery 以编程方式更改

    文本

    编辑 解决方案是将其添加到个人资料页面而不是性别页面 profile live pageinit function event p pTest text localStorage getItem gender 我在列表视图中有一个带有一些文
  • 区分 NaN 输入和输入类型为“number”的空输入

    我想使用 type number 的表单输入 并且只允许输入数字
  • 为什么 try catch 块没有捕获 Promise 异常?

    我对承诺的错误处理感到困惑 答案可能很明显 但我不明白 我有以下示例代码 var test async function throw new Error Just another error try test then catch err

随机推荐

  • io:ios应用程序开发选项变灰

    我刚刚签署并创建了一个具有钥匙串访问权限的证书 然后在开发人员门户中单击证书 gt 开发人员 gt 当系统提示我您需要什么类型的证书时 正在开发的ios应用程序开发是灰色的 有人知道为什么吗 我需要吊销证书吗 每个用户只能申请一份开发证书
  • 将 Facebook Connect 与 Authlogic 结合使用

    我正在努力使 Authlogic 和 Facebook Connect 使用 Facebook 发挥良好作用 以便您可以通过正常注册方式或使用 Facebook Connect 创建帐户 我已经能够以一种方式使连接正常工作 但注销仅在 Fa
  • 查询输入必须至少包含一个表或查询

    我在 access 中有一个查询 应该在插入之前检查该项目是否已存在于数据库中 INSERT INTO FinalizedPrintedStickers Values 0000846043 481 9 0 48IG 1F Straight
  • 装箱和拆箱,为什么输出不是都是“System.Object”?

    我得到以下代码 object var3 3 Console WriteLine var3 GetType ToString Console WriteLine typeof object ToString 输出是 System Int32
  • 动态加载.js文件时捕获onload事件?

    有没有捕获onload在 IE 中使用 JavaScript 动态添加脚本标签时会发生事件吗 下面的代码适用于 FireFox 和 Chrome 但不适用于 IE
  • 数列识别

    从另一个问题发展而来 识别R中重复数字的序列 https stackoverflow com questions 7509381 identifying sequences of repeated numbers in r 15328802
  • 根据运行时条件在 Azure Pipeline 中执行或不执行模板

    我已经运行了 Azure Pipeline 现在 我想仅当运行时某个条件成立时才执行一系列步骤 Example steps template steps checkout yml some more steps here bash if s
  • 如何使用Nodejs从上传的ppt文件中获取幻灯片数量?

    我们可以从文件的属性中看到文件详细信息 如下图所示 我需要使用 Nodejs 或 Angularjs 以编程方式获得相同的细节 我不认为 Angularjs 可以完成文件操作 是否可以在节点中获取文件的相同信息 我猜 shellsjs 会支
  • ruby 中的三向比较

    确保 ruby 中三个变量全部相等的最简洁方法是什么 例如 dog animal cat animal chicken animal shoe clothing Something like this which doesn t work
  • 创建一个闭包

    我想创建一个闭包 函数生成器 来计算数字的幂 而不使用特定的 Clojure 库来完成此任务 现在 我可以用循环 重复来做到这一点 defn exp1 in num in exp multi loop num in num exp mult
  • 在 Shiny 应用程序中包含一个 javascript 文件

    我需要将 js 库包含到我的 Shiny 应用程序中 目前我使用 includeHTML 将脚本直接包含到 html 代码中 例如 includeHTML URL js 如果我使用tags script 例如 当我尝试浏览js文件时 浏览器
  • 如何将 JointJS 与使用 Angular CLI 构建的应用程序一起使用?

    我已经通过 npm 安装了 jointjs 并安装了 types 并且代码编译 构建良好 Code import Component from angular core import as joint from node modules j
  • 辅音和元音 Swift

    我是 Swift 的新手 谁能向我解释一下为什么我总是遇到这个问题 我正在使用 Xcode 6 4 但这是我的问题 我希望我能解决它 但我需要我的函数接受大字符串 然后返回 Tuple numVowels numConsonants 计算以
  • Virtualenv 没有名为 zlib 的模块

    我正在尝试在 Python2 6 下创建 Python 2 7 虚拟环境 我只是运行 virtualenv python python27 python27 correctly leads to my python installation
  • 仅解压缩特定扩展名

    我有一个包含 jpg png gif 图像的 zip 存档目录 我想解压缩每个存档 仅获取图像并将它们放入具有存档名称的文件夹中 So files archive1 zip files archive2 zip files archive3
  • JSF 2.0 注入不同范围的托管 bean

    我有一个无状态的控制器 负责处理表单 这被定义为ApplicationScoped 在我的页面上 我有一个与支持 bean 关联的表单 定义为ViewScoped 当我想处理表单时出现错误 serverError class com sun
  • 如何在 Blazor 客户端应用程序中使用 Bootstrap 模式?

    我正在尝试显示引导模式然后绑定其按钮 但我无法通过显示模式的第一步 我正在使用 net core 3 1 的 Blazor 客户端模板 我有一个名为 Modal razor 的页面 其中包含我从 getbootstrap com 找到的引导
  • 无法解决依赖关系 - Laravel

    照亮 合同 容器 BindingResolutionException 无法解析 App Jobs BudgetFetch 类中的依赖关系 参数 0 customerId namespace App Http Controllers use
  • 如何在ionic 3中进行水平滚动

    look at my 我在离子卷轴中有 10 个名字 但它像段落一样进入下一行 这是我的 html 代码
  • Cypress 在请求正文中使用文件进行 HTTP POST 时出错

    我从 Cypress 6 8 0 升级到 7 0 1 升级后 当 Cypress 测试之一调用此函数时 async saveTask task file const requestBody new FormData requestBody