each
遍历类数组结构(数组或具有length
属性的对象)。
在.each()
之后继续链式调用依赖于该主题的命令是不安全的。
语法
.each(callbackFn)
用法
正确用法
cy.get('ul>li').each(() => {...}) // 遍历每个'li'
cy.getCookies().each(() => {...}) // 遍历每个cookie
错误用法
cy.each(() => {...}) // 错误,不能从'cy'开始链式调用
cy.clock().each(() => {...}) // 错误,'clock'不返回数组
参数
callbackFn (函数)
传入一个函数,该函数接收以下参数:
value
index
collection
生成结果
.each()
返回与传入时相同的主题。- 在
.each()
之后继续链式调用依赖于该主题的命令是不安全的。
示例
DOM元素
遍历DOM元素数组
cy.get('ul>li').each(($el, index, $list) => {
// $el是一个包装的jQuery元素
if ($el.someMethod() === 'something') {
// 包装该元素以便我们可以
// 在其上使用Cypress命令
cy.wrap($el).click()
} else {
// 执行其他操作
}
})
始终返回原始数组
无论回调函数返回什么,.each()
始终返回原始数组。
cy.get('li')
.should('have.length', 3)
.each(($li, index, $lis) => {
return 'something else'
})
.then(($lis) => {
expect($lis).to.have.length(3) // true
})
Promise
等待Promise
如果回调函数返回一个Promise
,在遍历集合中的下一个元素之前会等待该Promise完成。
cy.wrap([1, 2, 3]).each((num, i, array) => {
return new Cypress.Promise((resolve) => {
setTimeout(() => {
resolve()
}, num * 100)
})
})
注意事项
提前返回
提前停止each
循环
通过在回调函数中返回false
,可以提前停止.each()
循环。
规则
要求
.each()
需要链式调用在前一个命令之后。
断言
.each()
只会运行一次你链式调用的断言,不会重试。
超时设置
.each()
可能会因等待你返回的Promise解析而超时。
命令日志
cy.each()
不会在命令日志中记录