如何从 Cypress 环境变量中获取一组 URL,然后遍历它们并 运行 分别对每个 URL 进行测试?

How can I get an array of URLs from the Cypress environment variable and then loop over them and run the tests for each one individually?

在我的 cypress.json 文件中有以下内容

{
    "env":{
        "urls":["https://somedomain/index.html","https://someotherdomain/index.html"]
    }
}

然后在我的 spec.js 文件中

describe('Test', () => { 
    Cypress.env('urls').forEach(url => {
        before(() => {
            cy.visit(url) 
        })
        describe(`Current file: ${url}`, () => {
            it('Contains Header Element', () => {
                cy.get('header')
            })
        
            it('Contains Main Element', () => {
                cy.get('main')      
            })
        })
    })
})

我想要发生的是从 env.urls 获取第一个 url 并针对它运行所有测试,然后获取第二个 url 并针对它运行所有测试.相反,它首先访问 urls(这确实有意义,因为它在 before 块中)然后 运行 之后的测试。构建这个的正确方法是什么?

顺便说一句,最初我试图将 env.urls 数组放入一个 .json 文件中并使用 cy.readFile() 检索它,然后循环遍历内容,但我不能'完全不知道如何使它工作,因为它希望 cy.readFile() 在测试中。

before 块需要在 describe 块内。休息一切看起来都很好。

Cypress.env('urls').forEach((url) => {
  describe(`Test for ${url}`, () => {
    before(() => {
      cy.visit(url)
    })

    it('Contains Header Element', () => {
      cy.get('header')
    })

    it('Contains Main Element', () => {
      cy.get('main')
    })
  })
})

要读取 URL 或测试之外的任何数据,请使用 require()

为了解释这个问题,赛普拉斯将连续的 before() 个挂钩合并到同一个块中,但在它们之间引入上下文块阻止了它。

const urls = require('../fixtures/urls.json')  // alternative to cy.readFile()
                                               // data is read at test loading time
                                               // instead of during the test

describe('Test', () => { 
  
  urls.forEach(url => {

    describe(`Current file: ${url}`, () => {   // multiple blocks define here
                                               // one for each url
      before(() => {
        cy.visit(url) 
      })

      it('Contains Header Element', () => {
        ...
      })
      
      it('Contains Main Element', () => {
        ...
      })
    })
  })
})