如何在柏树中停止循环 [英] How to stop loop in cypress

查看:30
本文介绍了如何在柏树中停止循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个循环检查 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