赛普拉斯 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中只能用var
、let
和const
声明变量,对吧?
糟糕,我的错。我重写了这个,我用 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 请求?