You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨域名场景下,如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:55:05