Режим отладки транспортира выдает "FATAL ERROR: CALL_AND_RETRY_LAST Распределение не выполнено - процесс исчерпал память"

Я запускаю сценарий для автоматизации входа на веб-страницу с использованием NodeJS 0.12.4, Protractor 2.1.0., Моя система - Win 8.1, i7 2,5 ГГц, 16 ГБ ОЗУ, поэтому я думаю, что вряд ли я исчерпал памяти! Просто к сведению, когда я комментирую все операторы в коде, НО browser.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);
 }
  };
К сожалению, я не могу опубликовать URL нашего веб-сайта, потому что он внутренний, если нужен HTML, я могу опубликовать некоторый фрагмент. Так что, если я попытаюсь запустить его, набрав

транспортир conf.js

без комментирования всех строк я получаю эту ошибку:

FATAL ERROR: CALL_AND_RETRY_LAST Распределение не выполнено - процесс исчерпал память

Но если я закомментирую все строки в spec.js, кроме browser.get(), и использую repl для перехода в интерактивный режим отладки и наберу каждую строку из кода одну за другой, как я уже говорил выше, я могу выполнить весь код до конца без ошибок. Я начал использовать Protractor и JavaScript 2 недели назад, поэтому я мог что-то упустить. Спасибо за любую помощь.

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. Всегда держите код чистым и оптимизированным. Лучше не объявлять ненужные переменные.

  2. getText возвращает обещание, поэтому вам нужно выполнить его.

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

это лучший способ справиться с этим.

  1. Лучше знать, когда использовать getText

getText вернет текстовое содержимое между открывающим и закрывающим тегами элемента. Поскольку userName является текстовым вводом, это самозакрывающийся тег, поэтому getText не сможет захватить содержимое.

Так что для самозакрывающихся тегов всегда используйте

 getAttribute('value') 

вместо getText.

  1. Ошибка "Недостаточно памяти" обычно возникает, если память, выделенная для выполнения, меньше требуемой памяти. Этот ответ поможет вам исправить это. Увеличить кучу памяти

--max-old-space-size=1024 увеличит память до 1ГБ--max-old-space-size=2048 увеличит память до 2ГБ--max-old-space-size=3072 увеличит память до 3ГБ--max-old-space-size=4096 увеличит память до 4Гб--max-old-space-size=5120 увеличит память до 5Гб--max-old-space-size=6144 увеличит память до 6ГБ--max-old-space-size=7168 увеличит память до 7ГБ--max-old-space-size=8192 увеличит память до 8 ГБ

Кроме того, лучше не использовать toContain для проверки userName, так как это критическое поле. Вы должны проверить, содержит ли оно точное имя пользователя. Таким образом, toEqual будет более подходящим, чем toBe, так как toEqual проверит на глубокое равенство.

Другие вопросы по тегам