自定义Cypress命令中的每个循环都中断



我有一个自定义Cypress命令来滚动列表,直到到达传递到命令中的项目。在我的命令中,我有$.each,所以我可以将项目名称与传递给函数的项目名称进行比较。如果匹配,我就发送一个点击命令"ENTER"在我的环境中。我能够成功地滚动列表并找到我正在寻找的项目并单击它,但循环继续执行。我添加了return false,这是Cypress所说的应该打破循环,但它现在为我工作。知道为什么会这样吗?

listItems.getChildren('OneLineTextElement', 'type').each(($elm) => {
let labelAndValue = cy.wrap($elm).getChildren('LabelAndValue')
let label = labelAndValue.getChild('Label')
label.getProperty('texture-text').then(val => {
if (val == subject) {
cy.action('ENTER')
return false
}
else {
cy.action('DOWN')
}
})
})

您可以尝试在.each()命令的作用域中添加一个控制变量

listItems.getChildren('OneLineTextElement', 'type').each(($elm) => {
let done = false;
let labelAndValue = cy.wrap($elm).getChildren('LabelAndValue')
let label = labelAndValue.getChild('Label')
label.getProperty('texture-text').then(val => {
if (val == subject) {
cy.action('ENTER').then(() => {  // is cy.action a custom command? 
// Likely you may need to wait
done = true;
})
} else {
cy.action('DOWN')
}
})
if (done) {
return false;
}  
})

然而,有一些方法调用看起来像自定义命令在.each(),所以你可能不会得到你所期望的执行流(Cypress命令和测试javascript可以异步运行)。

看起来代码可能会被重构以避免"滚动列表"。唯一不能做的是cy.action('DOWN')在非主题列表项目。

listItems.getChildren('OneLineTextElement', 'type')
.getChildren('LabelAndValue')
.getChild('Label')
.getProperty('texture-text')
.should(val => {
expect(val).to.equal(subject); 
cy.action('ENTER');
})

您必须在循环中找到匹配后使用promise,然后应用断言。下面是在对应年龄字段的第8列中搜索值'23'的示例。

cy.get('.column-8')
.each(ele => {
if (ele.text() === '23') {
isValuePresent = true
if (isValuePresent) return false
}
}).then(() => {
expect(isValuePresent).to.be.true
})

最新更新