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() |
См. также
© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/commands/then