如何用Cypress校验上传文件与下载文件的内容是否一致
问题1:异常行为的原因
- Cypress 所有
cy.开头的命令都是异步链式设计,调用后返回的是Cypress内部的命令队列对象(也就是你报错里提到的带userInvocationStack的对象),不是你预期的文件内容,直接对这两个对象做断言自然会报错。 - Cypress 执行测试时会先把所有
cy.命令加入队列,测试代码中的同步逻辑(包括你写的expect断言、console.log)会优先于所有队列内的命令执行,所以哪怕你前面写了登录、上传、下载甚至cy.wait(5000),断言都会在这些操作执行前就跑起来,自然会出现还没走完登录就报错的情况。 - 你控制台看到的大量无法理解的报错,本质是打印了Cypress内部的命令队列对象,这类对象存在大量循环引用和内置属性,不属于额外的代码错误。
问题2:修复方案
你需要通过.then()回调或者别名取值的方式获取异步命令的实际返回结果,再做断言,同时可以给cy.readFile加超时配置自动等待下载完成,不需要硬写固定时长的cy.wait。另外你原代码里还有笔误:拼接下载文件路径时用了未定义的fileName,应该是声明过的_fileName。
正确的代码示例如下:
it.only(cfg.testname, () => { // 1. 登录网站,跳转至对应页面 // 2. 上传文件 // 3. 触发下载文件 // 读取源文件内容,存为别名 cy.fixture(_filePath).as('sourceContent') // 读取下载后的文件,默认超时时间是4秒,大文件可以自行调整超时时间 const downloadsFolder = Cypress.config("downloadsFolder") const downloadFilePath = path.join(downloadsFolder, _fileName) cy.readFile(downloadFilePath, { timeout: 30000 }).as('downloadedContent') // 等两个文件都读取完成后做断言 cy.get('@sourceContent').then(sourceContent => { cy.get('@downloadedContent').should('eq', sourceContent) }) })
小提示:如果测试的是非文本类二进制文件(如图片、压缩包等),需要在
fixture和readFile中指定编码为binary,避免内容读取失真导致断言失败,示例:cy.fixture(_filePath, 'binary')、cy.readFile(downloadFilePath, 'binary', { timeout: 30000 })
内容的提问来源于stack exchange,提问作者Rnj
相关产品推荐
相关产品推荐

