如何在柏树中停止循环 [英] How to stop loop in cypress
问题描述
我有一个循环检查 40 个项目.当我找到> 0 的第一个元素时,我想停止我的循环这是我的代码
I have a loop checking 40 items. I want to stop my loop, when I am finding the first element, which > 0 This is my code
var genArr = Array.from({ 长度: 40 }, (v, k) => k + 1);
var genArr = Array.from({ length: 40 }, (v, k) => k + 1);
cy.wrap(genArr).each((index) => {
cy.get('.list-item').eq(index - 1).find('.number')
.invoke('text')
.then(text => {
const pendingCount = text;
cy.get('.list-item').eq(index - 1).click();
cy.get('.list-table').find('.list-table-list-item')
.should('have.length', pendingCount);
if (text > 0) break
});
});
});
但是我有一个语法错误.请帮助我,我怎样才能打破我的循环
But I have a syntax error. Help me pls, How can I break my loop
推荐答案
break
仅适用于原生 for
/while
循环.
break
works only for native for
/while
loops.
要提前退出 .each
循环(如评论中所建议的那样),false
必须从您传递给它的同一个回调中返回,因此返回嵌套的 then
回调中的 false
将不起作用.
To exit early from an .each
loop (as was suggested in the comments), the false
must be returned from the same callback you pass to it, so returning false
from the nested then
callback won't have an effect.
你甚至不能在 then
回调中设置一个标志并在 each
回调中检查它,因为 .each()
命令在深处只是一个 jQuery.fn.each
---它是同步的,当你设置标志时,所有迭代都将运行(并将嵌套命令排入队列).
You can't even set a flag in the then
callback and check it in the each
callback, because .each()
command is deep down just a jQuery.fn.each
--- it's synchronous and by the time you'd set up the flag, all iterations will have run (and enqueued the nested commands).
因此,唯一的选择是不使用.each()
,而使用某种递归命令.让我们建立一个.
Thus, the only option is not to use .each()
, and use some kind of recursive command. Let's build one.
function walk ( arr, cb, index = 0 ) {
if ( !arr.length ) return;
arr = arr.slice();
const ret = cb(index, arr.shift());
((ret && ret.chainerId) ? ret : cy.wrap(ret))
.then( ret => {
if ( ret === false ) return;
return walk(arr, cb, index + 1);
});
}
/**
* Your callback should return/yield `false` if the loop is to exit early.
*/
Cypress.Commands.add('eachSeries', { prevSubject: 'optional' }, (subject, arr, cb) => {
return subject
// assume `arr` to be `cb`
? walk(subject, arr)
: walk(arr, cb);
});
用法:
describe('test', () => {
it('test', () => {
cy.document().then(doc => {
doc.body.innerHTML = `
<div class="list-item">0</div>
<div class="list-item">1</div>
<div class="list-item">2</div>
<div class="list-item">3</div>
`;
});
var genArr = Array.from({ length: 40 }, (v, k) => k + 1);
// the command can be chained on an existing subject
cy.wrap(genArr).eachSeries((index) => {
return cy.get('.list-item').eq(index)
.invoke('text')
.then(text => {
if (text > 1) return false;
});
});
// or it can start the chain (the array is passed as 1st arg)
cy.eachSeries(genArr, (index) => {
return cy.get('.list-item').eq(index)
.invoke('text')
.then(text => {
if (text > 1) return false;
});
});
// you can also return a promise
cy.eachSeries(['a', 'b', 'c'], (index, value) => {
return new Promise(resolve => {
setTimeout(() => {
resolve(value === 'b' ? false : true);
}, 500);
});
});
// non-thenable callbacks work too
cy.eachSeries(['a', 'b', 'c'], (index, value) => {
return value === 'b' ? false : true;
});
});
});
在上面的前两个示例中,只有前 3 个项目被循环通过,然后循环提前退出.
In the first two examples above, only the first 3 items are looped through and then the loop exits early.
这篇关于如何在柏树中停止循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!