Spec-Zone.ru › Cypress

wait

Подождите определенное количество миллисекунд или подождите, пока разрешится алиасированный ресурс, прежде чем переходить к следующей команде.

Синтаксис

cy.wait(time)
cy.wait(alias)
cy.wait(aliases)
cy.wait(time, options)
cy.wait(alias, options)
cy.wait(aliases, options)

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

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

cy.wait(500)
cy.wait('@getProfile')

Аргументы

time (Число)

Количество времени в миллисекундах, которое нужно подождать.

alias (Строка)

Алиасированный маршрут, определённый с помощью команды .as() и ссылающийся с символом @. и названием алиаса.

Основной Концепция

Дополнительную информацию об алиасировании маршрутов можно найти в нашем руководстве по основным концепциям.

aliases (Массив)

Массив алиасированных маршрутов, определённых с помощью команды .as() и ссылающийся с символом @ и названием алиаса.

options (Объект)

Передайте объект с опциями, чтобы изменить стандартное поведение cy.wait().

Опция Значение по умолчанию Описание
log true Отображает команду в Журнале команд
timeout requestTimeout, responseTimeout Время ожидания разрешения cy.wait() перед временным выходом
requestTimeout requestTimeout Переопределяет глобальное значение requestTimeout для этого запроса. Значение по умолчанию timeout.
responseTimeout responseTimeout Переопределяет глобальное значение responseTimeout для этого запроса. Значение по умолчанию timeout.

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

При указании аргумента time:

  • cy.wait() возвращает тот же объект, который был передан из предыдущей команды.

При указании аргумента alias:

  • cy.wait() 'возвращает объект, содержащий свойства HTTP-запроса и ответа запроса'

Примеры

Время

Подождать произвольный период в миллисекундах:

cy.wait(2000) // wait for 2 seconds

Неправильный подход

Вам почти никогда не нужно ждать произвольный период времени. Всегда есть лучшие способы выразить это в Cypress.

Подробнее об лучших практиках здесь.

Кроме того, часто намного проще использовать cy.debug() или cy.pause() при отладке кода вашего теста.

Алиас

Для подробного объяснения алиасов, подробнее об ожидании маршрутов здесь.

Подождите, пока определённый запрос ответит

// Wait for the route aliased as 'getAccount' to respond
// without changing or stubbing its response
cy.intercept('/accounts/*').as('getAccount')
cy.visit('/accounts/123')
cy.wait('@getAccount').then((interception) => {
  // we can now access the low level interception
  // that contains the request body,
  // response body, status, etc
})

Wait автоматически увеличивает ответы

Каждый раз, когда мы используем cy.wait() для алиаса, Cypress ожидает следующий n-ый соответствующий запрос.

// stub an empty response to requests for books
cy.intercept('GET', '/books', []).as('getBooks')
cy.get('#search').type('Peter Pan')

// wait for the first response to finish
cy.wait('@getBooks')

// the results should be empty because we
// responded with an empty array first
cy.get('#book-results').should('be.empty')

// now the request (aliased again as `getBooks`) will return one book
cy.intercept('GET', '/books', [{ name: 'Peter Pan' }]).as('getBooks')

cy.get('#search').type('Peter Pan')

// when we wait for 'getBooks' again, Cypress will
// automatically know to wait for the 2nd response
cy.wait('@getBooks')

// we responded with one book the second time
cy.get('#book-results').should('have.length', 1)

Алиасы

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

При передаче массива алиасов в cy.wait(), Cypress будет ожидать завершения всех запросов в заданный requestTimeout и responseTimeout.

cy.intercept('/users/*').as('getUsers')
cy.intercept('/activities/*').as('getActivities')
cy.intercept('/comments/*').as('getComments')
cy.visit('/dashboard')

cy.wait(['@getUsers', '@getActivities', '@getComments']).then(
  (interceptions) => {
    // interceptions will now be an array of matching requests
    // interceptions[0] <-- getUsers
    // interceptions[1] <-- getActivities
    // interceptions[2] <-- getComments
  }
)

Использование .spread() для распределения массива по множеству аргументов.

cy.intercept('/users/*').as('getUsers')
cy.intercept('/activities/*').as('getActivities')
cy.intercept('/comments/*').as('getComments')
cy.wait(['@getUsers', '@getActivities', '@getComments']).spread(
  (getUsers, getActivities, getComments) => {
    // each interception is now an individual argument
  }
)

Примечания

Вложенность

Cypress автоматически ожидает завершения сетевого вызова перед переходом к следующей команде.

// Anti-pattern: placing Cypress commands inside .then callbacks
cy.wait('@alias')
  .then(() => {
    cy.get(...)
  })

// Recommended practice: write Cypress commands serially
cy.wait('@alias')
cy.get(...)

// Example: assert status from cy.intercept() before proceeding
cy.wait('@alias').its('response.statusCode').should('eq', 200)
cy.get(...)

Прочитайте Руководство: Введение в Cypress

Таймауты

requestTimeout и responseTimeout

При использовании с алиасом, cy.wait() проходит через два отдельных периода ожидания.

Первый период ожидает, пока соответствующий запрос покинет браузер. Эта продолжительность настраивается с помощью опции requestTimeout - по умолчанию 5000 мс.

Это означает, что когда вы начинаете ждать алиасированный запрос, Cypress будет ждать до 5 секунд, пока не будет создан соответствующий запрос. Если соответствующий запрос не найден, вы получите сообщение об ошибке, подобное этому:

Error for no matching request

Как только Cypress обнаружит, что соответствующий запрос начал свой запрос, он переходит ко второму периоду ожидания. Эта продолжительность настраивается с помощью опции responseTimeout - по умолчанию 30000 мс.

Это означает, что Cypress теперь будет ждать до 30 секунд, пока внешний сервер ответит на этот запрос. Если ответ не получен, вы получите сообщение об ошибке, подобное этому:

Timeout error for request wait

Это даёт вам лучшее из двух миров - быструю обратную связь об ошибках, когда запросы никогда не отправляются, и гораздо более длительный период для фактического внешнего ответа.

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

При передаче массива алиасов в cy.wait(), Cypress будет ожидать завершения всех запросов в заданный requestTimeout и responseTimeout.

Правила

Требования

  • При передаче аргумента time cy.wait() может быть прикреплен к cy или к другой команде..
  • При передаче аргумента alias cy.wait() требует прикрепления к cy..

Утверждения

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

Таймауты

  • cy.wait() может выйти из строя при ожидании отправки запроса.
  • cy.wait() может выйти из строя при ожидании возврата ответа.

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

Подождите, пока запрос PUT к пользователям разрешится.

cy.intercept('PUT', /users/, {}).as('userPut')
cy.get('form').submit()
cy.wait('@userPut').its('request.url').should('include', 'users')

В журнале команд cy.wait() будет отображаться как:

Command Log wait

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

Console Log wait

История

Версия Изменения
3.1.3 Добавлена опция requestTimeout и responseTimeout
< 0.3.3 Добавлена команда cy.wait()

См. также

  • .as()
  • cy.intercept()
  • cy.route()
  • cy.server()
  • .spread()

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

Spec-Zone.ru

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