Cypress Blob处理mkv文件报Failed to execute 'atob' on 'Window'错误
Cypress v10接口请求携带MKV文件报错解决方案
问题场景
接口测试需要在请求中携带MKV格式文件,初始实现代码如下:
cy.fixture('video.mkv').then(file => { const blob = Cypress.Blob.base64StringToBlob(file, "video/x-matroska") cy.request({ method: ... url: ... body: blob, }) });
运行后抛出如下错误:
InvalidCharacterError
Failed to execute 'atob' on 'Window': The string to be decoded contains characters outside of the Latin1 range.
当前使用Cypress版本为v10.0.0,不确定处理MKV文件时是否需要做base64转Blob操作。
根因分析
报错核心原因是cy.fixture()默认以utf8文本编码读取文件,MKV属于二进制格式文件,按默认编码读取得到的内容不是合法base64字符串,传入Cypress.Blob.base64StringToBlob()方法后,底层依赖的atobAPI无法解析超出Latin1字符范围的内容,直接抛出异常。
处理MKV这类二进制文件不需要手动做base64转Blob操作,默认读取逻辑本身就不适合二进制文件场景。
修复方案
- 调用
cy.fixture()读取MKV文件时,传入第二个参数null指定编码,让Cypress直接返回二进制格式的Blob对象,跳过默认的文本解析逻辑 - 根据接口的Content-Type要求,直接使用返回的Blob对象构造请求体即可,不需要额外做格式转换
修复后的参考代码:
// 读取二进制文件时指定encoding为null,直接拿到对应Blob对象 cy.fixture('video.mkv', null).then(fileBlob => { // 场景1:接口要求直接传二进制流 cy.request({ method: 'POST', // 替换为实际请求方法 url: '/your/target/api', // 替换为实际接口地址 body: fileBlob, headers: { 'Content-Type': 'video/x-matroska' } }) // 场景2:接口要求multipart/form-data表单上传 // const formData = new FormData() // formData.append('fileField', fileBlob, 'video.mkv') // fileField替换为接口实际的文件参数字段名 // cy.request({ // method: 'POST', // url: '/your/target/api', // body: formData // }) })
该写法是Cypress v10版本处理二进制fixture文件的标准实现,可完全规避atob解析字符范围不匹配的报错。
内容的提问来源于stack exchange,提问作者bahotenc
相关产品推荐
相关产品推荐

