Как отправить двоичный файл на сервер с Cypress, используя запрос - PullRequest
0 голосов
/ 19 февраля 2020

Мне нужно перед тестом загрузить непосредственно из Cypress API на сервер Excel-таблицы (без input [type = "file"] , просто отправка простого файла), а затем он будет запрошен обратно с некоторыми другими данными, используемыми в тесте.

Поэтому я попытался разными способами заставить Cypress использовать файл fixture , readfile с различными кодировками данных , но neigther работал.

Как только файл получен успешно, должен выполняться какой-то остаток кода.

  before(() => {

  cy.fixture("data/catalog.xlsx", "binary")
    .then(content => {

      cy.wrap(Cypress.Blob.binaryStringToBlob(content, "utf8"))
        .then(blob => {

          const file = new File([blob], "catalog-table", {type: "utf8"});

          cy.request("POST", "http://localhost:28080/app/admin/api/catalog/import/xlsx", file)
            .then(res => {debugger; expect(res.ok).to.be.true})
            .as("fileSend");

          cy.wait("@fileSend")
            .then(() => {some other code to be executed});
        })
    })
})

также попытался добавить еще несколько строк заголовков

          cy.request({
            method: "POST",
            url: "http://localhost:28080/app/admin/api/catalog/import/xlsx",
            headers: {
              contentType: false,
              processData: false,
            },
            cache: 'no-cache',
            body: file
          })

1 Ответ

0 голосов
/ 20 февраля 2020

Я обнаружил, что ни cy.request , ни Cypress. $. ajax не работали вообще с файлами.

Моя проблема была скрыта в двух вопросы:

  1. способ обработки файла перед отправкой;
  2. неправильный метод запроса собственного кипариса

Вот некоторые детали, которые необходимо принять во внимание:

  • Возьмите файл, чтобы отправить его из локального:
before(() => { //run before the tests
  cy.fixture(filePath, "binary")
  • Подготовьте его как двоичный файл:
    .then(Cypress.Blob.binaryStringToBlob)
    .then(blob => {
      const file = new File([blob], fileName);
  • Включите его в отправку данных:
      let data = new FormData();

      //settings for host server
      data.append("catalogName", fileName);
      data.append("xlsxFile", file);
  • Обход запроса, несмотря на cy.request nor Cypress. $. ajax:
      cy.form_request(url, data)
        .then(response => { some other code})
    })
})

Поскольку Cypress. $. ajax был незаконно вызван, но в сети трудно найти источник проблемы. кипарис сбой при formData подготовка; Я обнаружил, что из раздела Network в Devtool не было никакого XHR-запроса, потому что он не был выполнен с самого начала.

Я нашел третий способ с помощью собственного обходного решения XHR , и в командах есть пользовательский запрос cy.form_reques . js:


Cypress.Commands.add("form_request", (url, formData) => {
  return cy
    .server()
    .route("POST", url)
    .as("formRequest")
    .window()
    .then(win => {
      var xhr = new win.XMLHttpRequest();
      xhr.open("POST", url);
      xhr.send(formData);
    })
    .wait("@formRequest");
});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...