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.
- Если вы делаете
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
- Если вы делаете
cy.request()до посещения страницы, Cypress предполагает, что хост являетсяbaseUrlсвойством, настроенным в файле конфигурации.
// cypress.json
{
"baseUrl": "http://localhost:1234"
}
cy.request('seed/admin') // URL is http://localhost:1234/seed/admin
- Если Cypress не может определить хост, он выведет ошибку.
body (String, Object)
Тело запроса body для отправки в запросе. Cypress устанавливает заголовок запроса Accepts и сериализует тело ответа с помощью опции encoding.
method (String)
Выполните запрос с использованием определенного метода. Если метод не определен, Cypress использует метод GET по умолчанию.
Поддерживаемые методы включают:
GETPOSTPUTDELETEPATCHHEADOPTIONSTRACECOPYLOCKMKCOLMOVEPURGEPROPFINDPROPPATCHUNLOCKREPORTMKACTIVITYCHECKOUTMERGEM-SEARCHNOTIFYSUBSCRIBEUNSUBSCRIBESEARCHCONNECT
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 как литерал объекта, содержащий такие свойства, как:
statusbodyheadersduration
Примеры
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')
})
Вышеприведенные команды будут отображаться в журнале команд как:
При нажатии на 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 . |
См. также
© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/commands/request