【问题标题】:How does Cypress.io read the Windows environment variables?Cypress.io 如何读取 Windows 环境变量?
【发布时间】:2018-09-20 01:36:19
【问题描述】:

我在“Cypress.env.json”文件中设置了我的环境变量,在运行 cypress 测试时,它成功读取了 Cypress.env 变量。但为了更多地关注安全方面,而不是“硬编码”这些值,我的团队要求我将此变量保留为从 Windows 10 环境变量中读取的单独“参数”。我该如何做到这一点?如果有人可以就此提出建议,那将非常有帮助。

{
"QA_Server": "https://sometestingsite.com",
"username": "testQA",
"password": "Password1234!"
}

【问题讨论】:

    标签: javascript cypress


    【解决方案1】:

    来自赛普拉斯文档here

    您计算机上以CYPRESS_cypress_ 开头的任何环境变量都将自动添加并可供您使用。

    冲突的值将覆盖 cypress.jsoncypress.env.json 文件中的值。

    赛普拉斯在添加环境变量时会去掉CYPRESS_

    从命令行导出 cypress env 变量:

    export CYPRESS_HOST=laura.dev.local
    
    export cypress_api_server=http://localhost:8888/api/v1/
    

    如果您使用的是 Windows,则可以使用 setsetx 命令设置环境变量。

    在你的测试文件中你可以这样称呼:

    Cypress.env()             // {HOST: "laura.dev.local", api_server: "http://localhost:8888/api/v1"}
    Cypress.env("HOST")       // "laura.dev.local"
    Cypress.env("api_server") // "http://localhost:8888/api/v1/"
    

    【讨论】:

    • 为什么我们需要从命令行导出 cypress env 值?对不起,我没听懂!
    • @soccerway 你不需要,我只是添加了一个例子。
    • 文档中给出了这个导出示例,但您能否解释一下 export 如何与 命令行 一起工作?在 Windows 上,这是一个未知命令。
    • 是的,我看了这些,正要问,想知道如何从Windows命令行设置环境变量,以便我们可以在Cypress中使用
    • @DiogoRocha:我已经在 Windows 中设置了环境变量 ...set CYPRESS_username=cypressset CYPRESS_password=somepassword..然后在我的 cypress 测试中,我创建了两个像这样的常量 const user = Cypress.env('CYPRESS_username'); const psw = Cypress.env('CYPRESS_password') 。 ...但是系统抛出未定义...我也尝试过这种方式..const user = Cypress.env('username')..在这两种情况下它都会抛出未定义的错误
    【解决方案2】:

    您可以直接从 windows 环境变量中读取它。 为此,请使用带有 echo 的 cy.exec。如果您在 CMD 'echo %appdata%' 中运行,它将打印路径。我将 cy.exec 包装为

    cy.runExec = (js) => {
      cy.log(`--- runnnig node ${js}`);
      cy.exec(js, { failOnNonZeroExit: false }).then((z) => {
        if (z.stderr != undefined) {
          cy.log(`--- stderr`);
          let lines = z.stderr.split("\n");
          for (let n in lines) cy.log(`--- ${n}: ${lines[n]}`);
        }
        if (z.stdout != undefined) {
          cy.log(`--- stdout`);
          let lines = z.stdout.split("\n");
          for (let n in lines) cy.log(`--- ${n}: ${lines[n]}`);
        }      
      });
    };
    

    如果您将其称为cy.runExec('echo %appdata%'),它将在 cypress 输出中打印相同的路径,您可以修改此方法以仅获取 stdout。您还可以使用 cy.wrap(...).as(...) 保存该值并稍后获取。

    这是直接调用:

    cy.getWinEnv = (s) => {
      cy.exec(`echo %${s}%`, { failOnNonZeroExit: false }).then((z) => {
        let out = z.stdout != undefined ? z.stdout : "undefined";
        cy.wrap(out).as(s);
        //do not: return out;
      });
    };
    

    用法:

    //read %appdata%
    cy.getWinEnv("appdata");
    
    //log %appdata% in cypress
    cy.get("@appdata").then((x) => cy.log(`--- ${x}`));
    

    还有一个更新——如果你添加了 'cypress-promise' 包,那么就可以直接使用 async/await 调用...

    cy.getWinEnvEx = async (s) => {
      var out = "undefined yet";
      await cy.exec(`echo %${s}%`, { failOnNonZeroExit: false }).then((z) => {
        if (z == null) {
          cy.log("--- output is null");
        } else {      
          out = z.stdout != undefined ? z.stdout : "undefined";
          //cy.log(`--- z.stdout ${out}`);
        }
      });
      return out;
    };
    
    ...
    
    it("list windows variables", async () => {
      let z = await cy.getWinEnvEx("USERPROFILE");
      cy.log(`--- USERPROFILE ${z}`);
    });
    

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 2012-05-16
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 2012-08-11
      • 2018-07-01
      • 2017-09-04
      • 2019-07-27
      相关资源
      最近更新 更多