我是柏树的新手,遇到了一个问题。我已将基本URL设置为要测试的域,问题是当我想测试在基本URL站点上登录的能力时,一旦单击站点编号2上的“应用”,我需要验证其他站点上的用户。重新加载基本网址上的页面后,我便可以测试网站的其余部分。
当我尝试通过测试访问站点2时,出现错误
cy.visit()失败,因为您尝试访问的URL属于 不同的来源。
新网址被认为是不同的来源,因为以下内容 网址的部分不同:
超域
在一个测试中,您只能cy.visit()相同URL。
我阅读了此https://docs.cypress.io/guides/guides/web-security.html#Set-chromeWebSecurity-to-false,我曾尝试在cypress.json中设置"chromeWebSecurity": false
,但仍然遇到相同的问题(我在chrome中运行)
有什么我想念的吗?
答案 0 :(得分:4)
作为一个临时但可靠的解决方法,我能够在 Cypress Git 问题线程之一中找到这个脚本(我不记得我在哪里找到它,所以我无法链接回它)
将以下内容添加到您的 cypress 命令文件中
Cypress.Commands.add('forceVisit', url => {
cy.window().then(win => {
return win.open(url, '_self');
});
});
在你的测试中你可以调用
cy.forceVisit("www.google.com")
答案 1 :(得分:4)
您可以存根从登录站点到基站点的重定向,并声明被调用的 URL。
基于 Cypress tips and tricks,这里是一个自定义命令来进行存根。
登录页面可能正在使用多种方法之一进行重定向,因此除了提示中给出的 replace(<new-url>)
存根之外,我还添加了 href = <new-url>
和 assign(<new-url>)
。
存根命令
Cypress.Commands.add('stubRedirect', () => {
cy.once('window:before:load', (win) => {
win.__location = { // set up the stub
replace: cy.stub().as('replace'),
assign: cy.stub().as('assign'),
href: null,
}
cy.stub(win.__location, 'href').set(cy.stub().as('href'))
})
cy.intercept('GET', '*.html', (req) => { // catch the page as it loads
req.continue(res => {
res.body = res.body
.replaceAll('window.location.replace', 'window.__location.replace')
.replaceAll('window.location.assign', 'window.__location.assign')
.replaceAll('window.location.href', 'window.__location.href')
})
}).as('index')
})
测试
it('checks that login page redirects to baseUrl', () => {
cy.stubRedirect()
cy.visit(<url-for-verifying-user>)
cy.wait('@index') // waiting for the window load
cy.('button').contains('Apply').click() // trigger the redirect
const alias = '@replace' // or '@assign' or '@href'
// depending on the method used to redirect
// if you don't know which, try each one
cy.get(alias)
.should('have.been.calledOnceWith', <base-url-expected-in-redirect>)
})
答案 2 :(得分:0)
你不能!
但是,也许很快就会实现。请参阅赛普拉斯门票 #944。
与此同时,您可以在同一线程中参考我的 lighthearted comment,其中我描述了在 Cypress 开发人员致力于多域支持时我如何处理该问题:
<块引用>对于所有关注此事的人,我感到您的痛苦! #944 (comment) 确实带来了希望,所以在我们耐心等待的同时,这里有一个我今天用来编写多域 e2e cypress 测试的解决方法。是的,这很可怕,但我希望你能原谅我的罪过。以下是四个简单的步骤:
cy.visit()
只能有一个 it
,请编写多个 it
。cypress-fail-fast
以确保如果出现问题,您甚至不会尝试运行其他测试(您的整个 describe
现在只是一个单独的测试,在这个病态的替代现实中是有意义的)。it
之间传递数据。请记住,我们已经走上了这条疯狂的“错误”道路,所以没有什么能阻止我们这些顽皮的人。只需使用 cy.writeFile()
保存您的状态(无论您需要什么),然后在下一个 cy.readFile()
开始时使用 it
恢复它。此时我只关心我的系统是否有测试。如果 cypress 为多个域添加了适当的支持,那就太棒了!然后我将重构我的测试。在此之前,我将不得不忍受可怕的不可重试的测试。总比没有适当的 e2e 测试要好,对吧?对吗?