赛普拉斯 IO- 编写 For 循环

Posted

技术标签:

【中文标题】赛普拉斯 IO- 编写 For 循环【英文标题】:Cypress IO- Writing a For Loop 【发布时间】:2019-02-12 05:40:35 【问题描述】:

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

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

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

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

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

【问题讨论】:

什么是 Int? JS中只能用varletconst声明变量,对吧? 糟糕,我的错。我重写了这个,我用 int 而不是 var @konekoya 赛普拉斯“不喜欢它”是什么意思?是否抛出错误?您的意思是在 buttonid 前面加上等号吗? cy.get 会返回什么吗? for 循环不是这里的问题 - 我认为您的选择器不正确(应该是 buttonid=,而不是 =buttonid=)。请包括 cypress 给出的错误消息,以及足够的 html 来重现问题。 【参考方案1】:

// 每次尝试等待 2 秒

refreshQuote(attempts) 
    let arry = []
    for (let i = 0; i < attempts; i++)  arry.push(i) 
    cy.wrap(arry).each(() => 
        cy.get('.quote-wrapper').then(function($quoteBlock) 
            if($quoteBlock.text().includes('Here is your quote')) 
            
            else 
                cy.get('#refreshQuoteButton').click()
                cy.wait(2000)
            
        )
    )

【讨论】:

【参考方案2】:

虽然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()。我使用的是打字稿,这个方法是在一个类中设置的,但你也可以把它作为一个常规函数来做。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

这是唯一可靠的方法,至少在代码执行顺序很重要的情况下。值得注意的是 - 由于 cypress 的异步特性 - 经典的 for 循环可能会导致循环内 cy.* 调用的执行顺序不确定。

以上是关于赛普拉斯 IO- 编写 For 循环的主要内容,如果未能解决你的问题,请参考以下文章

赛普拉斯:我们如何在赛普拉斯中使用不记名令牌编写 GET 请求?

如何将环境名称传递给赛普拉斯测试以加载一组环境变量?

如何在赛普拉斯 e2e 测试之前设置 NGRX 状态?

赛普拉斯/GitLab CI/CD 集成 - 赛普拉斯不会在无头模式下启动

如何查看赛普拉斯测试使用的属性值?

使用赛普拉斯,我将如何编写一个简单的测试来检查页面上是不是存在徽标图像