我正在尝试使柏树适用于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')
但是,自定义主题可能不使用此类。 因此,这不是一个很好的解决方案。
答案 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