当前位置: 首页 > 知识库问答 >
问题:

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

景仲渊
2023-03-14

好的,我的情况如下:

在我测试的网站上,我测试的一部分包括一个表,用户可以在其中添加或删除行。我无法控制表是否是空的,所以我需要条件(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中),测试失败,因为它试图对不存在的html" target="_blank">元素(空表的第一行)执行cy.get。因此,IF语句似乎不起作用。

我做错了什么?

PS:我需要超时,因为表需要几秒钟加载。我尝试将超时移动到. search内部(像这样-if($body.find('firstRowElement',{timeout: 60000}))。长度

有人能帮我吗?

我倾向于相信在之间存在某种冲突。查找和超时。


共有2个答案

查宜民
2023-03-14

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

我假设,因为您应用了一个超时,所以表行可能最终会出现,也可能不会出现,您将等待60秒。

有条件测试的一种方法,也是使用Cypress重试的一种方法是使用失败事件,这里有一个例子,即断言元素在Cypress中不可操作。

建议只使用on('fail')进行调试,但在Cypress自己的测试中使用-如果要忽略警告,则应选择此选项。

差不多

js prettyprint-override">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();
  )}

});
周辉
2023-03-14

你可以尝试这种方法,非常简单,但它给了你一个如何有条件地测试这样东西的想法。他们的关键要素是与你所看到的一起工作。如上所述,你真的希望在你的项目中有一些类似等待的东西作为将来的参考。

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')
 }
})   
 类似资料:
  • rank ▲ ✰ vote url 17 776 241 907 url 检查一个文件夹是否存在,如果不存在就创建它 有什么好的方法吗?这个是我想的: filename = "/my/directory/filename.txt" dir = os.path.dirname(filename) try: os.stat(dir) except: os.mkdir(dir) f

  • 问题内容: 示例:我正在检查是否存在像这样的数组元素: 但是,我不断收到此错误: 当然,我第一次想要实例时,$ instances不会知道密钥。我想我对可用实例的检查是错误的? 问题答案: 您可以使用语言构造或函数。 应该更快一些 (因为它不是函数) ,但是如果元素存在并且具有value,则将返回false 。 例如,考虑以下数组: 和这三个测试,依赖于: 第一个会得到您( 该元素存在,并且不为n

  • 问题内容: 我正在尝试编写一个脚本,该脚本需要根据CSS选择器找到的特定浏览器对象是否存在来适应其工作流程行为。 我不想使用document.getElementByID方法,因为从技术上讲,这不是CSS选择器,并且我们整个企业都在CSS选择器上进行了标准化,因此在DOM以外的其他任何选择都不会使CSS选择器超出我们的代码审查过程无论如何。 ThingSelector在哪里: OpenThing在

  • 问题内容: 如果我这样做: 然后创建文件,并始终返回“文件存在”。是否可以不创建文件就检查文件是否存在? 编辑: 我忘了提到它处于for循环中。所以这是真实的东西: 问题答案: 实例化a时,您并没有在磁盘上创建任何东西,而只是构建了一个可以调用某些方法的对象,例如。 既好又便宜,不要试图避免这种实例化。 该实例只有两个字段: 这是构造函数: 如您所见,实例只是路径的封装。创建它以便进行调用是继续进

  • 我已经将Selenium WebDriver添加到Powershell并创建WebDriver实例: 现在我要找到输入字段: 我发现了几个如何在C#中“测试元素是否存在”的例子: Selenium WebDriver-测试元素是否存在

  • 在尝试使用注释时,我的感觉是没有完美的方法来检查元素的存在。 对我来说,使用页面对象的经典定义(例如)比使用更灵活。使用@findby,我总是处理WebElement本身,之前没有机会检查是否存在,对吗? 使用检查页面对象上下文中元素的DOM存在的最佳pratice解决方案是什么?还是为了安全起见,我应该按继续使用