3 回答
TA贡献1864条经验 获得超6个赞
更新:这并不可靠。我刚刚做了一些重构,看来这个解决方案也有缺陷。重定向可能发生在 cypress 访问页面和触发 之间,cy.wait因此测试最终会等待已经发生的事情。下面的内容可能仍然适合您,具体取决于您的重定向何时被触发,但如果它是在初始化时触发的,则这似乎不起作用。
不太喜欢这个解决方案,因为重定向仍然发生(我还没有找到取消它的方法),但它至少测试了重定向是否发生,并允许我检查查询:
cy.intercept({ pathname: `/sessions/new` }).as(`loginRedirect`)
cy.visit(`/dashboard/`)
cy.location().then(($location) => {
cy.wait(`@loginRedirect`).then(($interceptor) => {
const { query } = urlParse($interceptor.request.url)
expect(query).to.equal(`?token=true&redirect=${$location.href}`)
})
})
注意:在 v6 中route2更改为。intercept
TA贡献1820条经验 获得超9个赞
Gleb Bahmutov 在Deal with window.location.replace中有一种方法,它window.location
在源中重命名为window.__location
有效的存根。
它用于在加载页面到达浏览器之前cy.intercept()
修改加载页面,即在实例化并成为完全不可变/不可损坏的对象之前。window.location
it('replaces', () => {
cy.on('window:before:load', (win) => {
win.__location = { // set up the stub
replace: cy.stub().as('replace')
}
})
cy.intercept('GET', 'index.html', (req) => { // catch the page as it loads
req.continue(res => {
res.body = res.body.replaceAll(
'window.location.replace', 'window.__location.replace')
})
}).as('index')
cy.visit('index.html')
cy.wait('@index')
cy.contains('h1', 'First page')
cy.get('@replace').should('have.been.calledOnceWith', 'https://www.cypress.io')
})
这个存根replace,但同样应该适用于设置href器。
TA贡献1793条经验 获得超6个赞
这是我发现的唯一方法是检测成功的重定向客户端(如果是第三方网站)。JavaScript 有一个方便实用的函数,称为window.open(). 您可以用它做很多事情,包括重定向网页。_self这可以通过将目标设置为或 来完成_top。通过使用 while 循环,您可以尽快运行代码。这是我如何记录客户端重定向的草稿。
var redirectURL = 'https://www.example.com/',
redirectWindow = window.open(redirectURL, '_top'),
redirected = false,
count = 0;
while(true) {
if (redirectWindow.document.readyState === 'complete') {
redirected = true;
//Your code here. I am just logging that it is in the process of redirection.
console.log('redirecting')
break;
}
if (count > 2000) {
redirected = false;
break;
}
count++
}
if (redirected == false) {
console.log('Error: Redirect Failed');
}
添加回答
举报