无法将值从匿名函数存储到全局变量中-Javascript和量角器

时间:2019-01-06 14:51:43

标签: javascript jasmine protractor

我正在编写量角器脚本。 我的问题是,我无法将值存储到全局变量中。既不进入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;  

1 个答案:

答案 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...
    }   
})