Spec-Zone.ru › Cypress

request

Выполните HTTP-запрос.

Синтаксис

cy.request(url)
cy.request(url, body)
cy.request(method, url)
cy.request(method, url, body)
cy.request(options)

Использование

Правильное использование

cy.request('http://dev.local/seed')

Аргументы

url (String)

URL для выполнения запроса.

Если вы не предоставите полностью квалифицированное доменное имя (FQDN) в URL, Cypress сделает предположение о том, какой хост вы хотите cy.request() использовать в URL.

  1. Если вы делаете cy.request() после посещения страницы, Cypress предполагает, что URL, используемый для cy.visit() , является хостом.
cy.visit('http://localhost:8080/app')
cy.request('users/1.json') //  URL is  http://localhost:8080/users/1.json
  1. Если вы делаете cy.request() до посещения страницы, Cypress предполагает, что хост является baseUrl свойством, настроенным в файле конфигурации.
// cypress.json
{
  "baseUrl": "http://localhost:1234"
}
cy.request('seed/admin') // URL is http://localhost:1234/seed/admin
  1. Если Cypress не может определить хост, он выведет ошибку.

body (String, Object)

Тело запроса body для отправки в запросе. Cypress устанавливает заголовок запроса Accepts и сериализует тело ответа с помощью опции encoding.

method (String)

Выполните запрос с использованием определенного метода. Если метод не определен, Cypress использует метод GET по умолчанию.

Поддерживаемые методы включают:

  • GET
  • POST
  • PUT
  • DELETE
  • PATCH
  • HEAD
  • OPTIONS
  • TRACE
  • COPY
  • LOCK
  • MKCOL
  • MOVE
  • PURGE
  • PROPFIND
  • PROPPATCH
  • UNLOCK
  • REPORT
  • MKACTIVITY
  • CHECKOUT
  • MERGE
  • M-SEARCH
  • NOTIFY
  • SUBSCRIBE
  • UNSUBSCRIBE
  • SEARCH
  • CONNECT

options (Object)

Передайте объект опций для изменения стандартного поведения cy.request().

Вы также можете настроить опции для cy.request()'s baseUrl и responseTimeout глобально в файле конфигурации.

Опция Значение по умолчанию Описание
log true Отображает команду в журнале команд
url null URL для выполнения запроса
method GET HTTP-метод, используемый в запросе
auth null Добавляет заголовки авторизации. Принимает эти параметры.
body null Тело, отправляемое вместе с запросом
failOnStatusCode true Флаг для обработки ошибок ответов, отличных от 2xx и 3xx
followRedirect true Включает автоматическое следование перенаправлениям
form false Включает преобразование значений body в закодированное по URL содержимое и установку заголовка x-www-form-urlencoded
encoding utf8 Кодировка, используемая при сериализации тела ответа. Поддерживаются следующие кодировки: ascii, base64, binary, hex, latin1, utf8, utf-8, ucs2, ucs-2, utf16le, utf-16le
gzip true Принимать кодировку gzip
headers null Дополнительные заголовки для отправки; принимает литерал объекта
qs null Параметры запроса для добавления к url запроса
retryOnStatusCodeFailure false Включает автоматическое повторное выполнение Cypress для ошибок кода состояния. Cypress повторит запрос до 4 раз, если это значение установлено в true.
retryOnNetworkFailure true Включает автоматическое повторное выполнение Cypress для временных сетевых ошибок. Cypress повторит запрос до 4 раз, если это значение установлено в true.
timeout responseTimeout Время ожидания cy.request() для разрешения перед выходом по таймеру

Возвращаемые значения

cy.request() возвращает response как литерал объекта, содержащий такие свойства, как:

  • status
  • body
  • headers
  • duration

Примеры

URL

Выполнение запроса GET

cy.request() отлично подходит для взаимодействия с внешним конечным пунктом перед вашими тестами для заполнения базы данных.

beforeEach(() => {
  cy.request('http://localhost:8080/db/seed')
})

Выдача HTTP-запроса

Иногда быстрее протестировать содержимое страницы, чем cy.visit() и ждать загрузки всей страницы и всех её ресурсов.

cy.request('/admin').its('body').should('include', '<h1>Admin</h1>')

Метод и URL

Отправка запроса DELETE

cy.request('DELETE', 'http://localhost:8888/users/827')

Создание псевдонима запроса с помощью .as()

cy.request('https://jsonplaceholder.cypress.io/comments').as('comments')

cy.get('@comments').should((response) => {
  expect(response.body).to.have.length(500)
  expect(response).to.have.property('headers')
  expect(response).to.have.property('duration')
})

Метод, URL и тело

Отправка запроса POST с телом JSON

cy.request('POST', 'http://localhost:8888/users/admin', { name: 'Jane' }).then(
  (response) => {
    // response.body is automatically serialized into JSON
    expect(response.body).to.have.property('name', 'Jane') // true
  }
)

Параметры

Запрос страницы с отключением автоматического перенаправления

Для тестирования поведения перенаправления при входе в систему без сессии можно использовать cy.request для проверки status и redirectedToUrl свойств.

Свойство redirectedToUrl является специальным свойством Cypress, которое нормализует URL, по которому браузер обычно переходит при перенаправлении.

cy.request({
  url: '/dashboard',
  followRedirect: false, // turn off following redirects
}).then((resp) => {
  // redirect status code is 302
  expect(resp.status).to.eq(302)
  expect(resp.redirectedToUrl).to.eq('http://localhost:8082/unauthorized')
})

Загрузка файла PDF

Передав опцию encoding: binary, response.body будет сериализованным двоичным содержимым файла. Вы можете использовать это для доступа к различным типам файлов через .request() , такие как .pdf, .zip, или .doc файлы.

