Проверьте данные загруженного файла (PDF / Word / Excel) с помощью команд Cypress - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть один сценарий, в котором я должен проверить данные загруженного файла с помощью команд Cypress.FileType: - pdf, word, excel.У меня есть URL-адрес действия API сервера, который вызывается и в ответ возвращает файл PDF.Мне нужно реализовать, используя команды Cypress и Typescript (плагин и типизацию).

Я могу получить загруженный статус и даже response.body имеет некоторый текст, но он требует некоторого парсера для анализа тела ответа.Ниже приведен код, который я пробовал.

const oReq = new XMLHttpRequest();
    oReq.open("GET", href as string, true);
    oReq.responseType = "arraybuffer";
    oReq.onload = () => {
        if (oReq.readyState === oReq.DONE) {
            if (oReq.status === 200) {
                // tried parsing the response. 
// looking for any parser which can parse the given reponse body into Text or json
            }
        }
    }


cy.request(href).then((response) => {
    expect(response.status).to.equal(200);
    expect(response.body).not.to.null;
    const headerValue = response.headers["content-disposition"];

    // expect(headerValue).to.equal("attachment; filename=ExperimentEntityList.<FileExtension-PDF | XLSX | DOCX>");

    /// have tried with YAML parser and the "FS" module that cypress and ends up in different console error
    // YAML parser gives consoole error about unidentified character "P".
    // FS module code is shown below
});     

import * as fs from "fs";

function GetPDFContent()
{
    // throws console that fs object doesn't have readFile and same with readFileSync method. 
    fs.readFile("url")..
    fs.readFileSync("url")..
}

Требование:
1) Считать содержимое файла PDF
2) Считать содержимое файла XLS (x)
3) Считать содержимое файла doc (x).

Не удалось прочитать содержимое файлов PDF и DOc (x) в машинописи для сценария автоматизации кипариса.Пролистали различные блоги в интернете, установили pdfparser, pdfreader, yaml parser, filereader и еще несколько.Но ни один из них не работает.Я использовал вышеупомянутый код для чтения файлов.и проверьте письменный комментарий для соответствующей команды.

Для файла xlsx я нашел решение с помощью плагина синтаксического анализатора XSLX, который анализирует Response.body, который я могу перебрать и получить содержимое.Я ищу похожий парсер для файлов PDF и Doc (x).

Кто-нибудь знает об этом.Пожалуйста, поделитесь им! *

ПРИМЕЧАНИЕ. Скобки или синтаксис не являются проблемой.Если он найден в приведенном выше примере кода, он будет пропущен во время копирования / вставки.

РЕДАКТИРОВАТЬ:

Я нашел решение для чтения и проверки содержимого файла PDF, используяCypress Commadns.Спасибо Ричарду Матсену, @Richard: Но проблема в том, что у меня есть полный URL-адрес PDF-файла.Как - http://domainname/upload/files/pdf/pdfname.pdf. Тогда я могу прочитать содержимое и проверить его.Но если моя проблема в том, что у меня есть URL-адрес типа "http://domainname/controller/action?pdf=someid",, который возвращает ответ файла PDF, и команда узла не кодирует его должным образом, а файл PDF не анализируется должным образом.

Маленький вопрос

Кто-нибудь знает, как создать файл PDF с помощью команд узла / кипариса, используя поток ответа данных PDF. Я пробовал подключаемый модуль Axios, http, xmlhttprequest plutins.

1 Ответ

0 голосов
/ 06 декабря 2018

Вам нужен плагин для доступа к библиотекам, таким как pdf-parser, которые работают в среде NodeJs (т.е. используйте команды Node, такие как fs).

Лучшая ссылка для этого - Powerful cy.task

Вот пример адаптации этого шаблона к вашему сценарию.

cypress / plugins / index.js

const fs = require('fs')
const path = require('path')
const pdf = require('pdf-parse');

const repoRoot = path.join(__dirname, '..', '..') // assumes pdf at project root

const parsePdf = async (pdfName) => {
  const pdfPathname = path.join(repoRoot, pdfName)
  let dataBuffer = fs.readFileSync(pdfPathname);
  return await pdf(dataBuffer)  // use async/await since pdf returns a promise 
}

module.exports = (on, config) => {
  on('task', {
    getPdfContent (pdfName) {
      return String(parsePdf(pdfName))
    }
  })
}

spec.js

it('tests a pdf', () => {
  cy.task('getPdfContent', 'mypdf.pdf').then(content => {
    // test you pdf content here, with expect(this and that)...
  })
})

У меня нетпроверил это, так что вы можете найти некоторые морщины, чтобы сгладить.

Местоположение pdf - repoRoot, что, как я понимаю, означает корневую папку проекта на два уровня выше /cypress/plugins.Возможно, вам придется изменить путь, так как загрузка происходит.Вы не предоставили достаточно информации, чтобы понять всю логику теста, я оставляю на ваше усмотрение вносить изменения.

Форма, в которую возвращается содержимое, зависит от используемой библиотеки pdf.Похоже, что pdf-parse дает объект Json, который должен легко проверяться.
После вызова cy.task('getPdfContent') вы можете выбрать различные cy команды, такие как .should() и .contains(), но я бы использовал .then()и в обратном вызове используйте expect() для содержимого.

...