在 Cypress 循环中,如果条件满足 return true,否则在迭代结束后 return false

In Cypress loop return true if condition satisfies, else return false after the iteration ends

我需要 运行 循环遍历具有相同 CSS 选择器的多个元素,如果 element.text() 与字符串匹配,则 return 为真。如果没有匹配项,则最后 return false。
我尝试了类似下面的方法,但没有用:

getProfilePresentOrNot(profileName) {
  var flag = 0;
  cy.get('li>div>div>span').each(($el,index,$list) => {
    if ($el.text().includes(profileName)) {
      flag=1;
    }
  });
  return flag;
}

这个函数总是returns 0,即使我可以确认 if 块中的条件满足。

@JeremyKahan 是正确的,这就像混合了同步和异步代码。同步代码总是先执行。

基本上加几个console.log()

就可以看出来了
function getProfilePresentOrNot(profileName) {
  var flag = 0;
  cy.get("li>div>div>span").each(($el, index, $list) => {
    if ($el.text().includes(profileName)) {
      console.log('Setting flag')
      flag = 1;
    }
  });
  console.log('Returning flag')
  return flag;
}

这将在 devtools 中打印

Returning flag
Setting flag                // because cy.get(...).each(...) ran later

您可以使用自定义命令

Cypress.Commands.add('getProfilePresentOrNot', (profileName) => {
  cy.get("li>div>div>span")
    .invoke('text')                                  // all text from all spans
    .then(allText => allText.includes(profileName))  // returns the result of .includes(...)
})

必须这样使用

cy.getProfilePresentOrNot('someprofilename')
  .then(isPresent => {  // true or false
    if (isPresent) {
      ...
    }
  })

或者如果您绝对确定所有li>div>div>span都出现在页面中,您仍然可以使用函数但切换到同步赛普拉斯代码(即 jQuery)。

function getProfilePresentOrNot(profileName) {
  const allText = Cypress.$("li>div>div>span").text()
  return allText.includes(profileName);
}

可以这样调用

const isPresent = getProfilePresentOrNot('someprofilename')

自定义命令是最安全的,因为在生产网页上有很多东西可能无法通过测试,因为无法立即找到该元素,而赛普拉斯异步命令具有避免这些问题的内置机制。