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

如何在Protractor中设置全局变量?新手求助

嘿,刚接触Protractor遇到这个问题很正常,我给你分享几个实用的方法,按需选就行:

方法1:直接用browser.executeScript()设置(最灵活)

这是最直接的方式,通过Protractor提供的executeScript方法,在浏览器的上下文里直接执行JS代码,给window对象添加全局变量。

比如在你的测试用例里可以这么写:

// 单个测试用例中设置
it('should set global window variable', async () => {
  // 执行脚本设置变量
  await browser.executeScript(() => {
    window.settest = true;
  });

  // 可选:验证变量是否设置成功
  const isSet = await browser.executeScript(() => {
    return window.settest;
  });
  expect(isSet).toBe(true);
});

这种方式适合在特定测试用例或者某个测试步骤前临时设置,灵活度拉满。

方法2:在配置文件的onPrepare钩子中全局配置

如果你希望所有测试用例都能用上这个全局变量,不用每个用例重复写,可以在Protractor的配置文件(一般是protractor.conf.js)里的onPrepare函数中设置——这个钩子会在所有测试启动前、浏览器初始化完成后执行。

示例代码:

// protractor.conf.js
exports.config = {
  // 你的其他配置(比如seleniumAddress、specs等)
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['*.spec.js'],
  
  onPrepare: async function() {
    // 全局设置window.settest
    await browser.executeScript(() => {
      window.settest = true;
    });
  }
};

这样一来,所有测试用例运行时,浏览器的window对象里都会有settest: true这个全局变量。

方法3:用browser.addMockModule注入模块(Angular应用更推荐)

如果你的测试对象是Angular应用,更规范的方式是通过注入mock模块来设置全局变量,这种方式更贴合Angular的运行逻辑,也方便后续扩展更多全局配置。

示例:

// 可以放在onPrepare里,或者单个测试用例的beforeEach中
browser.addMockModule('testGlobalVars', () => {
  angular.module('testGlobalVars', [])
    .run(() => {
      // 在Angular启动时设置全局变量
      window.settest = true;
    });
});

这个方法会把我们定义的mock模块注入到Angular应用中,在Angular初始化的run阶段完成全局变量的设置,比直接操作window更稳妥。

小提醒

  • 记得用async/await或者Promise的then方法处理异步操作,因为Protractor的API大多是异步的,直接同步写可能会导致变量还没设置好就执行后续测试步骤。
  • 如果测试的是非Angular应用,要在配置里加上useAllAngular2AppRoots: false(新版本)或者browser.ignoreSynchronization = true(旧版本),避免Protractor一直等待Angular稳定。

内容的提问来源于stack exchange,提问作者asl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:39:29