Chrome 柏树:如何访问一个不同来源的网址?

2eafrhcq  于 2023-02-27  发布在  Go
关注(0)|答案(5)|浏览(165)

我是新来的柏树,遇到了一个问题。我有我的基本网址设置为域,我想测试的问题是,当我想测试登录我的基本网址网站的能力,我需要验证用户在另一个网站上,一旦我点击应用网站2号的页面在我的基本网址重新加载,然后我就可以测试网站的其余部分。
当我尝试通过测试访问站点2时,收到错误
cy. visit()失败,因为您正在尝试访问不同来源的URL。
新URL被视为不同的来源,因为URL的以下部分不同:
超域
在单个测试中,您只能cy. visit()同源URL。
我读了这个www.example.com,我试着在cypress.json中设置"chromeWebSecurity": false,但我仍然遇到同样的问题(我在chrome中运行)https://docs.cypress.io/guides/guides/web-security.html#Set-chromeWebSecurity-to-false I've tried setting "chromeWebSecurity": false in cypress.json but I still get the same issue (I'm running in chrome)
我是不是漏掉了什么?

8aqjt8rx

8aqjt8rx1#

作为一个临时但可靠的解决方案,我能够在Cypress Git的一个问题线程中找到这个脚本(我不记得我在哪里找到它,所以我不能链接回它)
将以下内容添加到cypress命令文件中

Cypress.Commands.add('forceVisit', url => {
    cy.window().then(win => {
        return win.open(url, '_self'); 
      });
});

在测试中你可以调用

cy.forceVisit("www.google.com")
s71maibg

s71maibg2#

从Cypress的9.6.0版本开始,您可以使用cy.origin
如果要使用它,必须先将“experimentalSessionAndOrigin”选项设置为true。

{
  "experimentalSessionAndOrigin": true
}

下面是如何使用它。

cy.origin('www.example.com', () => {
    cy.visit('/')
})

cy.origin更改baseurl,这样您就可以通过cy.visit('/')链接到另一个外部链接。

relj7zay

relj7zay3#

您可以存根从登录站点到基站点的重定向,并Assert所调用的URL。
基于Cypress的提示和技巧,这里有一个自定义命令来执行存根操作。
登录页面可能使用了几种方法中的一种来重定向,所以除了技巧中给出的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>)
})
rvpgvaaj

rvpgvaaj4#

你不能!
但是,* 也许 * 这将很快成为可能。见柏树票#944。
同时,你可以参考我在同一个线程中的轻松评论,我描述了我如何处理这个问题,而Cypress开发人员正在努力多域支持:
对于每个关注这篇文章的人,我都能感受到你们的痛苦! #944(评论)确实给了我们希望,所以在我们耐心等待的同时,这里有一个我今天用来编写多域e2e cypress测试的变通方法。是的,这很可怕,但我希望你们能原谅我的罪过。下面是四个简单的步骤:
1.假设每个it只能有一个cy.visit(),则写入多个it
1.是的,您的测试现在是相互依赖的。添加cypress-fail-fast以确保在某些测试失败时您甚至不会尝试运行其他测试(您的整个describe现在是单个测试,在这个病态的交替现实中它是有意义的)。
1.很有可能你需要在你的it之间传递数据。记住,我们已经在这个疯狂的"错误"的道路上了,所以没有什么能阻止我们这些顽皮的人。只要使用cy.writeFile()来保存你的状态(无论你可能需要什么),并使用cy.readFile()在你的下一个it开始时恢复它。
1.告我吧。
现在我所关心的是我的系统是否有测试。如果cypress增加了对多个域的支持,那就太好了!我将重构我的测试。在此之前,我将不得不忍受可怕的不可重试测试。总比没有合适的e2e测试好,对吗?对吗?

ny6fqffe

ny6fqffe5#

你可以手动设置window.location.href来触发页面加载,这对我很有效:

const url = 'http://localhost:8000';
cy.visit(url);

// second "visit"
cy.window().then(win => win.location.href = url);

您还需要将"chromeWebSecurity": false添加到cypress.json配置中。
注意:设置窗口导航不会告诉cypress等待页面加载,你需要自己等待页面加载,或者在get上使用timeout。

相关问题