Skip to main content
Cypress应用

wrap

返回传入 .wrap() 的对象。如果对象是一个 promise,则返回其 resolved 值。

语法

cy.wrap(subject)
cy.wrap(subject, options)

用法

正确用法

cy.wrap({ name: 'Jane Lane' })

参数

subject (Object)

要返回的对象。

options (Object)

传入一个选项对象以改变 cy.wrap() 的默认行为。

选项默认值描述
logtrue命令日志中显示该命令
timeoutdefaultCommandTimeout超时前等待 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!')
})
包裹 promise

应用示例
仅限端到端测试

// 导入用于登录的应用代码
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

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

控制台日志 wrap

历史

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

另请参阅