我在页面上有15个按钮。我需要测试每个按钮。
我尝试了一个简单的for循环,例如
for (var i = 1; i < 15; i++) {
cy.get("[=buttonid=" + i + "]").click()
}
但是赛普拉斯不喜欢这样。我该如何在赛普拉斯中编写循环?
答案 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()
。我正在使用打字稿,并且此方法是在类中设置的,但您也可以将其作为常规函数来执行。