【问题标题】:How to listen global events with Cypress?如何使用 Cypress 监听全球事件?
【发布时间】:2019-04-08 23:09:29
【问题描述】:

我们有一个应用程序定期轮询服务器,直到任务完成。我们触发了一个全局事件,以便 Cypress 可以捕获并确定任务是否完成,但我们在 Cypress 上使用 document.addEventListener 时遇到了问题。这是我们正在做的事情:

document.addEventListener('queryEnd', () => {
    cy.get('.chart').should('be.visible')
    cy.get('.table').should('be.visible')
  })

但是;当我们在规范中使用它时,它不会按预期工作,我们无法捕捉到它。此外,赛普拉斯不等待测试并运行afterEach,而无需等待回调运行。

【问题讨论】:

    标签: cypress


    【解决方案1】:

    您的代码未按预期运行的原因是,在赛普拉斯中,您的测试运行在与被测应用程序 (AUT) 不同的框架中。您等待的事件永远不会在 Cypress 的 document 中触发。

    要获取 AUT 的 document,请像这样使用 cy.document()

    cy.document()
    .then($document => {
      // now $document is a reference to the AUT Document
      $document.addEventListener(...)
    })
    

    要让赛普拉斯在继续之前等待您的事件,您可以将其包装在 Cypress.Promise 中。赛普拉斯文档有一个关于 waiting for a Promise to complete 的示例。对于您的 queryEnd 事件,它看起来像这样:

    cy.document() // get a handle for the document
    .then($document => {
      return new Cypress.Promise(resolve => { // Cypress will wait for this Promise to resolve
        const onQueryEnd = () => {
          $document.removeEventListener('queryEnd', onQueryEnd) // cleanup
          resolve() // resolve and allow Cypress to continue
        }
        $document.addEventListener('queryEnd', onQueryEnd)
      })
    })
    .then(() => {
      cy.get('.chart').should('be.visible')
      cy.get('.table').should('be.visible')
    })
    

    【讨论】:

    • 它应该适用于shiny:value 此处描述的事件shiny.rstudio.com/articles/js-events.html 吗?
    • @AdamB 是的,应该
    • 避免竞争条件似乎很复杂,因为事件侦听器是在cy.visit 之后添加的,可能存在该事件已经被触发的风险。使用cy.window() 感觉更可靠,因为window 对象比window.document 更早可用。
    • @EricBurel 好点。最好将此添加为cy.visitonBeforeLoad 回调,而不是cy.document().thency.window().then,因为您描述的原因:docs.cypress.io/api/commands/…
    • 比这更好的是,为一个事件添加一个监听器,明确地导致该事件发生(如使用 cy.click()),然后断言它发生了。如果您能够像这样订购应用程序的操作,则没有竞争条件。但是对于仅在加载时发生的事情可能会很困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2011-12-20
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    相关资源
    最近更新 更多