Cypress - 检查文件是否已下载

Dom*_*ála 8 automation automated-tests cypress

我在尝试检查文件是否已下载时遇到了一些问题。

单击按钮会生成一个 PDF 文件并开始下载。

我需要检查它是否有效。

赛普拉斯能做到这一点吗?

abd*_*bdp 7

赛普拉斯/插件/index.js

    const path = require('path');
    const fs = require('fs');
    
    const downloadDirectory = path.join(__dirname, '..', 'downloads');
    
    const findPDF = (PDFfilename) => {
      const PDFFileName = `${downloadDirectory}/${PDFfilename}`;
      const contents = fs.existsSync(PDFFileName);
      return contents;
    };
    
    const hasPDF = (PDFfilename, ms) => {
      const delay = 10;
      return new Promise((resolve, reject) => {
        if (ms < 0) {
          return reject(
            new Error(`Could not find PDF ${downloadDirectory}/${PDFfilename}`)
          );
        }
        const found = findPDF(PDFfilename);
        if (found) {
          return resolve(true);
        }
        setTimeout(() => {
          hasPDF(PDFfilename, ms - delay).then(resolve, reject);
        }, delay);
      });
    };
    
    module.exports = (on, config) => {
      require('@cypress/code-coverage/task')(on, config);
      on('before:browser:launch', (browser, options) => {
        if (browser.family === 'chromium') {
          options.preferences.default['download'] = {
            default_directory: downloadDirectory,
          };
          return options;
        }
        if (browser.family === 'firefox') {
          options.preferences['browser.download.dir'] = downloadDirectory;
          options.preferences['browser.download.folderList'] = 2;
          options.preferences['browser.helperApps.neverAsk.saveToDisk'] =
            'text/csv';
          return options;
        }
      });
    
      on('task', {
        isExistPDF(PDFfilename, ms = 4000) {
          console.log(
            `looking for PDF file in ${downloadDirectory}`,
            PDFfilename,
            ms
          );
          return hasPDF(PDFfilename, ms);
        },
      });
    
      return config;
    };
Run Code Online (Sandbox Code Playgroud)

集成/pdfExport.spec.js

    before('Clear downloads folder', () => {
       cy.exec('rm cypress/downloads/*', { log: true, failOnNonZeroExit: false });
    });
        
    it('Should download my PDF file and verify its present', () => {
        cy.get('ExportPdfButton').click();
        cy.task('isExistPDF', 'MyPDF.pdf').should('equal', true);
    });
Run Code Online (Sandbox Code Playgroud)

  • 当您共享代码片段时,请尝试添加解释 (4认同)
  • @YunusTemurlenk 我通常同意,但是这个片段很棒,进行测试就是解释。 (2认同)

Fra*_*ois 5

我建议您查看 HTTP 响应正文。您可以通过以下方式获得响应cy.server().route('GET', 'url').as('download')(如果您不知道这些方法,请查看 cypress 文档)。

并捕获响应以验证正文不为空:

cy.wait('@download')
    .then((xhr) => {
        assert.isNotNull(xhr.response.body, 'Body not empty')
    })
Run Code Online (Sandbox Code Playgroud)

或者,如果下载成功时有弹出窗口宣布成功,您也可以验证弹出窗口是否存在:

cy.get('...').find('.my-pop-up-success').should('be.visible')
Run Code Online (Sandbox Code Playgroud)

最好的,

编辑

请注意cy.server().route()可能已弃用

Cypress 6.0.0 中已弃用 cy.server() 和 cy.route()。在未来的版本中,将删除对 cy.server() 和 cy.route() 的支持。考虑使用 cy.intercept() 代替。

根据迁移指南,这等效于:cy.intercept('GET', 'url').as('download')

  • 我认为“cy.server().route()”方法不起作用,因为文件下载不是“GET”请求。 (2认同)
  • 谢谢弗朗索瓦,它很有魅力。在触发下载之前,我调用 GET api 来获取 CSV 的使用情况,因此这种方法有助于确保响应有效。 (2认同)