自定义cypress命令,当顶点页面准备就绪时返回

时间:2019-04-08 14:59:59

标签: javascript oracle-apex cypress dom-events

我正在尝试使柏树适用于Oracle apex。但是,从我的自定义命令返回时,页面似乎未完全加载。

仅在触发顶点事件“ apexreadyend”(这是oracle apex页面加载中的最后一个事件)时,我才想做return w.apex;

我该怎么做? 还是可以在每次加载页面后调用它?

我设法做出了此自定义命令:

Cypress.Commands.add("apex", () => {

    cy.window().then((w) => {
        return w.apex;
    });
});

更新:
我认为事件“ apexreadyend”已经发生在这一点上,这使它毫无用处。 相反,我去检查了身体:

cy.get('body').should('not.have.class','no-anim')

但是,自定义主题可能不使用此类。 因此,这不是一个很好的解决方案。

2 个答案:

答案 0 :(得分:0)

您要等到window.apex存在吗?由于赛普拉斯的重试逻辑,您实际上不需要侦听此功能的事件。定义属性后,您只需使用cy.its()即可获取该属性的值:

Cypress.Commands.add("apex", () => {
  return cy.window()
  .its('apex') // will automatically retry until `window.apex` exists
               // or until the default timeout occurs
})

那么您应该可以像这样使用它:

it('something apex', function() {
  cy.apex().then(apex => {
    // do whatever you want with the apex object
  })
  // or, since it's wrapped, can also just do assertions like this:
  cy.apex().its('some-property').should('equal', 'abc123')
})

答案 1 :(得分:0)

您可以将事件包装在Promise中。赛普拉斯的文档中有一个有关waiting for a Promise to complete的示例。对于您的事件,它看起来像这样:

Cypress.Commands.add("apex", () => {
  const EVENT_NAME = "apexreadyend"
  return cy.window() // get a handle for the window
  .then($win => {
    return new Cypress.Promise(resolve => {
      const onReady = () => {
        $win.removeEventListener(EVENT_NAME, onReady) // cleanup
        resolve() // resolve and allow Cypress to continue
      }
      $win.addEventListener(EVENT_NAME, onReady)
    })
  })
})

然后类似的事情将起作用:

cy.apex() // wait for `apexreadyend` to fire
// do some assertions here that will only pass after apexreadyend