【问题标题】:Cypress : How can I check if an element exists without failing the test if it doesnt?赛普拉斯:如果元素不存在,我如何检查元素是否存在而不通过测试?
【发布时间】:2020-09-20 03:35:46
【问题描述】:

好的,这是我的情况:

在我正在测试的网站上,我的部分测试包括一个表格,用户可以在其中添加或删除行。我无法控制表格是否为空,因此我需要有条件(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(我可以看到日志“我在里面”)。然后,当然,在下一行(已经在 IF 内)测试失败,因为它试图对不存在的元素(空表的第一行)执行 cy.get。因此,似乎 IF 语句不起作用。

我做错了什么?

PS:我需要超时,因为加载表格需要几秒钟。我尝试将超时移动到.find (like this - if ($body.find('firstRowElement', {timeout: 60000}).length > 0) 内部,但情况更糟。当它是这样的时候,它根本不会等待并跳过所有内容,因为表还没有加载。我也不想用cy.wait

有人可以帮帮我吗?

我倾向于认为.find 和超时之间存在某种冲突。

【问题讨论】:

  • 这能回答你的问题吗? Cypress - if then functions
  • 它没有。第一个回复确切地表明了我在做什么(在我的情况下它不起作用),第二个回复提到那个人正在点击标签而不是复选框。
  • 你可以使用cypress-wait-until
  • if ($body.find('firstRowElement').length > 0, {timeout: 60000}) 很奇怪 - 超时选项通常应用于赛普拉斯命令,但这里它是一个普通的 JS if() 表达式。您是否尝试将其应用于 jQuery 表达式?
  • 我认为这就是您进入if() 的原因,而不管$body.find('firstRowElement').length 的值如何。包含超时的对象总是真实的。

标签: if-statement find element cypress exists


【解决方案1】:

您可以尝试这种非常简单的方法,但它可以让您了解如何有条件地测试类似的东西。他们的关键要素是与你所看到的一起工作。正如上面所建议的,您确实希望在您的项目中拥有类似 waitUntil 的东西以供将来参考。

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')
 }
})   

【讨论】:

    【解决方案2】:

    如果您想有条件地测试元素而不失败,普遍接受的方法是使用 jQuery 表达式(正如您所做的那样,但请参阅我上面关于超时选项阻碍该方法的评论)。

    我假设由于您应用了超时,表格行可能最终会出现,并且您将等待长达 60 秒。

    有条件测试但也使用赛普拉斯重试的一种方法是使用fail event,这里是Assert that element is not actionable in Cypress 的一个示例。

    建议仅使用on('fail') 进行调试,但在赛普拉斯自己的测试中使用 - 您应该选择是否要忽略警告。

    类似

    it('...', (done) => {
    
      cy.once('fail', () => {
        // Skipping if the command below fails (i.e first row does not exist)
        done();  // done tells the test it ends here
      });
    
      cy.get('firstRowElement', { timeout: 60000 }).then(($grid) => {
        // Do all the tests I need if the first row exists..
        done();
      )}
    
    });
    

    【讨论】:

      猜你喜欢
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2018-11-11
      • 1970-01-01
      • 2018-05-26
      • 2022-10-24
      相关资源
      最近更新 更多