赛普拉斯IO-编写For循环

时间:2018-09-06 22:26:42

标签: javascript cypress

我在页面上有15个按钮。我需要测试每个按钮。

我尝试了一个简单的for循环,例如

for (var i = 1; i < 15; i++) {

   cy.get("[=buttonid=" + i + "]").click()
}

但是赛普拉斯不喜欢这样。我该如何在赛普拉斯中编写循环?

3 个答案:

答案 0 :(得分:5)

要强制执行任意循环,我用所需的索引创建一个数组,然后调用cy.wrap

var genArr = Array.from({length:250},(v,k)=>k+1)
cy.wrap(genArr).each((index) => {
    cy.get("#button-" + index).click()
})

答案 1 :(得分:1)

使用反引号尝试模板文字:

for(let i = 0; i < 3; i++){
    cy.get(`ul li:nth-child(`${i}`)).click();
}

答案 2 :(得分:0)

虽然 cy.wrap().each() 会起作用(针对这个问题给出的答案之一),但我想提供一种对我有用的替代方法。 cy.wrap().each() 会起作用,但由于 cypress 的异步性质,常规的 while/for 循环将不适用于 cypress。在再次开始循环之前,赛普拉斯不会等待循环中的所有内容完成。但是,您可以改为执行递归函数,并在再次访问方法/函数之前等待所有内容完成。

这是一个简单的例子来解释这一点。你可以检查一个按钮是否可见,如果它可见你点击它,然后再次检查它是否仍然可见,如果它可见你再次点击它,但如果它不可见它不会'点击它。这将重复,该按钮将继续被单击,直到该按钮不再可见。基本上,方法/函数会被反复调用,直到不再满足条件,这与 for/while 循环完成相同的事情,但实际上适用于 cypress。

clickVisibleButton = () => {
        cy.get( 'body' ).then( $mainContainer => {
            const isVisible = $mainContainer.find( '#idOfElement' ).is( ':visible' );
            if ( isVisible ) {
                cy.get( '#idOfElement' ).click();
                this.clickVisibleButton();
            }
        } );
    }

然后显然在您的测试中调用 this.clickVisibleButton()。我正在使用打字稿,并且此方法是在类中设置的,但您也可以将其作为常规函数来执行。