量角器调试模式给出“致命错误:CALL_AND_RETRY_LAST分配失败 - 处理内存不足”

时间:2015-05-29 18:42:56

标签: javascript node.js protractor browser-automation

我正在运行一个脚本,使用NodeJS 0.12.4,Protractor 2.1.0自动登录网页,我的系统是Win 8.1,i7 2.5 GHz,16 GB RAM,所以我认为不太可能我的内存耗尽了! 仅供参考,当我评论代码中的所有语句但浏览器.get(),并且我在开始时使用browser.pause()以交互模式逐个执行它们时,代码可以正常工作。 这是spec.js文件的代码:

 describe('Web Page Login', function() {
  it('should login', function() {
    browser.get('http://URL_HERE'); // opens page
      
    //browser.pause();
      
    element(by.css('[ng-click="showLogin(true);"]')).click();// clicks the login link to open the login dialog
      
      
    var user = element(by.model('user.login.username'));// input user name
    user.sendKeys('user');
                       
    var pass = element(by.model('user.login.password')); // input password                
    pass.sendKeys('pass');

    element(by.css('[ng-click="login();"]')).click();// clicks the login button
      
    var userName = element(by.className('ng-binding'));// locates the logged in user from the player details element and store it in "userName"
    userName.getText();  //extracts the text that contains the user name
   
    expect(userName).toBe("user"); //compare the string obtained above with the one expected 

  });
});

这是conf.js文件的代码:

var HtmlReporter = require('protractor-html-screenshot-reporter');

var reporter=new HtmlReporter({
    baseDirectory: './results', // the location to store the screen shots and results.
    docTitle: 'Login test result',
    docName:  'login-tests-report.html'
});


exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['login-spec.js'],
  onPrepare: function() {
        jasmine.getEnv().addReporter(reporter);
	}
  };
不幸的是我无法发布我们网站的网址,因为它是内部的,如果需要HTML,我可以发布一些代码片段。 因此,如果我尝试运行它,请输入

  

量角器conf.js

没有评论所有行我收到此错误:

  

致命错误:CALL_AND_RETRY_LAST分配失败 - 处理内存不足

但是如果我评论除了browser.get()之外的spec.js中的所有行,并且我使用repl进入调试交互模式并且我按照上面的说明逐一从代码中键入每一行,我可以执行所有代码到最后没有错误。 我2周前开始使用Protractor和JavaScript,所以我可能会错过一些东西。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

我想知道如何让代码工作,而不是触发那个错误,我怀疑它可能来自Node库,在我和我的一个开发人员讨论之后。 改变执行断言的方式消除了错误。 以下是有效的代码:



describe('Web Page Login', function() {
  it('should login', function() {
    browser.get('http://URL_HERE');//opens Web page
      
    element(by.css('[ng-click="showLogin(true);"]')).click();//clicks the login link to open the login dialog     
 
    element(by.model('login.user.login.username')).sendKeys('username');//input user name          
    element(by.model('login.user.login.password')).sendKeys('password');//input password 
    element(by.css('[ng-click="login.login(false, loginForm.$valid);"]')).click(); //clicks the login button
    
    var userName = element(by.className('ng-binding'));// locates the logged in user from the player details element and store it in "userName"
    expect(userName.getText()).toContain('username');//compares the string found with the one expected and asserts if it's true or false
  });
});



 如果我找到根本原因,我会在这里发布。

答案 1 :(得分:1)

希望这些事实会有所帮助。

  1. 始终保持代码的清洁和优化。最好不要声明不必要的变量。

  2. getText返回一个承诺,因此您需要解决它。

      element(by.className('ng-binding')).getText().then(function (text) {
       expect(text).toContain('username');
    });  

是处理它的最佳方法。

  1. 更好地了解何时使用getText

getText将返回元素的开始和结束标记之间的文本内容。 由于userName是文本输入,因此它是一个自闭标签,因此getText将无法捕获内容。

因此,对于自关闭标签,请始终使用

  getAttribute('value')  

代替getText。

  1. 如果分配给执行的内存小于所需的内存,通常会发生“内存不足”错误。该答案将指导您修复它。 Increase the heap memory

--max-old-space-size=1024会将内存增加到1GB --max-old-space-size=2048会将内存增加到2GB --max-old-space-size=3072会将内存增加到3GB --max-old-space-size=4096会将内存增加到4GB --max-old-space-size=5120会将内存增加到5GB --max-old-space-size=6144会将内存增加到6GB --max-old-space-size=7168会将内存增加到7GB --max-old-space-size=8192会将内存增加到8GB

此外,最好不要使用toContain来检查userName,因为它是关键字段。您应该检查它是否包含确切的用户名。因此toToqual比toBe更适合,因为toEqual将检查深度平等。