Время ожидания Cypress после выполнения запроса POST - PullRequest
0 голосов
/ 27 апреля 2020

Моя страница содержит форму, в которой пользователь может ввести свое имя:

<form method="post" onsubmit="nameSubmitted()">
  <input id="nameField" name="username" type="text" autofocus>
  <input type="hidden" name="form" value="username">
  <input id="nameSubmitButton" type="submit" value="OK">
</form>

В Cypress я делаю:

cy.visit('http://localhost:8080/my-page-name.html');

cy.get('[id="nameField"]')
.type(my-test-username);

cy.get('[id="nameSubmitButton"]')
.click();

Предполагаемое поведение состоит в том, что сервер связывает данное имя пользователя для текущего сеанса, и пользователь остается на той же странице, а функция nameSubmitted() отображает и скрывает некоторые элементы DOM. Это прекрасно работает при ручном тестировании с обычным экземпляром Firefox, Chrome, Opera или Brave, но не удается, когда Cypress пытается сделать то же самое в Electron или Firefox (я не смог добавить другие браузеры Cypress, но это отдельная проблема).

Сервер является первым HTTP-сервером, который я написал, поэтому я не уверен на 100%, что его поведение правильное, но я не могу найти ничего неправильного. Он написан на Java с использованием com.sun.net.httpserver.HttpServer и связанных классов, и я попробовал два разных ответа на запрос POST:

  1. 204 Нет содержимого

В экземпляре com.sun.net.httpserver.HttpExchange я звоню:

aHttpExchange.sendResponseHeaders(204, -1);
aHttpExchange.getResponseBody().close();

Это приводит к зависанию Cypress в ожидании загрузки страницы до истечения времени ожидания через 60 секунд. На самом деле нет ничего нового в том, что он должен загружаться, и изображение страницы справа от экземпляра браузера Cypress показывает, что страница отображается правильно (функция nameSubmitted() корректно изменила DOM). Я также вижу на сервере, что запрос POST успешен и имя пользователя установлено.

200 OK

Как и следовало ожидать, я попытался вместо этого установить

aHttpExchange.sendResponseHeaders(200, 0);

и отправить пустую строку в OutputStream перед его закрытием. Это заставляет Cypress (и обычные браузеры, когда он не находится в тестовом режиме) устанавливать эту пустую строку в качестве содержимого страницы, так что это не годится.

В соответствии с http spe c:

Действие, выполняемое методом POST, может не привести к ресурсу, который может быть идентифицирован по URI. В этом случае либо 200 (ОК), либо 204 (Нет содержимого) - это соответствующий статус ответа, в зависимости от того, содержит ли ответ объект, описывающий результат.

Так что кажется, что мой сервер должен делать правильно с ответом (1).

Кто-нибудь знает, почему происходит тайм-аут?

1 Ответ

0 голосов
/ 29 апреля 2020

Я работал над этим с помощью пользователя jorrit-wehelp на https://gitter.im/cypress-io/cypress.

. Механизм отправки формы по умолчанию теперь отключен, если поставить onsubmit="return false;" в каждом элементе формы:

<form id="nameForm" onsubmit="return false;">
  <input id="nameField" name="username" type="text" autofocus>
  <button id="nameSubmitButton" onclick="submitName()">OK</button>
</form>

Ввод типа submit был заменен кнопкой, а его метод onclick извлекает введенный текст и отправляет его с вызовом fetch:

const username = document.getElementById('nameField').value;

fetch('username', { method: 'POST', body: 'username=' + username })
    .catch(err => console.error(err));

Ответ сервера не изменился, но теперь я контролирую поведение браузера, когда он получает ответ. В качестве бонуса я теперь могу напрямую POST username вместо использования скрытого элемента формы для хранения имени формы и чтения содержимого скрытого элемента на стороне сервера для отправки запроса.

...