jquery Cypress:根据元素的属性之一检查元素是否存在

dohp0rv5  于 2023-02-18  发布在  jQuery
关注(0)|答案(3)|浏览(228)

我正在编写Cypress端到端测试,我需要首先检查一个特定的按钮是否出现在我的网页上(条件测试)。
我是这么做的:

cy.get('body')
    .then($body => {

      if ($body.has(".myClass").length) {
        //DO SOMETHING
      }
    })

这个方法很好用,但是当我试图根据子元素的属性而不是类来选择子元素时,却找不到子元素,这意味着这个方法不起作用:

cy.get('body')
    .then($body => {

      if ($body.has("div[data-cy='deleteButton']").length) {
        //DO SOMETHING
      }
    })

我不明白出了什么问题。有人知道吗?
我做了进一步的实验,看起来即使使用class,一些子元素也找不到。下面你可以看到HTML结构和我可以用作标识符的class,我不能用作标识符的class和我正在尝试使用的data-cy属性:

vltsax25

vltsax251#

这看起来像是条件测试和异步加载的问题。if语句可能在页面加载之前运行。
如果你用一个简化的静态页面

<body>
  <div data-cy="deleteButton"></div>
</body>

并在浏览器中打开,则测试通过

cy.get('body').then($body => {
  const exists = $body.has("div[data-cy='deleteButton']").length
  expect(exists).to.eq(true)
})

所以问题很可能是由于加载延迟。
请尝试使用静态元素,而不是$body,该静态元素靠近页中也异步加载但不是条件加载的部分
我猜

cy.get('div[title="Testlaufverwaltung und Testbericht"]').then($title => {
  const exists = $title.has("div[data-cy='deleteButton']").length
  expect(exists).to.eq(true)
})
z0qdvdin

z0qdvdin2#

if ($body.find("div[data-cy='deleteButton']").length) {
        //DO SOMETHING
      }
tnkciper

tnkciper3#

您可以像这样使用.attr jquery方法:

cy.get('body').then(($body) => {
  if ($body.attr('data-cy') == 'deleteTestlaufButton') {
    //DO SOMETHING
  }
})

相关问题