wrap
返回传入 .wrap()
的对象。如果对象是一个 promise,则返回其 resolved 值。
语法
cy.wrap(subject)
cy.wrap(subject, options)
用法
正确用法
cy.wrap({ name: 'Jane Lane' })
参数
subject (Object)
要返回的对象。
options (Object)
传入一个选项对象以改变 cy.wrap()
的默认行为。
选项 | 默认值 | 描述 |
---|---|---|
log | true | 在命令日志中显示该命令 |
timeout | defaultCommandTimeout | 在超时前等待 cy.wrap() 解析的时间 |
生成结果
cy.wrap()
返回调用时传入的对象。
示例
对象
调用 wrap 中对象的函数并返 回新值
const getName = () => {
return 'Jane Lane'
}
cy.wrap({ name: getName }).invoke('name').should('eq', 'Jane Lane') // true
元素
包裹元素以继续执行命令
cy.get('form').within(($form) => {
// ... 更多命令
cy.wrap($form).should('have.class', 'form-container')
})
条件性包裹元素
cy.get('button').then(($button) => {
// $button 是一个包裹的 jQuery 元素
if ($button.someMethod() === 'something') {
// 包裹这个元素以便我们可以
// 在其上使用 Cypress 命令
cy.wrap($button).click()
} else {
// 做其他事情
}
})
Promise
你可以包裹应用代码返回的 promise。Cypress 命令会自动等待 promise 解析,然后将解析后的值传递给下一个命令或断言。完整示例请参见使用应用代码登录的示例。
简单示例
const myPromise = new Promise((resolve, reject) => {
// 使用 setTimeout(...) 模拟异步代码
setTimeout(() => {
resolve({
type: 'success',
message: 'It worked!',
})
}, 2500)
})
it('should wait for promises to resolve', () => {
cy.wrap(myPromise).its('message').should('eq', 'It worked!')
})

应用示例 仅限端到端测试
// 导入用于登录的应用代码
import { userService } from '../../src/_services/user.service'
it('can assert against resolved object using .should', () => {
cy.log('user service login')
const username = Cypress.env('username')
const password = Cypress.env('password')
// 包裹应用代码返回的 promise
cy.wrap(userService.login(username, password))
// 检查返回的对象
.should('be.an', 'object')
.and('have.keys', ['firstName', 'lastName', 'username', 'id', 'token'])
.and('contain', {
username: 'test',
firstName: 'Test',
lastName: 'User',
})
// cy.visit 命令会等待 "userService.login" 返回的 promise 解析
// 然后设置本地存储项,访问将立即通过认证并登录
cy.visit('/')
// 我们应该已经登录
cy.contains('Hi Test!').should('be.visible')
})
注意: .wrap()
不会为你同步异步函数调用。例如,给定以下示例:
- 你有两个异步函数
async function foo() {...}
和async function bar() {...}
- 你需要确保
foo()
先解析,然后再调用bar()
bar()
还依赖于调用其他 Cypress 命令后创建的某些数据。
如果你在 cy.wrap()
中包裹异步函数,那么 bar()
可能会在所需数据可用之前被过早调用:
cy.wrap(foo())
cy.get('some-button').click()
cy.get('some-input').type(someValue)
cy.get('some-submit-button').click()
// 这会立即执行 `bar()`,而不会等待
// 其他 cy.get(...) 函数完成
cy.wrap(bar()) // 不要这样做
这种行为是由于函数调用 foo()
和 bar()
会立即调用函数以返回一个 Promise。
如果你希望 bar()
在 foo()
和 cy.get() 命令之后执行,一个解决方案是使用 .then() 链式调用最后一个命令:
cy.wrap(foo())
cy.get('some-button').click()
cy.get('some-input').type(someValue)
cy.get('some-submit-button')
.click()
.then(() => {
// 这会在其他 cy.get(...) 函数完成后
// 执行 `bar()`
cy.wrap(bar())
})
规则
要求
cy.wrap()
需要链式调用cy
。
断言
- 当参数是 promise 时,
cy.wrap()
会自动等待直到 promise 解析。如果 promise 被拒绝,cy.wrap()
会使测试失败。 cy.wrap()
会自动重试,直到所有链式断言通过。
超时设置
cy.wrap()
可能会在等待添加的断言通过时超时。
命令日志
对对象进行断言
cy.wrap({ amount: 10 }).should('have.property', 'amount').and('eq', 10)
上述命令将在命令日志中显示为:

当点击命令日志中的 wrap
命令时,控制台会输出以下内容:

历史
版本 | 变更 |
---|---|
3.2.0 | 当后跟 .should() 时,如果 undefined 则重试 cy.wrap() |
0.4.5 | 添加了 cy.wrap() 命令 |