赛普拉斯:如何访问其他来源的网址?

时间:2020-05-27 22:26:48

标签: google-chrome automation chromium cypress

我是柏树的新手,遇到了一个问题。我已将基本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中运行)

有什么我想念的吗?

3 个答案:

答案 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 测试的解决方法。是的,这很可怕,但我希望你能原谅我的罪过。以下是四个简单的步骤:

  1. 鉴于每个 cy.visit() 只能有一个 it,请编写多个 it
  2. 是的,您的测试现在相互依赖。添加 cypress-fail-fast 以确保如果出现问题,您甚至不会尝试运行其他测试(您的整个 describe 现在只是一个单独的测试,在这个病态的替代现实中是有意义的)。
  3. 您很可能需要在 it 之间传递数据。请记住,我们已经走上了这条疯狂的“错误”道路,所以没有什么能阻止我们这些顽皮的人。只需使用 cy.writeFile() 保存您的状态(无论您需要什么),然后在下一个 cy.readFile() 开始时使用 it 恢复它。
  4. 起诉我。

此时我只关心我的系统是否有测试。如果 cypress 为多个域添加了适当的支持,那就太棒了!然后我将重构我的测试。在此之前,我将不得不忍受可怕的不可重试的测试。总比没有适当的 e2e 测试要好,对吧?对吗?