If statement Cypress:如果一个元素不存在,我如何检查它是否存在而不使测试失败?

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) => {

好的,我的情况如下:

在我正在测试的网站上,我测试的一部分包括一个表,用户可以在其中添加或删除行。我无法控制表是否为空,因此我需要使用条件(if)来探索两种情况:1。桌子是空的;2.桌子不是空的

我想到的只是检查表的第一行是否存在。如果有,做一些测试,然后继续,如果没有跳过表格,继续下一篇文章

当然,我不能试着在第一行做一个cy.get,因为如果它找不到元素,它将无法通过测试,所以我尝试了以下方法:

             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命令,但这里它是在一个普通的JS
if()
表达式中。您是否试图将其应用于jQuery表达式?我认为这就是为什么不管
if()
的$body.find('firstRowElement')的值是多少,都会进入
if()
.length。包含超时的对象总是真实的。