If statement Cypress:如果一个元素不存在,我如何检查它是否存在而不使测试失败?
好的,我的情况如下: 在我正在测试的网站上,我测试的一部分包括一个表,用户可以在其中添加或删除行。我无法控制表是否为空,因此我需要使用条件(if)来探索两种情况:1。桌子是空的;2.桌子不是空的 我想到的只是检查表的第一行是否存在。如果有,做一些测试,然后继续,如果没有跳过表格,继续下一篇文章 当然,我不能试着在第一行做一个cy.get,因为如果它找不到元素,它将无法通过测试,所以我尝试了以下方法:If statement Cypress:如果一个元素不存在,我如何检查它是否存在而不使测试失败?,if-statement,find,element,cypress,exists,If Statement,Find,Element,Cypress,Exists,好的,我的情况如下: 在我正在测试的网站上,我测试的一部分包括一个表,用户可以在其中添加或删除行。我无法控制表是否为空,因此我需要使用条件(if)来探索两种情况:1。桌子是空的;2.桌子不是空的 我想到的只是检查表的第一行是否存在。如果有,做一些测试,然后继续,如果没有跳过表格,继续下一篇文章 当然,我不能试着在第一行做一个cy.get,因为如果它找不到元素,它将无法通过测试,所以我尝试了以下方法: cy.get('body').then(($body) => {
cy.get('body').then(($body) => {
if ($body.find('firstRowElement').length > 0, {timeout: 60000}) {
cy.log("Im Inside")
cy.get('firstRowElement').then(($grid) => {
//Do all the tests I need if the first row exists..
)}
}
)}
但它不起作用。即使表是空的,它仍然输入IF(我可以看到日志“iminside”)。当然,在下一行(已经在IF中),测试失败,因为它试图对不存在的元素(空表的第一行)执行cy.get。因此,IF语句似乎不起作用
我做错了什么
PS:我需要超时,因为加载表需要几秒钟。我尝试将超时移动到.find(如-if($body.find('firstRowElement',{timeout:60000}).length>0)中
,但更糟糕的是,在这种情况下,它根本不会等待并跳过所有内容,因为表尚未加载。我也不想使用cy.wait
有人能帮我吗
我倾向于认为,
.find
和timeout之间存在某种冲突。您可以尝试这种方法,非常简单,但它让您了解如何有条件地测试类似的内容。它们的关键要素是处理您所看到的内容。如上所述,您确实希望有类似waitunt for fut的内容在你的项目中提供参考
cy.get('parent element of matrix or body').then($body => {
cy.waitUntil(() => cy.get('parent element of first row')
.then($selector => $selector.is(':visible') === true), { timeout: 60000 })
if ($body.find('first Row Element').is(':visible')) {
cy.log('A row exists')
} else {
cy.log('A row doesnt exists')
}
})
如果您想有条件地测试一个元素而不失败,一般接受的方法是使用jQuery表达式(正如您所做的,但请参阅我上面关于超时选项阻碍该方法的评论) 我假设,因为您应用了一个超时,表行可能会出现,也可能不会出现,并且您将等待60秒 有条件地测试但也使用Cypress retry的一种方法是使用,下面是一个示例 建议只使用
on('fail')
进行调试,但在Cypress自己的测试中使用-如果要忽略警告,则应选择此选项
差不多
it(“…”,(完成)=>{
cy.once('fail',()=>{
//如果下面的命令失败(即第一行不存在),则跳过
done();//done告诉测试到此结束
});
get('firstRowElement',{timeout:60000})。然后($grid)=>{
//如果第一行存在,请执行我需要的所有测试。。
完成();
)}
});
这回答了你的问题吗?它没有。第一个回答确切地表明了我在做什么(在我的情况下,它不起作用),第二个回答提到这个家伙正在单击标签而不是复选框。你可以使用如果($body.find('firstRowElement')。长度>0,{timeout:60000})
很奇怪-超时选项通常应用于Cypress命令,但这里它是在一个普通的JSif()
表达式中。您是否试图将其应用于jQuery表达式?我认为这就是为什么不管if()
的$body.find('firstRowElement')的值是多少,都会进入if()
.length。包含超时的对象总是真实的。