跨域名场景下,如何在Cypress测试用例(it)间共享变量?
解决Cypress跨测试用例跨域名传递工单ID的问题
你遇到的核心问题是Cypress每个it测试用例会独立运行,默认清空所有内存状态;跨域名场景下,postMessage也无法在两个独立测试窗口间传递数据。以下是可行的解决方法:
方法一:使用Cypress全局环境变量存储
Cypress的Cypress.env()是全局持久化的,跨测试用例不会被清除,适合存储这类需跨用例传递的简单数据。
修改后的代码:
/// <reference types="cypress" /> describe("Testar abertura de protocolo no fale conosco", () => { it("Deve acessar o FaleConosco, abrir um protocolo e salvar o ID", () => { cy.visit(`${Cypress.env('FALE_CONOSCO_URL')}`) cy.get("#BotaoCriarNovoChamado").click() cy.get('#InputLabelCpfCnpj').type("99999999999") cy.get('#InputLabelEmail').type("email@email.com") cy.get('#InputLabelTelefone').type("99999999999") cy.get('#InputLabelAssunto').type("Assunto de teste") cy.get('#InputLabelDescricao').type("Essa aqui e uma descrição bem detalhada, confia") cy.get('#BotaoEnviar').click() cy.get('#spanNumeroDoChamado').should('contain', 'Número do chamado') cy.get('#divNumeroDoChamado').then($div => { const numero_do_chamado = $div.text().split(' ')[3].replace(/^#/, ""); // 存储到Cypress全局环境变量 Cypress.env('numero_do_chamado', numero_do_chamado); cy.log("Salvo número do chamado: " + numero_do_chamado); }); }); it("Deve acessar o Conecta e validar a abertura correta do protocolo", () => { // 读取全局环境变量中的工单ID const numero_do_chamado = Cypress.env('numero_do_chamado'); cy.visit(`${Cypress.env('URL')}`); cy.login(); // 直接使用存储的ID访问对应页面 cy.visit(`${Cypress.env('URL')}/ticket-container/${numero_do_chamado}`); // 可添加验证逻辑,比如检查工单是否存在 // cy.get('.ticket-details').should('contain', numero_do_chamado); }); })
方法二:使用文件存储(适合复杂场景)
如果需要在多个测试套件间共享数据,或担心环境变量冲突,可用cy.writeFile把ID写入本地文件,再用cy.readFile读取:
// 第一个测试用例中写入文件 cy.get('#divNumeroDoChamado').then($div => { const numero_do_chamado = $div.text().split(' ')[3].replace(/^#/, ""); cy.writeFile('cypress/fixtures/ticket-id.json', { id: numero_do_chamado }); }); // 第二个测试用例中读取文件 cy.readFile('cypress/fixtures/ticket-id.json').then(data => { const numero_do_chamado = data.id; cy.visit(`${Cypress.env('URL')}/ticket-container/${numero_do_chamado}`); });
为什么之前的方法失效?
- Alias/Closure:Cypress的alias仅在当前测试用例(
it)内有效,用例结束后会被销毁。 - Local Storage:每个域名的Local Storage是隔离的,跨域名无法共享;且Cypress默认会在每个用例前清除Local Storage。
- postMessage:两个测试用例的浏览器窗口是独立实例,无法通过
postMessage传递数据。
内容的提问来源于stack exchange,提问作者Jorge Miguel
相关产品推荐
相关产品推荐

