我正在编写量角器脚本。 我的问题是,我无法将值存储到全局变量中。既不进入global.somevariable,也不进入browser.params.somevariable。
我有2个文件: 1. login.js 2. helper.js
从helper.js文件内部的匿名方法,我试图将值存储到全局变量中。我正在从是PageObject文件的js文件中调用与此helper.js相关的方法。
在config.js中,我声明了2个变量-一个带有global关键字。 第二个使用onPrepare()方法,因此我可以使用browser.params.someVar。但是,什么都没有。
在该方法内,可变项内部的值很好。但是,当我访问该helper.js之外的相同变量时,它们为null /不正确。
config.js
exports.config =
{
params:
{
tempVar:false
},
onPrepare:function()
{
global.result=false;
}
};
loginpage.js
var loginPage = function()
{
var un = element(by.id('un'));
var helper = new help();
helper.verifyElemExists(un);
console.log(global.result);//False,though promise returned true
console.log(browser.params.tempVar); // This is also false
if(global.result===true)
{
// Code will do something...
}
}
module.exports = login;
helper.js
var helper = function()
{
verifyElemExists = function(elem)
{
elem.isPresent().then(function(res)
{
browser.params.tempVar=res;
global.result =res;
});
}
module.exports = helper;
答案 0 :(得分:2)
您需要了解nodejs执行量角器脚本的过程。问题的根本原因来自以下代码段:
helper.verifyElemExists(un);
// when nodejs execute above line, all promises generated in this function
// will be added into a list (you can call the list as protractor control flow),
// after all sync script be executed, the protractor control flow start to execute
// the promise in the list one by one in the order as they are added into list.
console.log(global.result);
console.log(browser.params.tempVar);
if(global.result===true)
{
// Code will do something...
}
// when nodejs execute above lines, because all of them are sync script,
// the execution result of then return immediately, and at the time point they are executed,
// the promise of `helper.verifyElemExists(un);`
// have not start to execute(or not complete execute),
// thus the `global.result` and `browser.params.tempVar` are still with init value: false
从上述量角器脚本执行过程中,您可以看到当诺言和同步代码执行完成时,将为诺言代码创建诺言列表,但不会为同步代码创建诺言列表。然后执行列表中的Promise。
要解决您的问题,您可以将上面的同步代码包装成一个承诺,以便在helper.verifyElemExists(un);
helper.verifyElemExists(un);
// browser.getTitle() is a promise which be added into promise list after
// helper.verifyElemExists(un);
browser.getTitle().then(function(){
console.log(global.result);
console.log(browser.params.tempVar);
if(global.result===true)
{
// Code will do something...
}
})
// or change the `helper.verifyElemExists()` to return a promise
var helper = function()
{
verifyElemExists = function(elem)
{
return elem.isPresent().then(function(res)
{
browser.params.tempVar=res;
global.result =res;
});
}
module.exports = helper;
helper.verifyElemExists(un).then(function(){
console.log(global.result);
console.log(browser.params.tempVar);
if(global.result===true)
{
// Code will do something...
}
})