【问题标题】:Cypress IO- Writing a For Loop赛普拉斯 IO- 编写 For 循环
【发布时间】: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 来重现问题。

标签: javascript cypress


【解决方案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.* 调用的执行顺序不确定。
        猜你喜欢
        • 2022-12-19
        • 2022-07-21
        • 2020-07-02
        • 2019-03-15
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        • 2020-12-23
        相关资源
        最近更新 更多