我正在运行一个 cypress 测试,该测试需要在单击元素并登录之前加载页面,但由于某种原因,失败(并中止)的 GET 请求导致页面永远加载并最终超时,除非我添加cy.click() 调用之前的 cy.wait(6000)。我需要以某种方式等待页面加载而不使用 cy.wait()。鉴于我无法修复中止的 GET 请求,我该怎么做?
cy.visit(loginUrl)
cy.url().should('contain', '#/loginPortal')
cy.wait(6000) //Allows page to load before trying to log in, needs to be removed
cy.contains('ButtonText').click()
Run Code Online (Sandbox Code Playgroud) 与此相反,我如何不等待页面load事件。我遇到的情况是,单击生成表单提交并开始下载。然后 Cypress 等待load从未发生的页面事件。
我试过了:
setTimeout(
cy.window().then(win => {
win.dispatchEvent(new Event('load'))
}), 5000);
cy.get('#btn').click();
//and also tried:
cy.get('form.excel-data').submit() //redirect to server
//and:
cy.on('window:before:load', (win) => {
win.removeEventListener('load');
})
cy.get('#btn').click();
Run Code Online (Sandbox Code Playgroud)
** 我知道最佳实践以及我不应该下载测试href等...但我的问题仍然存在。
我正在尝试创建一些基本测试来尝试新的Cypress库。在我的测试中,我正在cy.visit('http://mywebsite.com');加载一个使用 SystemJS 的 AngularJS 应用程序。
如果我正确理解 Cypress,我不需要做任何其他事情,它会确保在运行其他任何操作之前加载页面。然而,这似乎不起作用,因为页面已加载,但 SystemJS 仍在加载模块。
在不使用 的情况下,如何让 Cypress 等待所有 SystemJS 模块加载,然后再运行更多测试cy.wait(5000)?
编辑
感谢 Dwelle,这是适合我的解决方案。我将初始的 System.import 包装在一个承诺中,一旦 AngularJS 应用程序启动,该承诺就会得到解决。
window.APP_READY = new Promise(function(resolve, reject) {
System.import('app').then(function(app) {
angular.element(document).ready(function() {
angular.bootstrap(document, ['app']);
resolve();
});
});
});
Run Code Online (Sandbox Code Playgroud)
然后在测试中
cy.visit('http://mywebsite.com').its('APP_READY');
Run Code Online (Sandbox Code Playgroud)