如果在柏树中循环则中断

时间:2020-08-07 16:22:38

标签: javascript ui-automation cypress

我们有以下情况

iterate over name elements in the page
 if(name.text() == expName)
{
name.click()
exit from if loop
}
else
{
createName()
}

我如何在赛普拉斯中实现这一点,因为返回false不会从if循环中退出。 这是我尝试过的代码

export function addProtocol(protocolName, protocolStatus) {
  let flag = "false";
  subject.view({ name: "ProtocolsExplorerList" }).as('currentView');
  cy.get('@currentView').find('td textarea').each($el => {
    cy.wrap($el).invoke('val').then($value => {
      console.log("valueee:" + $value);
      if ($value == protocolName) {
        cy.get($el).click();
        flag = "true";
        return false;
      }
    })
  })

  if (flag == "false") {

    subject.button({ class: "New" }).click();
    subject.field("Name").type(protocolName);
    subject.field("Status").setCaption(protocolStatus);
    save();
    cy.contains(protocolName).click();

  }

}

有什么建议吗? 谢谢。

2 个答案:

答案 0 :(得分:0)

documentation具体说:

您可以通过在回调中返回false来提前停止.each()循环 功能。

所以可能还有其他事情发生。

答案 1 :(得分:0)

问题是您不会从each的{​​{1}}回调中返回。您使用falsethen回调返回。 false回调通常异步运行,这意味着回调在then完成迭代后执行。

我对cypress不熟悉,但是假设他们在其收藏夹上实现了iterator protocol,则可以使用:

each

您必须将包装功能设为const textareas = cy.get('@currentView').find('td textarea'); for (const $el of textareas) { const $value = await cy.wrap($el).invoke('val'); console.log("valueee:" + $value); if ($value == protocolName) { cy.get($el).click(); flag = "true"; break; } } ,才能使用async function