如何在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
相关产品推荐
相关产品推荐

