Spec-Zone.ru › Cypress

then

Позволяет работать с объектом, полученным от предыдущей команды.

Примечание: .then() предполагает, что вы уже знакомы с основными концепциями, такими как замыкания.

Примечание: Предпочитается .should() с обратным вызовом вместо .then() для утверждений, так как они автоматически перевыполняются до тех пор, пока ни одно утверждение не выбросит ошибку внутри него, но будьте внимательны к различиям.

Синтаксис

.then(callbackFn)
.then(options, callbackFn)

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

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

cy.get('.nav').then(($nav) => {}) // Yields .nav as first arg
cy.location().then((loc) => {}) // Yields location object as first arg

Аргументы

options (Объект)

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

Параметр Значение по умолчанию Описание
timeout defaultCommandTimeout Время ожидания .then() для разрешения перед выходом за пределы таймаута

callbackFn (Функция)

Передайте функцию, которая принимает ранее полученный объект в качестве первого аргумента.

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

.then() моделируется аналогично работе промисов в JavaScript. Всё, что возвращается из функции обратного вызова, становится новым объектом и будет передано в следующую команду (за исключением undefined).

Кроме того, результат последней команды Cypress в функции обратного вызова будет передан в качестве нового объекта и передан в следующую команду, если нет return.

Когда undefined возвращается функцией обратного вызова, объект не будет изменён и вместо этого перейдёт в следующую команду.

Как и промисы, вы можете вернуть любой совместимый "thenable" (любой объект, имеющий .then() интерфейс), и Cypress будет ждать его разрешения перед продолжением цепочки команд.

Примеры

У нас есть несколько дополнительных примеров в нашем Руководстве по основным понятиям, в которых подробно рассматриваются различные способы использования .then() для хранения, сравнения и отладки значений.

Элемент DOM

Выводится элемент button

cy.get('button').then(($btn) => {
  const cls = $btn.attr('class')

  cy.wrap($btn).click().should('not.have.class', cls)
})

Число передаётся из предыдущей команды

cy.wrap(1)
  .then((num) => {
    cy.wrap(num).should('equal', 1) // true
  })
  .should('equal', 1) // true

Изменение объекта

Объект el изменяется с помощью другой команды

cy.get('button')
  .then(($btn) => {
    const cls = $btn.attr('class')

    cy.wrap($btn).click().should('not.have.class', cls).find('i')
    // since there is no explicit return
    // the last Cypress command's yield is yielded
  })
  .should('have.class', 'spin') // assert on i element

Объект число изменяется с помощью другой команды

cy.wrap(1).then((num) => {
  cy.wrap(num)).should('equal', 1) // true
  cy.wrap(2)
}).should('equal', 2) // true

Объект число изменяется путём возврата

cy.wrap(1)
  .then((num) => {
    cy.wrap(num).should('equal', 1) // true

    return 2
  })
  .should('equal', 2) // true

Возврат undefined не изменит переданный объект

cy.get('form')
  .then(($form) => {
    console.log('form is:', $form)
    // undefined is returned here, but $form will be
    // yielded to allow for continued chaining
  })
  .find('input')
  .then(($input) => {
    // we have our $input element here since
    // our form element was yielded and we called
    // .find('input') on it
  })

Необработанные элементы HTMLElements оборачиваются с помощью jQuery

cy.get('div')
  .then(($div) => {
    return $div[0] // type => HTMLDivElement
  })
  .then(($div) => {
    $div // type => JQuery<HTMLDivElement>
  })

Промисы

Cypress ожидает разрешения промисов перед продолжением

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

cy.get('button')
  .click()
  .then(($button) => {
    const p = Q.defer()

    setTimeout(() => {
      p.resolve()
    }, 1000)

    return p.promise
  })

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

cy.get('button')
  .click()
  .then(($button) => {
    return Promise.delay(1000)
  })

Пример использования отложенных задач jQuery

cy.get('button')
  .click()
  .then(($button) => {
    const df = $.Deferred()

    setTimeout(() => {
      df.resolve()
    }, 1000)

    return df
  })

Примечания

Различия

В чём разница между .then() и .should()/.and()?

Использование .then() позволяет использовать переданный объект в функции обратного вызова и следует использовать, когда необходимо манипулировать значениями или выполнять некоторые действия.

При использовании функции обратного вызова с .should() или .and(), с другой стороны, существует специальная логика для повторного выполнения функции обратного вызова до тех пор, пока никакие утверждения не выбросят ошибку внутри нее. Вы должны быть осторожны с побочными эффектами в функции обратного вызова .should() или .and(), которые вы не хотите выполнять несколько раз.

Правила

Требования

  • .then() требует цепочки с предыдущей командой.

Утверждения

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

Таймауты

  • .then() может выйти за пределы таймаута при ожидании разрешения промиса, который вы вернули.

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

  • .then() не записывается в Журнал команд

История

Версия Изменения
0.14.0 Добавлен параметр timeout
< 0.3.3 Добавлена команда .then()

См. также

  • .and()
  • .each()
  • .invoke()
  • .its()
  • .should()
  • .spread()
  • Руководство: Использование замыканий для сравнения значений
  • Руководство: Цепочки команд

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

Spec-Zone.ru

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