cy.request({
  url: 'http://localhost:8080/some-document.pdf',
  encoding: 'binary',
}).then((response) => {
  cy.writeFile('path/to/save/document.pdf', response.body, 'binary')
})

Получение Data URL изображения

Передав опцию encoding: base64, response.body будет содержать кодированное в base64 содержимое изображения. Вы можете использовать это для создания Data URI для использования в другом месте.

cy.request({
  url: 'https://docs.cypress.io/img/logo.png',
  encoding: 'base64',
}).then((response) => {
  const base64Content = response.body
  const mime = response.headers['content-type'] // or 'image/png'
  // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs
  const imageDataUrl = `data:${mime};base64,${base64Content}`
})

Отправка HTML-форм с помощью опции form

Часто после создания правильного e2e-теста входа в систему нет необходимости продолжать cy.visit() вход в систему и ждать загрузки всей страницы со всеми связанными ресурсами перед выполнением других команд. Это может замедлить весь набор тестов.

Используя cy.request(), мы можем обойти это, поскольку она автоматически получает и устанавливает куки, как если бы запросы поступали из браузера.

cy.request({
  method: 'POST',
  url: '/login_with_form', // baseUrl is prepend to URL
  form: true, // indicates the body should be form urlencoded and sets Content-Type: application/x-www-form-urlencoded headers
  body: {
    username: 'jane.lane',
    password: 'password123',
  },
})

// to prove we have a session
cy.getCookie('cypress-session-cookie').should('exist')

Использование cy.request() для HTML-форм

Посмотрите наш пример рецепта с использованием cy.request() для HTML-форм

Опрос запросов

Вызов cy.request() многократно

Это полезно, когда вы опрашиваете сервер в ожидании ответа, который может занять некоторое время.

Всё, что мы делаем, это создаём рекурсивную функцию. Ничего более сложного.

// a regular ol' function folks
function req () {
  cy
    .request(...)
    .then((resp) => {
      // if we got what we wanted

      if (resp.status === 200 && resp.body.ok === true)
        // break out of the recursive loop
        return

      // else recurse
      req()
    })
}

cy
  // do the thing causing the side effect
  .get('button').click()

  // now start the requests
  .then(req)

Примечания

Отладка

Запрос не отображается во вкладке «Сеть» инструментов разработчика

Cypress не фактически выполняет запрос XHR из браузера. Мы фактически выполняем HTTP-запрос из Cypress Test Runner (в Node.js). Поэтому вы не увидите запрос в своих инструментах разработчика.

CORS

CORS проигнорирован

Обычно, когда браузер обнаруживает кросс-доменный HTTP-запрос, он отправляет предварительный запрос CORS для проверки разрешения сервером таких запросов, но cy.request() полностью игнорирует CORS.

// we can make requests to any external server, no problem.
cy.request('https://www.google.com/webhp?#q=cypress.io+cors')
  .its('body')
  .should('include', 'Testing, the way it should be') // true

Куки

Куки автоматически отправляются и принимаются

Перед отправкой HTTP-запроса мы автоматически прикрепляем куки, которые в противном случае были бы прикреплены, если бы запрос исходил от браузера. Кроме того, если ответ содержит заголовок Set-Cookie , эти куки автоматически устанавливаются обратно в куки браузера.

Другими словами, cy.request() прозрачно выполняет все основополагающие функции, как если бы они исходили от браузера.

cy.intercept(), cy.server(), и cy.route()

cy.request() отправляет запросы на фактические конечные точки, минуя те, которые определены с помощью cy.route() или cy.intercept()

cy.server() и любая конфигурация, переданная cy.server(), не оказывает влияния на cy.request().

Цель cy.request() — проверка конечных точек на реальном работающем сервере без необходимости запуска приложения front-end.

Правила

Требования

  • cy.request() требует привязки к cy .
  • cy.request() требует, чтобы сервер отправил ответ.
  • cy.request() требует, чтобы код состояния ответа был 2xx или 3xx при failOnStatusCode равном true .

Утверждения

  • cy.request() будет выполнять утверждения, которые вы привязали только один раз, и не будет повторно выполнять .

Таймауты

  • cy.request() может приостановиться в ожидании ответа сервера.

Журнал команд

Конечная точка комментариев запроса и тестовый ответ

cy.request('https://jsonplaceholder.typicode.com/comments').then((response) => {
  expect(response.status).to.eq(200)
  expect(response.body).to.have.length(500)
  expect(response).to.have.property('headers')
  expect(response).to.have.property('duration')
})

Вышеприведенные команды будут отображаться в журнале команд как:

Command Log request

При нажатии на request в журнале команд, консоль выведет следующее:

Console Log request

История

Версия Изменения
4.7.0 Добавлена поддержка опции encoding .
3.3.0 Добавлена поддержка опций retryOnStatusCodeFailure и retryOnNetworkFailure .
3.2.0 Добавлена поддержка любого допустимого аргумента HTTP method , включая TRACE, COPY, LOCK, MKCOL, MOVE, PURGE, PROPFIND, PROPPATCH, UNLOCK, REPORT, MKACTIVITY, CHECKOUT, MERGE, M-SEARCH, NOTIFY, SUBSCRIBE, UNSUBSCRIBE, SEARCH, и CONNECT .

См. также

  • cy.exec()
  • cy.task()
  • cy.visit()
  • Рецепт: Вход — Single Sign on
  • Рецепт: Вход — HTML веб-форма
  • Рецепт: Вход — XHR веб-форма
  • Рецепт: Вход — CSRF-токены

© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/commands/request

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API